DRS的TiDB增量技术探索
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-源码阅读
- 点赞
- 收藏
- 关注作者
评论(0)