点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!
greenplum是基于postgreSQL进行开发的,主备是通过流复制实现,但segment节点的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同步)。当master向primary下发执行计划后,primary开始执行,如果是dml操作,那么primary会产生XLOG及更新page。会在SlruPhysicalWritePage函数中(写数据页)产生FileRepOperationOpen、FileRepOperationWrite、FileRepOperationFlush、FileRepOperationClose等指令消息(消息中包含具体要更新的文件page及内容),通过primary sender进程向mirror发送message,然后mirror的mirror consumer等进程解析消息,执行变更。xlog通过XLogWrite函数(写xlog)执行同样的操作,把xlog更新同步过去。primary的recovery进程会循环把primary的 pg_control、pg_clog、pg_subtrans 等文件覆盖到mirror。同时检查xlog是否一致,如果不一致以primary为主,对mirror进行覆盖。除把primary部分文件同步到mirror之外recovery进程还会将mirror上面的临时文件删掉。
1. 到对应mirror下模拟mirror损坏的情况修改mirror下16872.1这个数据块,可以看到md5sum校验值已经不同。同理修改primary下16872.1这个数据块,会发现查询报错。gpstate -c | grep seg0查找实例对应的primary主机和mirror主机。md5sum home/gpadmin/gpdata/gpdatam1/gpseg0/base/16412/16872.1
md5sum /home/gpadmin/gpdata/gpdatap1/gpseg0/base/16412/16872.1
scp /home/gpadmin/gpdata/gpdatam1/gpseg0/base/16412/16872.1
192.168.**.***:/home/gpadmin/gpdata/gpdatap1/gpseg0/base/16412/16872.1
