做者:satorunode
TiDB Binlog 主要由 Pump 和 Drainer 兩部分組成,其中 Pump 負責存儲 TiDB 產生的 binlog 並向 Drainer 提供按時間戳查詢和讀取 binlog 的服務,Drainer 負責將獲取後的 binlog 合併排序再以合適的格式保存到對接的下游組件。mysql
在《TiDB Binlog 架構演進與實現原理》一文中,咱們對 TiDB Binlog 總體架構有更詳細的說明,建議先行閱讀該文。linux
TiDB Binlog 的實現主要分佈在 tidb-tools 和 tidb-binlog 兩個源碼倉庫中,咱們先介紹一下這兩個源碼倉庫中的關鍵目錄。git
Repo: https://github.com/pingcap/tidb-tools/github
這個倉庫除了 TiDB Binlog 還有其餘工具的組件,在這裏與 TiDB Binlog 關係最密切的是 tidb-binlog/pump_client
這個 package。pump_client
實現了 Pump 的客戶端接口,當 binlog 功能開啓時,TiDB 使用它來給 pump 發送 binlog 。sql
Repo: https://github.com/pingcap/tidb-binlog數據庫
TiDB-Binlog 的核心組件都在這個倉庫,下面是各個關鍵目錄:架構
cmd
:包含 pump
,drainer
,binlogctl
,reparo
,arbiter
等 5 個子目錄,分別對應 5 個同名命令行工具。這些子目錄下面的 main.go
是對應命令行工具的入口,而主要功能的實現則依賴下面將介紹到的各個同名 packages。pump
:Pump 源碼,主要入口是 pump.NewServer
和 Server.Start
;服務啓動後,主要的功能是 WriteBinlog
(面向 TiDB/pump_client
) 和 PullBinlogs
(面向 Drainer
)。drainer
:Drainer 源碼,主要入口是 drainer.NewServer
和 Server.Start
;服務啓動後,Drainer 會先找到全部 Pump 節點,而後調用 Pump 節點的 PullBinlogs
接口同步 binlog 到下游。目前支持的下游有:mysql/tidb,file(文件增量備份),kafka 。binlogctl
:Binlogctl 源碼,實現一些經常使用的 Binlog 運維操做,例如用 -cmd pumps
參數能夠查看當前註冊的各個 Pump 節點信息,相應的實現就是 QueryNodesByKind
。reparo
:Reparo 源碼,實現從備份文件(Drainer 選擇 file 下游時保存的文件)恢復數據到指定數據庫的功能。arbiter
:Arbiter 源碼,實現從 Kafka 消息隊列中讀取 binlog 同步到指定數據庫的功能,binlog 在消息中以 Protobuf
格式編碼。pkg
:各個工具公用的一些輔助類的 packages,例如 pkg/util
下面有用於重試函數執行的 RetryOnError
,pkg/version 下面有用於打印版本信息的 PrintVersionInfo
。tests
:集成測試。上個小節提到的 tests
目錄裏有一個名爲 run.sh
腳本,咱們通常會使用 make integration_test
命令,經過該腳本執行一次完整的集成測試,不過如今咱們先介紹如何用它來啓動一個測試集羣。運維
啓動測試集羣前,須要在 bin
目錄下準備好相關組件的可執行文件:函數
pump
, drainer
, binlogctl
:在 tidb-binlog 目錄執行 make build
腳本依賴 MySQL 命令行客戶端來肯定 TiDB 已經成功啓動,因此咱們還須要安裝一個 MySQL 客戶端。
準備好以上依賴,運行 tests/run.sh --debug
,就能夠啓動一個測試集羣。啓動過程當中會輸出一些進度信息,看到如下提示就說明億成功啓動:
Starting Drainer... You may now debug from another terminal. Press [ENTER] to continue.
測試集羣包含如下服務:
使用 MySQL 客戶端鏈接任意一個上游 TiDB,能夠用 SHOW PUMP STATUS
和 SHOW DRAINER STATUS
查詢對應工具的運行狀態,例如:
經過 binlogctl
也能夠查詢到一樣的信息,例如:
$ bin/binlogctl -pd-urls=localhost:2379 -cmd pumps [2019/06/26 14:36:29.158 +08:00] [INFO] [nodes.go:49] ["query node"] [type=pump] [node="{NodeID: pump:8250, Addr: 127.0.0.1:8250, State: online, MaxCommitTS: 409345979065827329, UpdateTime: 2019-06-26 14:36:27 +0800 CST}"]
接下來咱們能夠用 MySQL 客戶端鏈接上端口爲 4000 或 4001 的 TiDB 數據庫,插入一些測試數據。
上圖的演示中建立了一個叫 hello_binlog
的 database,在裏面新建了 user_info
表並插入了兩行數據。完成上述操做後,就能夠鏈接到端口爲 3306 的下游數據庫驗證同步是否成功:
本文簡單介紹了 tidb-tools 和 tidb-binlog 及其中的目錄,而且展現瞭如何啓動測試集羣。有了這些準備,你們就能夠進一步瞭解各個功能的源碼實現。下篇文章將會介紹 pump_client
如何將一條 binlog 發送往 Pump Server。
原文閱讀:https://www.pingcap.com/blog-cn/tidb-binlog-source-code-reading-2/