基于 TiCDC 创建灾备和容灾切换
作者: Edwin 原文来源:https://tidb.net/blog/d04fedf0
概述
本文介绍 TiDB 基于 TiCDC 的灾备库创建、主库和备库的数据校验、备库的一致性读取、容灾切换演练、灾难下的容灾接管。
本文描述的技术场景适用 TiDB v6.5 及以上版本。
本文建议关注的要点:
官网 TiCDC 简介,本文不做赘述
通过 BR 备份恢复 +TiCDC 同步的灾备库搭建过程
BR 恢复到备库后需重新收集统计信息
TiCDC 启用 TiCDC 的 Syncpoint 功能 实现主库和备库的在线数据校验
TiCDC 启用 TiCDC 的 Syncpoint 功能 实现快照一致性读取
容灾切换演练的步骤
TiCDC 配置 redo log 实现灾难场景下备库的数据一致性
容灾库搭建
灾备库的搭建过程可以分为如下步骤:
创建灾备集群(本文省略)
扩容部署 TiCDC
通过 BR 进行备份并恢复到备库
TiCDC 创建 changefeed 进行数据同步
主库扩容部署 TiCDC
考虑到后续进行容灾切换,建议也在灾备库端扩容部署 TiCDC 实例。
建议 TiCDC 实例个数在 2 个及以上,以满足高可用能力。
配置 TiCDC 拓扑文件
vim scale-out-ticdc.yaml
通过扩容部署 TiCDC
检查部署的 TiDB 集群情况
备库创建 tidb_cdc 库 (Syncpoint 使用)
BR 备份并恢复到备库
调大主库 gc_life_time 如 24 小时(灾备库搭建完成后再调整回来),确保后续 TiCDC changefeed 的发起时间在 tikv_gc_safe_point 之内。
主库进行 BR 备份
TiDB 集群快照数据是只包含某个物理时间点上集群满足事务一致性的数据。使用 br backup full
可以备份 TiDB 最新的或者指定时间点的快照数据。执行 br backup full --help
可获取该命令的使用帮助。
以上命令中:
--backupts
:快照对应的物理时间点(不指定则备份当前时间)。如果该快照的数据被 GC 了,那么br backup
命令会报错退出;如果你没有指定该参数,那么 BR 会选取备份开始的时间点所对应的快照。--ratelimit
:每个 TiKV 执行备份任务的速度上限(单位 MiB/s)。--log-file
:BR log 写入的目标文件。
备份期间有进度条在终端中显示。当进度条前进到 100% 时,说明备份已完成。
在完成备份后,BR 会将备份数据的 checksum 同集群 admin checksum table 的结果比较,以确保备份数据正确性。
注意:在备份目录 s3://backup-data/20240301/ 下有个 checkpoint.meta 文件,文件中有记录 backup-ts ,该 tso 即为全备的快照时间点,TiCDC 基于该 tso 进行增量同步。
BR 恢复到备库
BR 支持在一个空集群上执行快照备份恢复,将该集群恢复到快照备份时刻点的集群最新状态。
用例:将 s3 的名为 backup-data
bucket 下的 2024-03-01/
前缀目录中属于 2024-03-01 13:30:00
时刻点的快照数据恢复到目标机群。
以上命令中,
--ratelimit
:每个 TiKV 执行恢复任务的速度上限(单位 MiB/s)--log-file
:BR log 写入的目标文件
恢复期间还有进度条会在终端中显示。当进度条前进到 100% 时,说明恢复已完成。
在完成恢复后,BR 为了确保数据安全性,还会校验恢复数据。
BR 全量恢复后统计信息收集 (可在灾备搭建完成后再操作)
BR 不恢复统计信息,所以在容灾库完成全量恢复后需要进行统计信息收集。
备库设置只读模式
备库建议设置只读模式避免产生脏数据。
对 ticdc 同步用户单独授予 RESTRICTED_REPLICA_WRITER_ADMIN 权限。
创建 TiCDC 同步任务
编辑 changefeed 配置文件(建议开启 Syncpoint 和 redo log)
请确保 TiCDC 的配置项 enable-sync-point
已设置为 true
,且备库端已经创建了 tidb_cdc 库,这样才会开启 Syncpoint 功能,在下游保存 ts-map
。
并建议开启 redo log 配置,提供上游灾难情况下的最终一致性。
vim reptask_changefeed.toml
创建并启动任务
注意 –start-ts=“” ,指定 changefeed 的开始 TSO。TiCDC 集群将从这个 TSO 开始拉取数据。默认为当前时间。
搭建灾备同步需要指定基于 BR 备份的 tso,即 BR 备份时 checkpoint.meta 文件中的 backup-ts 。
确认任务状态
经过以上步骤,备库搭建已经完成,可以通过 Grafana 的 TiCDC 面板进行监控分析。
也可以通过 changefeed query 命令查询任务状态:
主备在线数据校验和备库一致性快照读
开启了 Syncpoint 的情况下可以实现主备在线数据校验和备库一致性快照读。
Syncpoint 的应用 – 在线主备数据校验
当你使用 TiCDC 搭建 TiDB 的主从集群时,可能会需要在不停止同步的情况下对上下游进行一致性的快照读或者对数据进行一致性验证。在普通的同步模式中,TiCDC 只提供数据的最终一致性的保证,而无法确保在同步的过程中数据的一致性。因此,对动态变更的数据进行一致性读非常困难,为了满足这一需求,TiCDC 提供了 Syncpoint 功能。
Syncpoint 通过利用 TiDB 提供的 snapshot 特性,让 TiCDC 在同步过程中维护了一个上下游具有一致性 snapshot 的 ts-map
。把校验动态数据的一致性问题转化为了校验静态 snapshot 数据的一致性问题,达到了接近数据一致性实时校验的效果。
主备模式下的数据校验作为一个可选的运维作业(TiCDC 的数据同步本身比较健壮,保证幂等性),可以进行周期性校验,如每天或者每周校验,如果数据容量特别大,可以选择部分核心业务表校验即可。
获取 ts-map
在备库 TiDB 中执行以下 SQL 语句,从结果中可以获取上游 TSO (primary_ts) 和下游 TSO (secondary_ts) 信息。
以上 syncpoint_v1
表中各列所代表的信息如下:
ticdc_cluster_id
:插入该条记录的 TiCDC 集群的 ID。changefeed
:插入该条记录的 Changefeed 的 ID。由于不同的 TiCDC 集群可能会存在重名的 Changefeed,所以需要通过 TiCDC 集群 ID 和 Changefeed 的 ID 来确认一个 Changefeed 所插入的ts-map
。primary_ts
:上游数据库 snapshot 的时间戳。secondary_ts
:下游数据库 snapshot 的时间戳。created_at
:插入该条记录的时间。
sync-diff 进行数据校验
使用 sync-diff 进行数据校验。
使用上一步骤获取的 ts-map 信息来配置上下游数据库的 snapshot 信息。
其中的 Datasource config
部分示例配置如下:
以上配置只展示了 Datasource config
部分,完整配置以及校验操作请参考 sync-diff-inspector 用户文档。
注意: 在使用 Syncpoint 功能进行数据校验时,需要调整 TiKV 的 GC 时间(如 8 小时),保证在校验时 snapshot 对应的历史数据不会被执行 GC,在校验后再还原 GC 设置。
Syncpoint 的应用 – 备库的一致性快照读取
*** 注意: 使用一致性快照读之前,请先 启用 TiCDC 的 Syncpoint 功能。如果多个同步任务使用同一个下游 TiDB 集群且都开启了 Syncpoint 功能,那么这些同步任务都将根据各自的同步进度来更新 tidb_external_ts 和 ts-map。此时,你需要使用读取 ts-map 表中记录的方式来设置同步任务级别的一致性快照读,同时应避免下游应用程序使用 tidb_enable_external_ts_read 的方式读数据,因为多个同步任务之间可能存在互相干扰导致无法获得一致性的结果。***
当你需要从备库查询数据的时候,在业务应用中设置 SET GLOBAL|SESSION tidb_enable_external_ts_read = ON;
就可以在备用集群上获得事务状态完成的数据。
除此之外,你也可以通过查询 ts-map
的方式选取之前的时间点进行快照读。
容灾切换演练
容灾切换演练的步骤:
提前检查项
确认备库应用账号、权限跟主库一致
确认 changefeed 链路同步没有延迟
正式切换
停止主库业务
锁定业务用户、kill 连接、并将主库设置只读模式
确保备库中 tidb_cdc.syncpoint_v1 表的 primary_ts 在主库设置只读模式之后
停止 / 删除主库 changefeed
备库到主库 changefeed 反向同步
备库取消只读模式
启动业务访问备库
验证业务
检查反向同步链路同步
停止主库业务
停止应用
锁定业务用户、kill 所有业务用户链接
主库设置只读模式
确认数据同步完成
在备库中查询 tidb_cdc.syncpoint_v1 表的最新的 primary_ts 在主库设置只读模式之后:
或者查询 Changefeed 状态 checkpoint 在主库设置只读模式之后:
state
代表当前 changefeed 的同步状态,各个状态必须和changefeed list
中的状态相同。tso
代表当前 changefeed 中已经成功写入下游的最大事务 TSO。checkpoint
代表当前 changefeed 中已经成功写入下游的最大事务 TSO 对应的时间。error
记录当前 changefeed 是否有错误发生。
主库停止 / 删除 changefeed 通道
停止主集群 changefeed,以便进行之后建立反向同步链路
防止意外启动,建议删除 changefeed 通道
备库创建 changefeed 进行反向同步
编辑 changefeed 配置文件,可参考主库的配置文件
创建 changefeed
查看 changefeed
备库取消只读模式
启动业务访问备库
修改应用配置指向备库并启动业务。
一般情况下,为了保持对应用的透明,都会通过 LB 访问数据库,此时只需要将 LB 的配置指向备库即可。
容灾切换后的检查
查看业务执行情况。
确认反向链路同步正常。
通过 Grfana 监控查看集群运行情况。
灾难情况下的容灾接管
当发生真正的灾难,比如主集群所在区域断电断网,主备集群的同步链路可能会突然中断,从而导致备用集群数据处于事务不一致的状态。
恢复备库到事务一致的状态
在灾备集群的任意 TiCDC 节点执行以下命令,以向灾备集群重放 redo log,使数据库达到最终一致性状态:
命令中参数描述如下:
--storage
:指定 redo log 所在的 S3 位置--tmp-dir
:为从 S3 下载 redo log 的缓存目录--sink-uri
:指定灾备集群的地址
备库取消只读模式
开放业务访问
修改业务应用的数据库访问配置,并重启业务应用,使得业务访问灾备集群。
检查业务状态是否正常。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/f8cc4752511538da3a8ed1887】。文章转载请联系作者。
评论