DRS的TiDB增量技術探索
1 tidb Binlog
tidb binlog為PingCap自定義格式的日志,非MySQL官方標準binlog。(參考官網(wǎng)文檔https://docs.pingcap.com/zh/tidb/v3.0/binlog-consumer-client )
目前Drainer提供了很多輸出方式,通過對drainer進行配置實現(xiàn)日志直接回放到目標庫(MySQL、TiDB)以及日志落盤(File)的功能,此外為了滿足部分用戶自定義需求,增加輸出到kafka的功能,將TiDB日志以ProtoBuf定義數(shù)據(jù)結構輸出到消息隊列中,讓用戶業(yè)務端自行消費。官方提供了標準的binlog.proto文件,用戶可以在自己的代碼工程中通過proto官方工具生成解析代碼,便于使用。執(zhí)行以下操作自動生成代碼:
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,從而實現(xiàn)2pc算法。其中主要將commit_ts作為后續(xù)事務整合排序的關鍵,由PD模塊統(tǒng)一申請生成。
Pump Client:維護Pump集群信息,通過心跳機制對pump節(jié)點探活,binlog寫請求分發(fā)中心,通過range、hash(start_ts)、score等路由策略將請求分到每個active pump中。其中還要遵循Commit binlog必須發(fā)送到它對應prewrite binlog的Pump原則。
Pump:處理來自pump client的請求,并且負責binlog的存儲。Binlog數(shù)據(jù)順序寫入數(shù)據(jù)文件,同時通過內置leveldb保存binlog的元信息(ts、類型、長度、保存文件及文件中位置)。
Drainer:TiDB通過Drainer組件來實現(xiàn)binlog對外輸出,目前支持:kafka(消息隊列)、文件(增量備份文件方式)、下游目標數(shù)據(jù)庫(MySQL系列)。該組件收集所有pump的binlog數(shù)據(jù),根據(jù)其commit_ts進行歸并排序,然后下發(fā)給下游。TiDB binlog和MySQL binlog一樣,DML操作日志本身不包含表結構信息,Drainer通過在內存中構建表結構快照,ddl的時候就回放,dml的時候就根據(jù)當前快照生成SQL。Drainer在下游回放SQL的時候,采用多協(xié)程的方式提高效率,并引入數(shù)據(jù)沖突檢測機制,保證數(shù)據(jù)一致性。
3 tidb本地單機版(開啟binlog)環(huán)境搭建
單機部署環(huán)境環(huán)境: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根據(jù)物理時間和邏輯時間生成而來,根據(jù)其獲取正確的timestamp,后續(xù)可以根據(jù)這個值去做實時增量同步時延。根據(jù)源碼go語言用java實現(xiàn)。參考源碼: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 數(shù)據(jù)復制服務 DRS
版權聲明:本文內容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內刪除侵權內容。
版權聲明:本文內容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內刪除侵權內容。