天天看點

Alibaba Canal Manager Model 配置管理實作Alibaba Canal Manager Model 配置管理實作

其中 Server 端配置有兩種管理方式: Spring 和 Manager。其中 Spring 方式是基于spring xml + properties 進行定義建構 spring 配置, Manager 方式則可以對接 Web console/manager 系統。本文主要記錄一下 Manager 方式的對接邏輯,源碼在 canal-deployer 子產品,相對比較簡單。

版本:canal-1.0.24

檢視 Canal Server 端的腳本 ./bin/startup.sh,可以找到啟動入口類是 CanalLauncher。該類 main 方法首先加載了配置檔案到記憶體用于啟動參數,./conf/canal.properties 檔案。将參數傳遞給 final 類 CanalController,是以我們主要檢視 CanalController 類。

要使用 Manager 方式,需要對啟動參數進行設定。由前文可知啟動時會先讀取 canal.properties 檔案,是以先需要在該檔案增加以下配置

這裡需要簡單說明幾個概念

Server: 表示由 ./bin/startup.sh 腳本啟動的程式,即一個 JVM;

Instance: 對應一個 Mysql 執行個體,代碼為 CanalInstance 接口;

Destination: 字元串類型,對應一個 Instance;

CanalServerWithEmbedded 類: 連接配接 mysql master,管理多個 CanalInstance;

CanalServerWithNetty 類: 基于 netty 網絡服務的 server 實作,用于與 Client 通訊;

CanalConfigClient 類: 存放配置相關資訊;

CanalInstanceGenerator 接口: canal 執行個體生産者,根據 destination 以及 InstanceConfig 生産 CanalInstance;

其 Server 架構如下圖

Alibaba Canal Manager Model 配置管理實作Alibaba Canal Manager Model 配置管理實作

啟動一個 Server,裡面可有多個 Instance,一個 Instance 讀取一個 Mysql 執行個體的binlog 日志,Destination 則是對一個 Instance 執行個體的描述字元串,在該 Server 中唯一。

Canal-Server 配置加載方式

Alibaba Canal Manager Model 配置管理實作Alibaba Canal Manager Model 配置管理實作

檢視 CanalController 類

在其構造 函數可以看到 CanalInstanceGenerator 執行個體作為 CanalServerWithEmbedded 執行個體的元件。

檢視 CanalInstanceGenerator 執行個體的具體實作,在初始化全局配置 initGlobalConfig 方法中

可以看到 Manger 方式的配置主要是 CanalConfigClient,從 managerClients 集合中擷取。該集合實作主要在構造器中,調用 getManagerClient 方法。是以我們主要通過該方法,構造 CanalConfigClient 執行個體傳回即可。檢視 CanalConfigClient 類主要有兩個方法 findCanal, findFilter,可以确定 CanalConfigClient 表示整個 Server 的配置。getManagerClient 方法參數 managerAddress 則是在配置檔案 canal.properties 中 destination 對應的 ip 位址,若沒有配置則使用本機ip。這裡比較奇怪的是,既然是通過 destination 擷取的 ip,然後建構 CanalConfigClient 執行個體,為啥不讓 CanalConfigClient 執行個體表示一個 destination 的配置而卻是整個 Sever 的配置。

實作 CanalConfigClient 類,主要是一些參數的配置(如 Mysql 連接配接使用者名、密碼等), Canal 和字元串 Filter 的建構。Canal 執行個體的建構可以參考一下 CanalInstanceWithManager 類所用到的一些參數。

到此可以說已經完成 Manger 方式配置的初始化,那如何更新配置呢,主要是用到了 ManagerInstanceConfigMonitor 類,該類在 CanalController 構造器中初始化。

CanalContoller 構造器中

檢視 ManagerInstanceConfigMonitor 類,主要是實作 scan 方法,若配置有更新的話,回調 InstanceAction。這裡還有個地方比較奇怪,可以看到 InstanceAction 回調方法參數是字元串 destination?我們在 scan 方法中調用後端伺服器接口,已經擷取到新的配置,卻隻能回調字元串 destination,然後在 CanalController.getManagerClient 方法根據 destination 再去調伺服器擷取具體配置?這裡多了一次調用伺服器接口,感覺比較奇怪。

Manager 模式實作步驟