1.前言
很多時候,我們很多業務場景可能只需要同步多個或者單個數據庫多個或者單個表的數據,canal提供了多實例(Instance)功能讓我們可以處理這些業務場景。廢話少說,讓我們來學習下這塊知識點。
2.前期准備
| 服務名稱 |
IP/域名 |
端口 |
| zookeeper |
192.168.142.129,192.168.142.130,192.168.142.131 |
2181 |
| mysql |
192.168.142.131 |
3306 |
| rabbitmq |
192.168.18.230 |
5672 |
2.1RabbitMQ參數
虛擬主機(Virtual hosts):Canal
交換器(Exchanges):exchange.canal
路由key(Routing key):routing.quote、routing.supplier
隊列(Queues):quote_example、supplier_example
3.兩個實例(Instance)監聽相同數據庫

先從conf目錄下拷貝兩份example實例,具體操作命令如下:
//供應商報價實例 cp -r /home/deng/canal/canal.deployer/conf/example /home/deng/canal/canal.deployer/conf/quote_example //供應商實例 cp -r /home/deng/canal/canal.deployer/conf/example /home/deng/canal/canal.deployer/conf/supplier_example
如圖所示:
客戶端我們還是沿用上章節MQ(解析兩個實例數據),這里不做代碼如何解析數據了。
●修改canal.properties配置,把之前創建supplier_example、quote_example兩個實例配置到canal.destinations選項去(如果配置集群,記得每個canal服務配置都要修改):
vi conf/canal.properties
canal.destinations = quote_example,supplier_example
並找到RabbitMQ標題欄配置MQ配置:
################################################## ######### RabbitMQ ############# ################################################## rabbitmq.host = 192.168.18.230 --MQ連接地址 rabbitmq.virtual.host = Canal --virtualHost rabbitmq.exchange = exchange.canal --交換器名稱 rabbitmq.username = admin --MQ登錄用戶名 rabbitmq.password = 123456 --MQ登錄密碼 rabbitmq.deliveryMode = 2 --投遞模式,實現消息持久化:1.非持續性,2.持續性
●兩個實例(quote_example、supplier_example)instance.properties配置相同參數(不知道這幾個參數是什么含義,可以翻看我之前寫的文章或者查看官網):
canal.instance.master.address=192.168.142.131:3306 --數據庫連接地址 canal.instance.dbUsername=canal --數據庫登錄用戶名 canal.instance.dbPassword=qwer1234 --數據庫登錄密碼
●修改quote_example. instance.properties配置:
vi conf/quote_example/instance.properties
canal.mq.topic=routing.quote --MQ路由鍵
canal.instance.filter.regex=ebs_material.supplier_quote --數據解析關注的表(格式:數據庫.表)
●修改supplier_example. instance.properties配置
vi conf/supplier_example/instance.properties
canal.mq.topic=routing.supplier --MQ路由鍵
canal.instance.filter.regex=ebs_material.supplier --數據解析關注的表(格式:數據庫.表)
●清空rabbitmq消息,然后執行如下sql語句:
INSERT INTO ebs_material.supplier_quote (PN,Brand,StockQty,SupplierId,CreateTime) VALUES ('LM358DT','TI',10000,1,'2022-02-14 00:00:00'); INSERT INTO ebs_material.supplier (Name,CreateTime) VALUES ('艾睿','2022-02-14 00:00:00');
登錄rabbitmq管理后台我們會看到只有兩條待消費的消息(supplier_quote和supplier表插入行數據):


4.兩個實例(Instance)監聽不相同數據庫

canal兩個實例(Instance)監聽不同數據庫數據同步,其實也只是把每個實例連接數據庫地址等配置修改下就可以了,其他配置跟上面小節基本一樣的,想了解可以自行到官網查看,這里就不多說了,請大伙自行配置測試。
5. mysql數據解析關注的和Perl正則表達式
Canal為我們提供了canal.instance.filter.regex與canal.instance.filter.black.regex選項參數來過濾數據庫表數據解析,類似黑白名單。常見例子有:
●所有表:.* or .*\\..*
●canal schema下所有表:canal\\..*
●canal下的以canal打頭的表:canal\\.canal.*
●canal schema下的一張表:canal\\.test1
●多個規則組合使用:canal\\..*,mysql.test1,mysql.test2 (逗號分隔)
注:多個正則之間以逗號(,)分隔,轉義符需要雙斜杠(\\)
6.錯誤處理
如果canal啟動時候從日志看到報這個錯誤:can't find start position for example。有如下解決方法:
●單機
刪除meta.dat文件,重啟canal,問題解決。
●集群
進入canal對應的zookeeper集群下,刪除節點/otter/canal/destinations/實例/1001/cursor,重啟canal即可恢復(不懂命令可以到zookeeper官網或者百度查找操作命令)。
參考文獻:
Canal Kafka/RocketMQ QuickStart
AdminGuide
