checksum增量数据同步
checksum增量数据同步说明¶
什么是基于checksum的数据增量同步¶
通过对比primary与mirror节点上数据文件不同块(block)的checksum值,来决定是否需要同步数据
-
数据块(block)的checksum值相同,不同步
-
数据块(block)的checkusm值不同,同步到mirror节点
为什么引入checksum增量同步¶
在SeaboxMPP的高可用集群环境中,如果mirror节点坏掉,为了确保在mirror节点恢复后数据不丢失并能够保证一致性,primary节点会持续保留WAL数据;如果mirror节点由于网络原因或者机器故障等长时间无法修复,导致primary节点会保留大量WAL日志,进而占用大量磁盘空间.
实现checksum增量同步后,有以下优点:
-
在mirror节点异常的情况下primary节点不必持续保留WAL日志,节省了磁盘空间
-
通过对比两端数据文件不同块(block)的checksum值来决定是否需要同步,同样能够使主备节点达到一致性状态
-
在某些场景下(如:文件数相同,增量数据比较大的情况下),基于checksum的增量同步性能可能要优于原始的增量数据同步
实现原理¶
-
checksum存取
-
存储
-
要生成checksum需要打开"data_checksums"开关,集群MPP环境默认是打开的
-
数据块的checksum是存储在page的头部(PageHeader->pd_checksum)里, 默认情况下要读取checksum值需要解析数据文件的每个page,IO开销会非常大
-
为了提高checksum读取效率,减少IO开销,引入了bcs文件(block checksum),只存储数据block的checksum信息
-rw------- 1 seabox seabox 32768 Aug 3 10:40 6317 -rw------- 1 seabox seabox 32768 Aug 3 10:40 6317_bcs -rw------- 1 seabox seabox 32768 Aug 3 10:40 6318 -rw------- 1 seabox seabox 32768 Aug 3 10:40 6318_bcs -rw------- 1 seabox seabox 32768 Aug 3 10:40 7056 -rw------- 1 seabox seabox 32768 Aug 3 10:40 7056_bcs
-
-
读取
- 直接从bcs文件中获取每个block的checksum信息
-
遍历数据文件
通过遍历数据文件来确定哪些文件或文件的哪些块需要做同步,规则如下
-
source > target : COPY_TAIL
-
source < target : TRUNCATE
-
target不存在该文件: 全COPY 到target
-
source不存在该文件: 删除target文件
-
相同部分:根据checksum判断是否同步,读取bcs文件里的checksum信息,对比源与目标两端的不同block的checksum是否相同,不同的话记录对应块信息
-
数据传输
-
根据记录的块信息,将源端对应的数据块同步到目标端
使用方式&使用限制¶
- 在mirror节点调用sd_rewind命令,如下:
SDOPTIONS="-c sd_role=utility" $SDHOME/bin/sd_rewind --checksum --write-recovery-conf --slot="internal_wal_replication_slot_8" --source-server="host=cf-node9 port=15702 dbname=template1 application_name=__sd_rewind__" --target-sddata=/home/seabox/seabox-data-directory/executordd/mirror/0/2 --target-sc-dbid=8
上面命令中使用的参数含义及说明为:
- checksum
- 代表做checksum增量数据同步
- source-server
- 与源端建立连接的相关信息
- target-sddata
- 目标端数据目录
- write-recovery-conf
- 表示做完数据同步后须更新目标端的seaboxsql.auto.conf文件
- target-sc-dbid
- 目标端节点id
- slot
- 复制槽名称,用于修复后能够与primary建立流复制
-
使用限制
-
增量同步前须停止mirror节点服务, 其他无任何限制
适用场景¶
其实checksum增量同步没有任何场景限制, 主要看是否是最优选择, 以下场景仅供参考:
-
primary节点上的复制槽slot删除了,使用传统增量同步无法保证数据一致性, 此时必须选择checksum增量同步
-
文件数量没有变化,增量数据比较多,wal比较大的情况下,建议优先使用checksum增量同步