CANAL 的配置方式有兩種:
- ManagerCanalInstanceGenerator: 基於manager管理的配置方式,目前alibaba內部配置使用這種方式。大家可以實現CanalConfigClient,連接各自的管理系統,即可完成接入
- SpringCanalInstanceGenerator:基於本地spring xml的配置方式,目前開源版本已經自帶該功能所有代碼,建議使用
我們使用 Spring 的配置方式,即
canal.instance.global.mode = spring
這種方式有三個配置文件,分別爲 canal.properties,xxx-instance.xml,instance.properties,這些配置文件將會由 spring 的 PropertyPlaceholderConfigurer 通過機制將其融合,生成一份 instance 實例對象,每個 instance 對應的組件都是相互獨立的,互不影響
xxx-instance.xml
位於 ${canal.conf.dir}/spring/ 下,這些配置可以使用下面的,也可自己定製,只需在 canal.properties 中通過 canal.instance.global.spring.xml 配置項指定,目前支持以下幾種:
- spring/memory-instance.xml
- spring/default-instance.xml
- spring/group-instance.xml
在介紹instance配置之前,先了解一下canal如何維護一份增量訂閱&消費的關係信息:
- 解析位點 (parse模塊會記錄,上一次解析binlog到了什麼位置,對應組件爲:CanalLogPositionManager)
- 消費位點 (canal server在接收了客戶端的ack後,就會記錄客戶端提交的最後位點,對應的組件爲:CanalMetaManager)
對應的兩個位點組件,目前都有幾種實現:
- memory (memory-instance.xml中使用)
- zookeeper
- mixed
- period (default-instance.xml中使用,集合了zookeeper+memory模式,先寫內存,定時刷新數據到zookeeper上)
memory-instance.xml介紹:
所有的組件(parser , sink , store)都選擇了內存版模式,記錄位點的都選擇了memory模式,重啓後又會回到初始位點進行解析
特點:速度最快,依賴最少(不需要zookeeper)
場景:一般應用在quickstart,或者是出現問題後,進行數據分析的場景,不應該將其應用於生產環境
default-instance.xml介紹:
store選擇了內存模式,其餘的parser/sink依賴的位點管理選擇了持久化模式,目前持久化的方式主要是寫入zookeeper,保證數據集羣共享.
特點:支持HA
場景:生產環境,集羣化部署.
group-instance.xml介紹:
主要針對需要進行多庫合併時,可以將多個物理instance合併爲一個邏輯instance,提供客戶端訪問。
場景:分庫業務。 比如產品數據拆分了4個庫,每個庫會有一個instance,如果不用group,業務上要消費數據時,需要啓動4個客戶端,分別鏈接4個instance實例。使用group後,可以在canal server上合併爲一個邏輯instance,只需要啓動1個客戶端,鏈接這個邏輯instance即可.
canal.properties
CANAL 全局配置,該配置文件中除了 CANAL 基礎配置外,很多配置都可以被 instance.propeties 覆蓋,因此,可以將相對通用的配置置於該配置文件中,實例特殊配置置於實例配置文件中,《canal.properties參數》
instance.properties
CANAL 實例的配置文件,實例私有,存放實例的非共享配置,比如數據庫 IP,賬號,密碼等,《instance.properties參數》
注意:
- canal.instance.master.journal.name + canal.instance.master.position:精確指定一個 binlog 位點,進行啓動
- canal.instance.master.timestamp:指定一個時間戳,canal會自動遍歷mysql binlog,找到對應時間戳的binlog位點後,進行啓動
- 不指定任何信息:默認從當前數據庫的位點,進行啓動,可使用命令 show master status 查看
- mysql 解析關注表定義:標準的Perl正則,注意轉義時需要雙斜槓:\\
- 目前canal版本僅支持一個數據庫只有一種編碼,如果一個庫存在多個編碼,需要通過filter.regex配置,將其拆分爲多個canal instance,爲每個instance指定不同的編碼