1、背景介绍
增量备份(Pwal Backup Server,PBS)作为数据库容灾体系中的核心组件,可通过持续获取Redo log来实现按时间点恢复(PITR:Point-in-Time Recovery )。
TaurusDB通过全量备份和增量备份,构成了完整的备份策略链,满足ACID原则中的持久性要求,能够实现RTO<15分钟、RPO≈0的金融级灾备标准。
本文将重点介绍TaurusDB的增量备份功能。
2、原理介绍
先解释一些taurusDB中增备相关的概念:
增量备份(PBS)依赖于LSN。PBS会首先从OBS读取最近全量备份的“结束LSN”(如 LSN=5000)。数据库会从该LSN开始持续上传新生成的Redo Log(LSN=5001, 5002,...),直到备份完成后,再进一步推进IncreBackupLSN,从而防止关键日志被过早清理,确保增量备份数据的完整性与可用性。
1. 核心功能
PBS 的核心任务是:
-
基于最近一次全量备份的结束 LSN,持续上传 Redo 日志到 OBS,确保数据可恢复到任意时间点。
-
依赖全量备份:如果没有全量备份,PBS 无法启动。
2. 数据流转
图1. 数据流转示意图
数据流转如图1所示:
1).MySQL 写入 Redo Log
-
MySQL 将事务日志(Redo Log)写入 CommonLog 内存池。
-
日志在 上传到 OBS 之前不会删除。
2).PBS 获取并上传 Redo Log
-
PBS 进程启动后,从 OBS 读取 最近全量备份的结束 LSN(或上一次增量备份的结束 LSN)。
-
与 MySQL 交互,获取 Redo Log 的 元数据,并从 CommonLog 提取对应日志。
-
上传至 OBS,并推进 TruncateLSN(标记已上传的日志可被清理)。
3).日志清理
已上传的 Redo Log 从 CommonLog 池中删除,释放内存空间。
图2. PBS总体架构交互图
3. 管控与 Agent 协作
管控和Agent的组件角色如图2所示:
1)全量备份完成后,管控向 OBS 写入 备份结束 LSN(即增量备份起点)。
2)Agent 激活增量备份:
-
持久化配置到 SQLite。
-
初始化 PBS 环境,启动定时任务(监控 PBS 进程状态)。
4. 异常恢复
PBS 重启时,会从 OBS 读取 上一次增量备份的结束 LSN,继续备份,确保连续性。
3、PBS工作原理解析
Pbs_client包含三个线程:Pbs_communicate_client、Pbs_reader、Pbs_sender。
-
Pbs_communicate_client负责与Pbs_server交互数据,进行初始化和正常交互数据。Pbs_client初始化时,会激活Pbs_sender和Pbs_reader线程。正常与Pbs_server交互数据,会更新Rwal的Metadata元数据。
-
Pbs_reader线程根据Metadata数据查询Rwal,并将Redo日志插入队列,唤醒Pbs_sender线程。
-
Pbs_sender线程负责拼装获取到的Redo日志,并上传OBS服务器。
图3. PBS组件内部组件图
图4是具体的线程交互图,具体实现如下:
图4. PBS线程交互图
(1)Pbs_communicate_client通信线程:
初始化流程:
1.与pbs_server建立TCP连接;
2.PBS拼接好发送给PBC的消息体,Type为INIT;
3.PBC接受解析消息,获取并更新Truncate_backup_lsn;
4.PBC获取Pwal的快照和Pwal的Offset,拼装消息返回给PBS;
5.PBC获取数据,更新Incre_start_lsn,创建线程pbs_log_reader;
6.PBS打开Rwal并设置读取Rwal的起点,创建pbs_sender和pbs_reader线程。
正常通信流程:
1.PBS拼接好发送给pbs_server的消息体,Type为INIT;
2.PBC接受解析消息,获取并更新Truncate_backup_lsn;
3.PBC获取Pwal的快照和Rwal的Offset,拼装消息返回给PBS;
4.PBS更新Rwal。
(2) Pbs_reader 日志读取线程 和 Pbs_sender 日志发送线程
日志读取线程和日志发送线程使用了经典的生产者消费者模式:
1).由pbs_reader根据通信线程pbs_communicate_client与Mysqld通信获取的Redo Log数据的句柄,从CommonLog读取Redo Log,并塞入队列中等待pbs_sender消费,同时更新End_lsn用于继续读取Redo Log。pbs_sender从队列中获取Redo Log后,依据设置的上传策略来上传OBS。
2).在读取和发送线程的交互中,使用了两个队列的设计,加快了Redo Log上传,实际上传时,会把若干Redo Log合并成一个大段的BUFFER进行上传,来提高上传效率。
图5. Redo日志上传双队列示意图
对同一个Buffer,读取Redo Log和上传Buffer是不能同时进行的。这里有两个队列可以规避这种情况:
Buffer_1上传数据期间,Sender线程会向Buffer_2中写入数据。当Buffer_2达到发送条件时,且Buffer_1上传成功,则进行交替,即开始上传Buffer_2数据,向Buffer_1中写入数据。该功能实现了上传和写入的并行,因此当数据流较大时,上传不会因为要等待写入完成而受到阻塞。
4、总结
数据备份与恢复是数据库系统的生命线。TaurusDB通过高效的全量备份(Full Backup)与增量备份(Incremental Backup)机制,能够为客户提供可靠的数据恢复服务,全方位守护企业数据安全与业务连续性。