基於binlog的canal到redis的同步


步驟1:安裝canal

wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
tar zvfx canal.deployer-1.1.4.tar.gz

 

 

步驟2:配置my.cnf,創建canal用戶並重啟mysql

[mysqld]
log-bin=mysql-bin # 開啟Binlog
binlog-format=ROW # 設置Binlog格式為ROW
server_id=1 # 配置一個ServerID

  

 

 創建一個canal賬戶

CREATE USER canal IDENTIFIED BY 'canal123456'; 
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;

 

重啟一下 MySQL,確保所有的配置生效。

systemctl start mysqld

 

重啟后檢查一下當前的 Binlog 文件和位置

 

 

 

步驟3:配置canal

編輯instance.properties
vim /usr/local/software/canal/conf/example/instance.properties

canal.instance.gtidon=false


# position info
canal.instance.master.address=127.0.0.1:3306 canal.instance.master.journal.name=mysql-bin.000001 canal.instance.master.position=777 canal.instance.master.timestamp= canal.instance.master.gtid= # username/password canal.instance.dbUsername=canal canal.instance.dbPassword=xxxxxxx canal.instance.connectionCharset = UTF-8 canal.instance.defaultDatabaseName=test # table regex canal.instance.filter.regex=.*\\..

 

 

 

步驟4:啟動canal


Canal 服務啟動后,會開啟一個端口(11111)等待客戶端連接,客戶端連接上 Canal 服務之后,可以從 Canal 服務拉取數據,每拉取一批數據,進行業務處理之后,給 Canal 服務返回處理成功的響應。
如果發生客戶端程序宕機或者處理失敗等異常情況,Canal 服務沒收到處理成功的響應,下次客戶端來拉取的還是同一批數據,這樣就可以保證順序並且不會丟數據。

 

 

步驟5:本地環境搭建並測試

本地需要安裝redis,以及編寫同步代碼,代碼可以參考:https://github.com/liyue2008/canal-to-redis-example

然后啟動工程,canal將連接到canal服務端,canal服務端能夠將從指定的binlog位置同步數據下來解析。

這里解釋下原理:

  • Canal 模擬 MySQL 主從復制的交互協議,把自己偽裝成一個 MySQL 的從節點,向 MySQL 主節點發送 dump 請求,

MySQL 收到請求后,就會開始推送 Binlog 給 Canal,Canal 解析 Binlog 字節流之后,轉換為便於讀取的結構化數據,

供下游程序訂閱使用.

  • 客戶端連接上 Canal 服務之后,可以從 Canal 服務拉取數據,每拉取一批數據,正確寫入 Redis 之后,給 Canal 服務

返回處理成功的響應。

  • 如果發生客戶端程序宕機或者處理失敗等異常情況,Canal 服務沒收到處理成功的響應,下次客戶端來拉取的還是同一

批數據,這樣就可以保證順序並且不會丟數據。

更新數據庫的一條記錄,canal客戶端將從服務端拉取到更新后的數據出來解析。

 

 

 

 

 

 然后在redis查詢get canal:

 

 

 這樣就完成了基於binlog的canal到redis的同步!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM