增量备份中的cbm设计
内核提供cbm(changed block map)功能,对外提供数据页面的修改情况,并向提供外部接口,根据cbm信息可直接获取两次备份之间发生对于数据文件(行存、列存)的增量修改信息,并备份。
实现原理:
数据库所有的增量修改都会记录在xlog中,通过新增的cbm writer常驻线程,持续解析新增xlog,识别并记录下哪些数据页面被修改。
1、Cbm writer工作流程:
需要开启cbm writer功能
(1)进程启动时即开启cbm writer功能
在startup线程刚启动时,其根据已经解析出来的cbm文件,来决定cbm writer开始解析的起始lsn位置。然后,每次执行到checkpoint末尾时,会设置cbm writer线程的latch。cbm writer线程一直在一个死循环中等待latch被设置,然后进行一轮日志解析。第一次解析时,由于Startup线程已经确定了解析起始的lsn位置,所以不需要强制初始化。如果解析失败,那么这次解析的截止lsn将作为下次解析的起始lsn,并且下一次解析之前不需要进行强制初始化;如果解析失败,那么下次解析前需要进行强制初始化,用于重新确定解析的起始位置。每次解析的截止位置为唤醒本次解析的checkpoint的redo位置。
(2)通过动态reload GUC参数,开启cbm writer功能
由于是动态开启的cbm writer功能,因此startup线程没有初始化cbm解析的起始位置。postmaster在打开enable_cbm_writer开关的同时,会将cbm强制初始化的标志置为true。当cbm writer线程启动之后,其第一次解析的循环中,首先会强制初始化获得解析的起始lsn。后续流程和场景一相同。
(3)cbm强制初始化逻辑
2、cbm文件格式
cbm文件保存在data目录的pg_cbm文件夹下,命名方式为:pg_xlog_seqnum_startlsn_endlsn.cbm。
其中,seqnum表示这是第几个cbm文件,当一个cbm文件的大小超过100M时,将会切换到下一个cbm文件,并将seqnum加1,。startlsn为本cbm文件内容对应xlog记录的起始lsn,endlsn为本cbm文件切换时最后一次解析的截止lsn。若一个cbm文件还没有切换,那么endlsn为0。
3、cbm文件页面格式和记录内容
cbm文件由cbm页面组成,每个cbm页面的大小为8K。
在每个cbm页面的开头,为cbm页面头结构,剩下的空间均为记录对应表文件物理页面是否修改的bitmap。
4、查询使用
(1)通过设置GUC参数enable_cbm_tracking=on/off,打开/关闭cbm tracking功能;
(2)行存增量文件的识别
在备份行存增量文件时,通过调用函数
select * from pg_cbm_get_changed_block(startlsn, endlsn) where relfilenode != 0 and fork_number >= 0 and fork_number <= 2;
来获取上次备份以来,行存数据页面的修改。其中,startlsn为上次备份结束时checkpoint的lsn位置。endlsn为本次增量备份开始时checkpoint的lsn位置
(3)识别表空间路径和数据库路径的变化
通过调用函数
pg_cbm_get_changed_block(startlsn, endlsn0 where (tablespace_oid != 0 or database_oid != 0) and relfilenode =0;
来获取上次备份以来,表空间路径和数据库路径的变化。其中,startlsn为上次备份结束时的checkpoint的lsn位置,endlsn为本次增量备份开始时checkpoint的lsn位置。
(4)列存增量文件的识别
在备份列存增量文件时,通过调用函数
select * from pg_cbm_get_changed_block(startlsn, endlsn) where relfilenode != 0 and fork_number >= 4;
来获取上次备份以来,行存数据页面的修改。其中,startlsn为上次备份结束时的checkpoint的lsn位置,endlsn为本次增量备份开始时checkpoint的lsn位置。
此外,开启内核cbm tracking功能,在典型tpcc场景下,会对性能有一定影响(2%以内),可以通过调大checkpoint间隔来降低性能影响。
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦
- 点赞
- 收藏
- 关注作者
评论(0)