大家好,我是不才陳某~
資料同步一直是一個令人頭疼的問題。在業務量小,場景不多,資料量不大的情況下我們可能會選擇在項目中直接寫一些定時任務手動處理資料,例如從多個表将資料查出來,再彙總處理,再插入到相應的地方。
但是随着業務量增大,資料量變多以及各種複雜場景下的分庫分表的實作,使資料同步變得越來越困難。
今天這篇文章使用阿裡開源的中間件Canal解決資料增量同步的痛點。
文章目錄如下:

canal譯意為水道/管道/溝渠,主要用途是基于 MySQL 資料庫增量日志解析,提供增量資料訂閱和消費。
從這句話了解到了什麼?
基于MySQL,并且通過MySQL日志進行的增量解析,這也就意味着對原有的業務代碼完全是無侵入性的。
工作原理:解析MySQL的binlog日志,提供增量資料。
基于日志增量訂閱和消費的業務包括
資料庫鏡像
資料庫實時備份
索引建構和實時維護(拆分異構索引、反向索引等)
業務 cache 重新整理
帶業務邏輯的增量資料處理
目前的 canal 支援源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x。
官方文檔:https://github.com/alibaba/canal
先來一張官方圖:
Canal分為服務端和用戶端,這也是阿裡常用的套路,比如前面講到的注冊中心Nacos:
服務端:負責解析MySQL的binlog日志,傳遞增量資料給用戶端或者消息中間件
用戶端:負責解析服務端傳過來的資料,然後定制自己的業務處理。
目前為止支援的消息中間件很全面了,比如Kafka、RocketMQ,RabbitMQ。
有,當然有,還有一些開源的中間件也是相當不錯的,比如Bifrost。
常見的幾款中間件的差別如下:
當然要我選擇的話,首選阿裡的中間件Canal。
服務端需要下載下傳壓縮包,下載下傳位址:https://github.com/alibaba/canal/releases
目前最新的是v1.1.5,點選下載下傳:
下載下傳完成解壓,目錄如下:
本文使用Canal+RabbitMQ進行資料的同步,是以下面步驟完全按照這個base進行。
修改MySQL的日志檔案,my.cnf 配置如下:
需要設定服務端配置檔案中的MySQL配置,這樣Canal才能知道需要監聽哪個庫、哪個表的日志檔案。
一個 Server 可以配置多個執行個體監聽 ,Canal 功能預設自帶的有個 example 執行個體,本篇就用 example 執行個體 。如果增加執行個體,複制 example 檔案夾内容到同級目錄下,然後在 <code>canal.properties</code> 指定添加執行個體的名稱。
修改canal.deployer-1.1.5\conf\example\instance.properties配置檔案
服務端預設的傳輸方式是tcp,需要在配置檔案中設定MQ的相關資訊。
這裡需要修改兩處配置檔案,如下;
1、canal.deployer-1.1.5\conf\canal.properties
這個配置檔案主要是設定MQ相關的配置,比如URL,使用者名、密碼...
2、canal.deployer-1.1.5\conf\example\instance.properties
這個檔案設定MQ的路由KEY,這樣才能路由到指定的隊列中,如下:
在RabbitMQ中需要建立一個canal.exchange(必須和配置中的相同)的exchange和一個名稱為 canal.queue(名稱随意)的隊列。
其中綁定的路由KEY為:canal.routing.key(必須和配置中的相同),如下圖:
點選bin目錄下的腳本,windows直接輕按兩下startup.bat,啟動成功如下:
在本地資料庫test中的oauth_client_details插入一條資料,如下:
此時檢視MQ中的canal.queue已經有了資料,如下:
其實就是一串JSON資料,這個JSON如下:
每個字段的意思已經很清楚了,有表名稱、方法、參數、參數類型、參數值.....
用戶端要做的就是監聽MQ擷取JSON資料,然後将其解析出來,處理自己的業務邏輯。
用戶端很簡單實作,要做的就是消費Canal服務端傳遞過來的消息,監聽canal.queue這個隊列。
MQ傳遞過來的是JSON資料,當然要建立個實體類接收資料,如下:
接下來就是監聽隊列,一旦有Canal服務端有資料推送能夠及時的消費。
代碼很簡單,隻是給出個接收的案例,具體的業務邏輯可以根據業務實作,如下:
下面向表中插入資料,看下接收的消息是什麼樣的,SQL如下:
用戶端轉換後的消息如下圖:
上圖可以看出所有的資料都已經成功接收到,隻需要根據資料完善自己的業務邏輯即可。
資料增量同步的開源工具并不隻有Canal一種,根據自己的業務需要選擇合适的元件。
本文來自部落格園,作者:不才陳某,轉載請注明原文連結:https://www.cnblogs.com/cbvlog/p/15735893.html
歡迎關注個人公衆号:碼猿技術專欄