Mr Dk.

Results 155 comments of Mr Dk.

## 4.1 Locks in Greenplum GP 中三种类型的锁: - 自旋锁 (SpinLock) - 轻量锁 (LWLock) - 对象锁 (Object Lock) 其中自旋锁和轻量锁用于在读写共享内存时保护临界区内的数据,且遵循特定的锁获取规则 (比如按相同顺序获取锁),因此不会发生死锁。对象锁直接影响并发操作数据库对象,并且有可能发生死锁。 - 关系 - 元组 - 事务 GP 采用两阶段锁定 (2PL, two-phase locking):第一阶段获得锁,第二阶段释放锁。并继承了...

## 4.2 Global Deadlock Issue 在分布式系统中,`INSERT` / `DELETE` / `UPDATE` 三条 DML 的锁定行为: 1. 解析分析阶段,事务对目标关系加锁 2. 执行阶段,事务使用事务锁对元组加锁 在单机 PG 中,第一阶段的加锁通常使用 `RowExclusive`,因此多个事务可以并发操作同一个元组,除非两个事务 **写** 同一个元组,此时两个事务将会串行化等待。锁信息保存在实例的共享内存中,如果死锁发生,可以直接扫描共享内存中的锁信息,检测并打破死锁。 ![image](https://user-images.githubusercontent.com/32560442/121161524-aa63c880-c87f-11eb-9821-b549c7068eba.png) 在 GP 的分布式架构中,上述方法无法处理跨实例的全局死锁。在 GP 5 及更早版本之前,上述第一阶段加锁的...

## 4.3 Global Deadlock Detection Algorithm GP 6 引入了 GDD 算法。工作过程: 1. GP 在 master 上启动一个守护进程 2. 守护进程周期性向每个 segment 采集信息,构造 wait-for graph 3. 守护进程检查是否存在全局死锁 4. 如果存在全局死锁,终结最年轻的事务 该算法被要求既正确又完全。GDD 守护进程采集每个 segment 的本地...

# 3 GreenPlum's MPP Architecture GP 采用 *大规模并行处理 (Massiely Parallel Processing)* 架构,面向 *HTAP (Hybrid Transactional and Analytical Processing)* 场景设计。其架构设计解决了单机数据库的以下局限: - 数据扩展性:数据总量太大,无法在单机上存放 - 计算扩展性:并行能力受单机计算资源限制 - 高可用:单机挂掉则整个数据库系统挂

## 3.1 Roles and Responsibility of Segments GP 集群包含跨多个域的多个 segment。只有一个 segment 被称为 coordinator segment,其它就只是普通的 segment。Coordinator 接收查询并产生分布式计划,并分发到多个进程上执行,然后收集结果并返回;segments 作为实际保存用户表数据的地方。为了保证高可用,一些 segment 被配置为 standby,即 coordinator 的镜像:不直接参与计算,而是不断接收并重放 WAL。 GP 采用 *share-nothing* 架构,coordinator 和 segment 有着自己的内存及数据目录。节点之间使用网络通信。...

## 3.2 Distributed Plan and Distributed Executor 对于分布式的表,每个 segment 只存储表中一部分的数据。当对两个表进行 join 时,通常需要检查两个来自不同 segment 的元组是否满足 join 条件。这意味着 GP 需要在 segment 之间移动数据,保证满足 join 条件的元组在一个 segment 上。GP 提出 **Motion** 计划节点来实现数据移动。 Motion 节点使用网络在不同 segment...

## 3.3 Distributed Transaction Management GP 集群中的每一个节点都运行着一个加强版的 PG,一个事务的提交或中止需要在所有节点上保持同步。GP 使用 *分布式快照* 和*两阶段提交* 协议。

## 3.4 Hybrid Storage and Optimizer GP 支持 PostgreSQL 原生的面向行的 heap table,另外还支持: - 面向 append 优化的行存储 - 面向 append 优化的列存储 AO (Append Optimized) 表支持使用不同算法进行压缩。GP 的执行引擎可以在同一个查询中 join 上述三种存储类型的表。

关于 HTAP 的定义:2014 年 Gartner 提出能够并发执行 OLTP 和 OLAP 负载,而不需要 ETL (Extract-Transfrom-Load) 的就可以被称为 HTAP。2018 年,Gartner 扩展了 *In-Process HTAP* 的概念:能够把 OLTP 和 OLAP 交织在一起的架构也可以被称为 HTAP。这种新的定义意味着 HTAP 不再需要局限于一些仅存在于内存中的技术。

## 架构设计分类 ![image](https://github.com/mrdrivingduck/paper-outline/assets/32560442/912a59f6-c9de-4a58-b3a6-69ebfeca531b) - 行存为主,内存列存:所有数据持久化为行存,数据更新被 append 到增量存储中,归并到列存里;由于所有工作都在内存中完成,所以具有高吞吐率;典型:Oracle、SQL Server - 分布式行存 + 列存副本:主存储为行存,部分 slave 被选为列存;事务查询只发生在行存节点上,提交后的事务异步复制到列存节点上;工作负载隔离性佳,数据新鲜度低;典型:TiDB - 磁盘行存 + 独立列存:使用一个完全独立的内存列存节点,只保留行存 TP 的热数据;典型:MySQL Heatwave - 列存为主 + 行存增量表:数据更新被 append 到行存增量表中,逐步归并到列存;AP 性能佳,TP 扩展性差;典型:SAP HANA