特性分析 | GreenPlum Primary/Mirror 同步机制

本文首发于 2016-01-21 20:02:26

引言

PostgreSQL 主备同步机制是通过流复制实现,其原理见 PG主备流复制机制

Greenplum 是基于 PostgreSQL 开发的,它的主备也是通过流复制实现,但是 Segment 节点中的 Primary 和 Mirror 之间的数据同步是基于文件级别的同步实现的

为什么Primary和Mirror不能再使用流复制实现呢?

主要有两个原因:

  1. Append Only 表不写 WAL 日志,所以 Append Only 表的数据就不能通过 XLOG 发送到 Mirror 再 Apply 。
  2. pg_control等文件也是不写 WAL 日志,也只能通过文件方式同步到 Mirror 。

GreenPlum 总体结构

Greenplum 的架构采用了 MPP 无共享体系。在 MPP 系统中,每个数据节点有自己的CPU、磁盘和内存(Share nothing),每个节点内的 CPU 不能访问另一个节点的内存。节点之间的信息交互是通过节点互联网络实现的,这个过程一般称为数据重分配(Data Redistribution)。

Master 负责协调整个集群 ,一个数据节点可以配置多个节点实例(Segment Instances),节点实例并行处理查询(SQL)。

image.png

Primary和Mirror同步机制

Primary 和 Mirror 同步的内容主要有两部分,即文件数据。之所以 Primary 和 Mirror 要同步文件,是 Primary 和 Mirror 之间可以自动 failover,只有两者保持同步才能相互替代。如果只把数据同步过去,pg_control、pg_clog、pg_subtrans 没有同步,那么从 Primary 切换到 Mirror 会出现问题。

Master 和 slave 却不用担心这些问题,Append Only 表的数据只会存在 Segment,所以 WAL 日志足够保持 Master 和 slave 同步(只要是流复制,pg_control、pg_clog、pg_subtrans 这些文件Slave会自动更新,无需从 Master 同步)。

1. 数据同步

当 Master 向 Primary 下发执行计划后,Primary 开始执行,如果是 DML 操作,那么 Primary 会产生 XLOG 及更新 page。会在 SlruPhysicalWritePage 函数中(写数据页)产生FileRepOperationOpen、FileRepOperationWrite、FileRepOperationFlush、FileRepOperationClose等指令消息(消息中包含具体要更新的文件page及内容),通过 primary sender 进程向 Mirror 发送 Message,然后 Mirror 的 mirror consumer 等进程解析消息,执行变更。XLOG 通过XLogWrite函数(写XLOG)执行同样的操作,把 XLOG 更新同步过去。

2. 文件同步

Primary 会有个 recovery 进程,这个进程会循环把 Primary 的 pg_control、pg_clog、pg_subtrans 等文件覆盖到 Mirror。同时检查 XLOG 是否一致,如果不一致以 Primary 为主,对 Mirror 进行覆盖。除了把 Primary 部分文件同步到 Mirror 之外,recovery 进程还会将 Mirror 上面的临时文件删掉。

image.png

总结

Primary 和 Mirror 同步数据的时候,Primary 对于每一次写 page 都会通过消息发送到 Mirror,如果 Primary 大量的更新 page,那么 Primary 和 Mirror 同步将有可能成为瓶颈。

本文转自:http://mysql.taobao.org/month...

欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

欢迎关注公众号数据库内核

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/...
思否(SegmentFault)https://segmentfault.com/u/db...
掘金https://juejin.im/user/5e9d3e...
CSDNhttps://blog.csdn.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel

目前从事云数据库MySQL数据库内核研发工作,曾做过Postgres-XC、Greenplum等分布式数据库的内核开发。热...

30 声望
7 粉丝
0 条评论
推荐阅读
推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
最近几年基于 PostgreSQL 开发的国产数据库如雨后春笋般涌现,而受限于 MySQL 的 GPL Licence(感兴趣的可移步我的博文《技术分享 | 如何为你的代码选择一个合适的开源协议?》),二次开发必须开源,这导致基于 ...

dbkernel阅读 660

封面图
PostgreSQL 插入时间与更新时间(qbit)
PostgreSQL 在数据库层面不能像 MySQL 一样设置自动创建 create_time/update_time,自动更新 update_time

qbit1阅读 522

开务数据库delete流程解读
delete主要分为两个部分,一个部分为scan过程,拉取表中的数据,第二部分,根据过滤条件,调用b.Del()函数删除对应的数据。相关逻辑计划对象图为:

KaiwuDB阅读 933

封面图
postgresql相关链接
libpqprotocol 1protocol 1beginstart transactionsetresetset transactionruntime configurationalter systemprepareprepare-transactionsavepointruntime-configconfiguration cheatsheethot-standbypg_regress...

黑暗森林阅读 774

【Postgresql】索引类型(btree、hash、GIST、GIN)
Postgresql 存在许多特定的索引查询类型,和大部分的Btree为基础架构的关系型数据库一样,在创建索引缺省的时候会把btree作为默认值。

Xander阅读 738

近期Psql相关业务的收获:agg函数对于null值的处理/ array_agg()/ Unmarshal的性能消耗和工作原理
【case 1】项目背景:需要返回一些GC的统计数据。相关数据存在frame这张表内,表中的数据一行就是一帧的数据,可以理解为记录了这一帧内的性能信息。与需求相关的col是GcChartSample,是一个json类型的数据,里面...

灰灰阅读 653

greenplum 安装 -6- 初始化数据库
主要通过gpinitsystem工具实现,需要实现做好集群配置gpinitsystem_config。主要为指定master、segment节点、segment节点上的segment数量、数据库端口号等信息。gpinitsystem也会对之前配置的一些系统设置进行检...

黑暗森林阅读 644

目前从事云数据库MySQL数据库内核研发工作,曾做过Postgres-XC、Greenplum等分布式数据库的内核开发。热...

30 声望
7 粉丝
宣传栏