PolarDB PostgreSQL版(以下简称 PolarDB-PG)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容 PostgreSQL 与 Oracle。PolarDB-PG 的存储与计算能力均可横向扩展,具有高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB-PG 具有大规模并行计算能力,可以应对 OLTP 与 OLAP 混合负载;还具有时空、向量、搜索、图谱等多模创新特性,可以满足企业对数据处理日新月异的新需求。
概述
在共享存储一写多读的架构下,数据文件实际上只有一份。得益于多版本机制,不同节点的读写实际上并不会冲突。但是有一些数据操作不具有多版本机制,其中比较有代表性的就是文件操作。
多版本机制仅限于文件内的元组,但不包括文件本身。对文件进行创建、删除等操作实际上会对全集群立即可见,这会导致 RO 在读取文件时出现文件消失的情况,因此需要做一些同步操作,来防止此类情况。
对文件进行操作通常使用 DDL,因此对于 DDL 操作,PolarDB-PG 提供了一种同步机制,来防止并发的文件操作的出现。除了同步机制外,DDL 的其他逻辑和单机执行逻辑并无区别。
术语
- LSN:Log Sequence Number,日志序列号。是 WAL 日志的唯一标识。LSN 在全局是递增的。
- 回放位点:Apply LSN,表示只读节点的回放位点。
同步 DDL 机制
DDL 锁
同步 DDL 机制利用 AccessExclusiveLock(后文简称 DDL 锁)来进行 RW / RO 的 DDL 操作同步。
![]() ![]() |
---|
图 1:DDL 锁和 WAL 日志的关系 |
DDL 锁是数据库中最高级的表锁,对其他所有的锁级别都互斥,会伴随着 WAL 日志同步到 RO 节点上,并且可以获取到该锁在 WAL 日志的写入位点。当 RO 回放超过 Lock LSN 位点时,就可以认为在 RO 中已经获取了这把锁。DDL 锁会伴随着事务的结束而释放。
如图 1 所示,当回放到 ApplyLSN1 时,表示未获取到 DDL 锁;当回放到 ApplyLSN2 时,表示获取到了该锁;当回放到 ApplyLSN3 时,已经释放了 DDL 锁。
![]() ![]() |
---|
图 2:DDL 锁的获取条件 |
当所有 RO 都回放超过了 Lock LSN 这个位点时(如图 2 所示),可以认为 RW 的事务在集群级别获取到了这把锁。获取到这把锁就意味着 RW / RO 中没有其他的会话能够访问这张表,此时 RW 就可以对这张表做各种文件相关的操作。
说明:Standby 有独立的文件存储,获取锁时不会出现上述情况。
![]() ![]() |
---|
图 3:同步 DDL 流程图 |
图 3 所示流程说明如下:
- RO 会话执行查询语句
- RW 会话执行 DDL,在本地获取 DDL 锁并且写到 WAL 日志中,等待所有 RO 回放到该 WAL 日志
- RO 的回放进程尝试获取该锁,获取成功后将回放位点返回给 RW
- RW 获知所有 RO 均获取到该锁
- RO 开始进行 DDL 操作