带你认识数仓的增量备份核心设计
本文分享自华为云社区《其疾如风,GaussDB(DWS)增量备份核心设计》,作者: 我的橘子呢 。
1.认识增量备份
GaussDB(DWS)数仓的备份恢复工具 Roach 支持集群级增量备份。全量备份会将源数据完整备份,而增量备份仅将上次备份后所作的更改进行备份,这里的上次备份可以使全量备份,也可以是全量备份后的增量备份。需要注意的是,增量备份的基础始终是全量备份,如果一次全量备份之后进行了全量恢复,则不能再基于该全量备份进行增量备份,必须重新进行全量备份然后基于新的全量备份进行增量备份。增量备份分为两种:累积增量备份和差分增量备份。
累积增量备份:如果一次全量备份后的多次增量备份,指定的 prior-backup-key 始终为全量备份的 backup-key,即所有的增量备份都是基于全量备份来进行的,那么这些增量备份就是累积增量备份,累积增量备份均是基于最近一次全量备份进行的,如图 1 所示。
图 1 累积增量备份示意图
差分增量备份:如果一次全量备份后的多次增量备份,指定的 prior-backup-key 均为上一次备份(可能是全量备份也可能增量备份)的 backup-key,即此次备份是基于上一次备份集来进行的,那么这些增量备份就是差分增量备份,差分增量备份均是基于最近一次备份进行的,如图 2 所示。
图 2 差分增量备份示意图
2.增量备份之 CBM 设计
增量备份只需要备份上一备份节点到当前时间发生变化的数据文件,为了实现备份数据的完整性与一致性,正确识别并备份增量数据文件是至关重要的,作为增量备份的核心设计,Gauss 数据库内核的事务日志功能与 cbm 设计可以帮助 Roach 工具快速准确识别增量期间数据文件的变换信息,为快速准确完成增量备份提供了有力保障。
(1)WAL 与事务日志
为了保证数据的一致性和完整性,在对数据进行相关操作之前都会将具体的操作记录下来,持久化到可靠存储中,然后再进行具体的数据操作,这就是所谓的 WAL(Write Ahead Logging),记录的相关操作称为 XLOG 日志,每一条日志记录都由 LSN 进行唯一标识。这样做的好处是事物的记录被提前记录并保存起来,在因一些外部原因(比如断电、操作系统失败等)导致操作失败后,我们可以通过保存的事物日志将这些操作重新执行一遍,保证数据不会丢失。相关操作如图 3 所示。
图 3 WAL 操作示意图
(2)Checkpoint 操作
当系统运行时间较长的时候,由于操作较多,日志文件的数量也较多。如果每次利用日志进行恢复操作都会耗费大量的时间,为了节约时间同时减少不必要的恢复操作,引入了 checkpoint 的概念。checkpoint 表示在此操作之前,相关数据已经被保存到永久存储中,即使系统故障,这部分数据也不会丢失,因此恢复的时候只要从 checkpoint 操作之后根据日志执行恢复操作就可以了。checkpoint 本身也是一条 xlog 记录,该记录包含了 redo 点的位置,因此,每次恢复数据时,先从 xloh 记录里找到最近的一次 checkpoint 记录,并根据该记录找到相应的 redo 点位置,这就是执行本次恢复的起始点位置。如图 4 所示,checkpoint 操作记录了 redo 点的位置。
图 4 Checkpoint 操作示意图
(3)CBM 设计
基于上述功能,由于数据的所有变化都被记录在了 xlog 中,Gauss 数据库内核通过增加常驻的 CBM writer 线程,持续不断地对新增的 xlog 进行解析,识别并记录哪些数据数据页面被修改。CBM 记录的生成过程如图 5 所示。
图 5 CBM 生成示意图
CBM writer 线程的工作流程为:
进程启动时即开启 CBM writer 功能
在 startup 线程刚启动时,其根据已经解析出来的 CBM 文件,来决定 CBM writer 开始解析的起始 LSN 位置。每次执行到 checkpoint 末尾是,会设置 CBM writer 线程的 latch。CBM writer 线程等待 latch 被设置,然后进行一轮日志解析。
通过动态 reload GUC 参数,开启 CBM writer 功能
由于是动态开启的 CBM writer 功能,因此 startup 线程没有初始化 CBM 解析的起始位置。打开 enable_cbm_writer 开关的同时,会将 CBM 强制初始化的标志置为 true。当 CBM writer 线程启动之后,其第一次解析中,会强制初始化获得解析的起始 lsn。
(4)CBM 文件的命名格式
CBM 文件保存在 data 目录的 pg_cbm 文件夹下,命名方式为:pg_xlog_seqnum_startlsn_endlsn.cbm。如图 6 所示。
图 6 CBM 文件格式
seqnum 文件序号表示这是第几个 cbm 文件,当一个 cbm 文件的大小超过 100M 时,将会切换到下一个 cbm 文件,并将 seqnum 加 1。
startlsn 为本 cbm 文件内容对应 xlog 记录的起始 lsn;
endlsn 为本 cbm 文件切换时最后一次解析的截止 lsn,若一个 cbm 文件还没有切换,那么 endlsn 为 0。
(5)CBM 对外接口函数
a. pg_cbm_tracked_location
说明:用于查询 cbm 已经解析到的 lsn 位置
入参:无
返回值:cbm 已经解析到的 lsn 位置
b. pg_cbm_get_merged_file
说明:用于将指定 lsn 范围之内的 cbm 文件合并成一个 cbm 文件
入参:startlsn,指定的起始 lsn;endlsn,指定的结束 lsn
返回值:合并完的 cbm 文件名
c. pg_cbm_get_changed_block
说明:用于将指定 lsn 范围之内的 cbm 文件合并一个表,并返回表的各行记录
入参:startlsn,指定的起始 lsn;endlsn,指定的结束 lsn
返回值:合并完的表的记录,表的结构如下
d. pg_cbm_recycle_file
说明:删除不再使用的 cbm 文件
入参:lsn,删除该 lsn 以前的 cbm 文件
返回值:删除截止的 lsn
3.CBM 使用实践
(1)找到当前 xlog 的 LSN 位置,并将 cbm 的解析位置设置为该 LSN 的位置。
图 7 设置 CBM 解析起始位置
(2)插入数据后获取当前 cbm 解析位置。
图 8 设置 CBM 解析终止位置
(3)根据插入后数据前后的 CBM 解析位置,获取变化的数据文件,获取相关信息。
图 9 获取变化数据文件
4.总结
增量备份是重要的常规备份策略,正确快速识别增量变化文件的相关信息对增量备份至关重要。作为增量备份的核心设计,事务日志和 CBM 相关功能为增量备份的快速高效进行提供了有力支撑,本文对 CBM 的相关设计进行了介绍,并利用 CBM 的对外接口演示了 CBM 的相关功能。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/129716c33b0c86720156baf7d】。文章转载请联系作者。
评论