DRS的TiDB增量技术探索

举报
DRS技术快客 发表于 2021/07/31 14:46:37 2021/07/31
【摘要】 1 TiDB BinlogTiDB binlog为PingCap自定义格式的日志,非MySQL官方标准binlog。(参考官网文档https://docs.pingcap.com/zh/tidb/v3.0/binlog-consumer-client )目前Drainer提供了很多输出方式,通过对drainer进行配置实现日志直接回放到目标库(MySQL、TiDB)以及日志落盘(File)...

1 TiDB Binlog

TiDB binlog为PingCap自定义格式的日志,非MySQL官方标准binlog。(参考官网文档https://docs.pingcap.com/zh/tidb/v3.0/binlog-consumer-client )
目前Drainer提供了很多输出方式,通过对drainer进行配置实现日志直接回放到目标库(MySQL、TiDB)以及日志落盘(File)的功能,此外为了满足部分用户自定义需求,增加输出到kafka的功能,将TiDB日志以ProtoBuf定义数据结构输出到消息队列中,让用户业务端自行消费。官方提供了标准的binlog.proto文件,用户可以在自己的代码工程中通过proto官方工具生成解析代码,便于使用。执行以下操作自动生成代码:
protoc.exe --java_out=.binlog.proto

2 TiDB Binlog组件

TiDB binlog组件提供类似MySQL主从复制功能,其主要由PD(pump client)、pump 集群、drainer功能模块构成。参考官方文档:https://pingcap.com/blog-cn/tidb-ecosystem-tools-1/

TiDB Server:每个事务的写入伴随着prewrite binlog以及commit binlog/rollback binlog,从而实现2pc算法。其中主要将commit_ts作为后续事务整合排序的关键,由PD模块统一申请生成。
Pump Client:维护Pump集群信息,通过心跳机制对pump节点探活,binlog写请求分发中心,通过range、hash(start_ts)、score等路由策略将请求分到每个active pump中。其中还要遵循Commit binlog必须发送到它对应prewrite binlog的Pump原则。
Pump:处理来自pump client的请求,并且负责binlog的存储。Binlog数据顺序写入数据文件,同时通过内置leveldb保存binlog的元信息(ts、类型、长度、保存文件及文件中位置)。
Drainer:TiDB通过Drainer组件来实现binlog对外输出,目前支持:kafka(消息队列)、文件(增量备份文件方式)、下游目标数据库(MySQL系列)。该组件收集所有pump的binlog数据,根据其commit_ts进行归并排序,然后下发给下游。TiDB binlog和MySQL binlog一样,DML操作日志本身不包含表结构信息,Drainer通过在内存中构建表结构快照,ddl的时候就回放,dml的时候就根据当前快照生成SQL。Drainer在下游回放SQL的时候,采用多协程的方式提高效率,并引入数据冲突检测机制,保证数据一致性。

3 tidb本地单机版(开启binlog)环境搭建

单机部署环境环境:Linux(随便购买一台ecs)+ mysql客户端
官方参考手册 https://docs.pingcap.com/zh/tidb/dev/get-started-with-tidb-binlog
1、下载

wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz

2、解压 tar -xzf tidb-latest-linux-amd64.tar.gz

cd tidb-latest-linux-amd64/

3、./bin/pd-server --config=pd.toml &>pd.out &

//【pd.toml】
log-file="/data/tidb/logs/pd.log"
data-dir="/data/tidb/pd.data"

4、./bin/tikv-server --config=tikv.toml &>tikv.out &

//【tikv.toml】
log-file="/data/tidb/logs/tikv.log"
[storage]
data-dir="/data/tidb/tikv.data"
[pd]
endpoints=["127.0.0.1:2379"]
[rocksdb]
max-open-files=1024
[raftdb]
max-open-files=1024

5、./bin/pump --config=pump.toml &>pump.out &

//【pump.toml】
log-file="/data/tidb/logs/pump.log"
data-dir="/data/tidb/pump.data"
addr="127.0.0.1:8250"
advertise-addr="127.0.0.1:8250"
pd-urls="http://127.0.0.1:2379"

6、sleep 3 && ./bin/tidb-server --config=tidb.toml &>tidb.out &

//【tidb.toml】
store="tikv"
path="127.0.0.1:2379"
[log.file]
filename="/data/tidb/logs/tidb.log"
[binlog]
enable=true

7、./bin/drainer --config=drainer.toml &>drainer.out &(配置kafka的下游端)

//【drainer.toml】
log-file="/data/tidb/logs/drainer.log"
[syncer]
db-type="kafka"
[syncer.to]
zookeeper-addrs = "10.154.218.217:2181"
kafka-addrs = "10.154.218.217:9092"
kafka-version = "1.1.0"
kafka-max-messages = 1024
topic-name = "zlz"

4 TiDB解析demo

1、Main方法:

2、Kafka解析成Binlog对象:

3、proto解析结果:

4、commit_ts是由PD根据物理时间和逻辑时间生成而来,根据其获取正确的timestamp,后续可以根据这个值去做实时增量同步时延。根据源码go语言用java实现。参考源码:https://github.com/tikv/pd/blob/04ff28f436debac2c5655238b3189af0407145c8/pkg/tsoutil/tso.go#L28

5 参考链接

https://pingcap.com/blog-cn/tidb-ecosystem-tools-1/#TiDB-Binlog-源码阅读

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。