DRS的TiDB增量技术探索

网友投稿 779 2022-05-29

1 tidb Binlog

DRS的TiDB增量技术探索

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-源码阅读

MySQL 数据复制服务 DRS

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【精选单品】让科技建起森林“保护罩”,守护青山须得防患于“未燃”
下一篇:GaussDB(DWS) 逻辑集群系列一:逻辑集群简介
相关文章