写点什么

基于 Drainer 的 TiDB 的闪回实现

  • 2022 年 7 月 11 日
  • 本文字数:1392 字

    阅读完需:约 5 分钟

作者: 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 的配置文件中,可以看到下游服务类型有四种,


-dest-db-type string    Drainer 下游服务类型 (默认为 mysql,支持 tidb、kafka、file)
复制代码


因此,可以通过新增加一种下游服务类型来实现 flashback。

参数介绍

相较 drainer,新增了几个参数,同时对之前的 dest-db-type 做了类型的扩充


  -dest-db-type string      target db type: mysql or tidb or file or kafka or flashback; see syncer section in conf/drainer.toml (default "mysql")  -do-dml string      do-dml : insert ,update ,delete ; you can choose more than one ,default all dmls  -end-time string      flashback end in end-time, empty string means never end.  -end-tso int      similar to end-time, but in pd-server tso format  -start-time string      flashback from start-time, empty string means starting from current time  -start-tso int      similar to start-time but in pd-server tso format
复制代码

实现原理

1、新增一个 syncer 类

在 createDSyncer 函数中新增 NewFlashBackSyncer,相较其他的 syncer 函数,增加了限制参数,如 start-time、do-dml 等,而对相关库表的过滤,依赖与 drainer 之前实现的过滤方法

2、将 tidb 的 binlog 改成闪回用的 binlog

这块的改写逻辑类似与 MySQL 的闪回改写逻辑,详情参见闪回思路

3、新增对 tidb binlog 生成语句的函数

通过新增的 ToOriginalSQL 和 ToFlashBackSQL,生成原始和闪回的 SQL

操作

实际使用和 drainer 没有太大区别,如:


drainer -pd-urls https://127.0.0.1:2379 -dest-type flashback -start-time "209-12-25 00:00:00" -end-time "2019-12-25 10:00:00"
复制代码


操作结果会产生三类文件:闪回的 binlog 文件、原始 SQL 文件、闪回 SQL 文件,闪回的 binlog 文件可以直接使用 reparo 进行操作。


上面简单讲解了闪回工具的实现,后续这块会作为 PR 提交给官方,到时欢迎吐槽和拍砖。


发布于: 刚刚阅读数: 3
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
基于Drainer的TiDB的闪回实现_TiDB 社区干货传送门_InfoQ写作社区