基于 Drainer 的 TiDB 的闪回实现
作者: aylen 原文来源:https://tidb.net/blog/8accbc11
背景
由于运维、DBA 的误操作或是业务 bug,我们在操作中不可避免的会出现误删除数据情况。目前,TiDB 只提供了类似 oralce 的 Flashback Query,详细说明参见TiDB 历史数据回溯。但其查询时间受限与 GC 且不能生成闪回 SQL。延长 GC 的时间,则存在以下问题:
磁盘空间占用较多
大量的历史版本会在一定程度上影响性能,尤其是范围查询(如
select count(*) from t
)
对于 MySQL DBA 来说,有很多基于 binlog 实现的开源的闪回工具,如 binlog2sql、MyFlash。TiDB 也提供了类似 MySQL 的 binlog,因此可以基于类似的方法实现 TiDB 的闪回。
TiDB Binlog
TiDB Binlog 集群主要分为 Pump 和 Drainer 两个组件,以及 binlogctl 工具:
Pump
Pump 用于实时记录 TiDB 产生的 Binlog,并将 Binlog 按照事务的提交时间进行排序,再提供给 Drainer 进行消费。
Drainer
Drainer 从各个 Pump 中收集 Binlog 进行归并,再将 Binlog 转化成 SQL 或者指定格式的数据,最终同步到下游。
binlogctl 工具
binlogctl 是一个 TiDB Binlog 配套的运维工具,具有如下功能:
获取 TiDB 集群当前的 TSO
查看 Pump/Drainer 状态
修改 Pump/Drainer 状态
暂停 / 下线 Pump/Drainer
binlog 的格式介绍参见TiDB Binlog 源码解析
方案介绍
从上面关于 TiDB Binlog 的介绍中,我们知道 Drainer 从各个 Pump 收集 Binlog 进行归并,再将 Binlog 进行转换。 从 drainer 的配置文件中,可以看到下游服务类型有四种,
因此,可以通过新增加一种下游服务类型来实现 flashback。
参数介绍
相较 drainer,新增了几个参数,同时对之前的 dest-db-type 做了类型的扩充
实现原理
1、新增一个 syncer 类
在 createDSyncer 函数中新增 NewFlashBackSyncer,相较其他的 syncer 函数,增加了限制参数,如 start-time、do-dml 等,而对相关库表的过滤,依赖与 drainer 之前实现的过滤方法
2、将 tidb 的 binlog 改成闪回用的 binlog
这块的改写逻辑类似与 MySQL 的闪回改写逻辑,详情参见闪回思路
3、新增对 tidb binlog 生成语句的函数
通过新增的 ToOriginalSQL 和 ToFlashBackSQL,生成原始和闪回的 SQL
操作
实际使用和 drainer 没有太大区别,如:
操作结果会产生三类文件:闪回的 binlog 文件、原始 SQL 文件、闪回 SQL 文件,闪回的 binlog 文件可以直接使用 reparo 进行操作。
上面简单讲解了闪回工具的实现,后续这块会作为 PR 提交给官方,到时欢迎吐槽和拍砖。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/cabba667aa2da017c591c3ed6】。文章转载请联系作者。
评论