了解更多Greenplum相关内容,欢迎访问Greenplum中文社区网站
新年假期后的第一周来啦!不知大家都是如何度过新年的呢?
在之前的文章 《不惧宕机,数据库高可用理论与实践》 中,为大家介绍了数据库系统的高可用理论知识,以及Greenplum是如何实现高可用,为企业的数据保驾护航的。
今天我们将在上篇文章的基础上,补充介绍Greenplum事务一致性的几个重点,它们也是Greenplum可以高可用的重要前提和保证。 本文将就分布式事务日志在时间线上的顺序,以及事务的提交和可见在代码层面的细节逐一分析讲解。
分布式事务日志
我们以 CREATE TABLE t1(i int); 为例介绍关键事务日志的时间线。随后讲解事务在各个阶段发生故障时,Greenplum怎样保证数据的一致性。
-
QD/QE进程更新数据库对象,插入表格。
-
QD进程通知segments执行PREPARE TRANSACTION,并等待所有primary节点上的QE返回成功。
-
primary上的QE在本地执行完PREPARE TRANSACTION后,将WAL刷盘,并唤醒walsender进程,并将WAL同步到mirror本地。primary上的QE成功地将WAL同步后,返回结果给QD,至此该primary准备就绪。
-
所有的segments准备就绪后,QD在本地写入DISTRIBUTED_COMMIT日志并刷盘,然后唤醒walsender进程,并等待将日志同步至standby。
-
QD进程发起两阶段提交的COMMIT PREPARED。
-
primary上的QE进程执行COMMIT PREPARED。QE在本地写入COMMIT_PREPARED日志并刷盘,唤醒walsender进程后,等待将日志同步至mirror。
-
primary上的QE进程等待日志成功同步至mirror后,将结果返回给QD。