前言
最近公司用到Canal來做從MySQL到Tidb的數據同步,用到HA模式Canal,記錄一下HA模式的工作原理。
Canal的架構模式
Canal是利用binlog日志來做數據同步,canal偽裝成從節點從主節點dump binlog日志,所以canal分為server和client,server負責dump binlog日志,client負責處理binlog日志(比如入庫)。

Canal客戶端HA模式運行原理
Canal的HA模式是需要zk來保證,zk用來保存canal客戶端的一些元數據,例如服務端節點信息(\otter\canal\cluster )、運行的服務節點信息(\otter\canal\destinations\{自定義分區}\running)、客戶端節點信息(\otter\canal\destinations\{自定義分區}\cluster)、客戶端攔截器配置信息(\otter\canal\destinations\{自定義分區}\1001\filter)、客戶端binlog同步節點信息(\otter\canal\destinations\{自定義分區}\1001\cursor)、運行的客戶端信息(\otter\canal\destinations\{自定義分區}\1001\running)

HA模式Canal客戶端啟動時,首先鏈接zk,在zk上注冊客戶端節點(\otter\canal\destinations\{自定義分區}\1001\running)服務,當沒有客戶端注冊時則注冊成功,已有客戶端注冊時則當前客戶端進入靜默狀態(線程掛起),然后監聽前一個客戶端在zk注冊節點變化,當前一個客戶端退出(在zk上的注冊節點信息發生變化)則通知所有靜默狀態的服務端進行zk服務注冊,當有一個客戶端注冊成功時其他客戶端則再此進入靜默狀態並且進行zk注冊節點監聽。

當客戶端再zk上成功注冊服務時,其他客戶端會再次進入靜默狀態,進入靜默狀態核心思想是使用JUC下的AQS,詳細如下:

