SpringBoot系列之整合阿里canal監聽MySQL Binlog

Ruthless發表於2022-03-03

1、什麼是阿里canal?
canal是阿里開源的,對資料庫增量日誌解析,提供增量資料訂閱和消費的元件。引用官網的圖片,canal的工作原理主要是模擬 MySQL slave 的互動協議,偽裝自己為 MySQL slave,向master傳送dump 協議,獲取到資料後,解析 binary log 物件資料。

 

 

2、canal環境搭建
本文基於Window系統。

使用canal需要確保資料庫開啟了binlog:

show variables like'log_%';

如果沒開啟,在mysql my.ini配置檔案新增配置,注意檔案記憶體為的時候,注意編碼格式必須為ANSI,不然會編譯報錯

[mysqld]
# 開啟 binlog
log-bin=mysql-bin 
# 選擇 ROW 模式
binlog-format=ROW
# 配置 MySQL replaction 需要定義,不要和 canal 的 slaveId 重複
server_id=1

 

配置檔案修改是否正確,使用命令,檢視日誌

mysqld --console

 

重啟MySQL例項

net stop mysql
net start mysql

 

binlog開啟後,建立一個canal使用者並授權,官網配置是@%,表示所有伺服器,因為本地測試的,所以改為localhost就可以

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

 

下載canal服務端,到官網releases下載對應資料,canal.deployer-1.1.5.tar.gz是服務端,解壓後在conf資料夾裡找到\example\instance.properties,修改資料庫配置資訊,dbUsername,dbPassword資料庫賬號密碼

# position info(master資料庫配置)
canal.instance.master.address=gz-cdb-l5ixwzm1.sql.tencentcdb.com:59039
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# username/password(使用者名稱密碼)
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal1uo#A#9R
# 加上預設資料庫
canal.instance.defaultDatabaseName=tajiax_canal 
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

 

檢視canal例項名稱,檔案在D:\dev\canal.deployer-1.1.5\conf\canal.properties:

canal.destination=example

到canal伺服器安裝目錄D:\dev\canal.deployer-1.1.5\bin,找到startup.bat執行。

在碼雲有示例->\ly\canal-application

3、Canal客戶端測試
JDK 1.8
SpringBoot2.2.1
Maven 3.2+
開發工具
IntelliJ IDEA
smartGit

3.1、引入依賴

<dependency>
    <groupId>top.javatool</groupId>
    <artifactId>canal-spring-boot-starter</artifactId>
    <version>1.2.1-RELEASE</version>
</dependency>

 

3.2、配置canal
# canal例項名稱,要跟canal-server執行時設定的destination一致

# D:\dev\canal.deployer-1.1.5\conf\canal.properties
canal.destination=example
# canal預設監聽埠
canal.server=127.0.0.1:11111
logging.level.top.javatool.canal.client=warn

 

3.3、編寫監聽器,監聽Canal訊息

package com.lynch.entity;

import org.springframework.stereotype.Component;

import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

@CanalTable("tb_user")
@Component
public class UserHandler implements EntryHandler<UserEntity> {

//    @Autowired
//    private RedisHandler redisHandler;
//    @Autowired
//    private Cache<Long, Item> itemCache;

    @Override
    public void insert(UserEntity item) {
        System.out.println("insert," + item);
        // 寫資料到JVM程式快取
        //itemCache.put(item.getId(), item);
        // 寫資料到redis
        //redisHandler.saveItem(item);
    }

    @Override
    public void update(UserEntity before, UserEntity after) {
        System.out.println("update before," + before);
        System.out.println("update after," + after);
        // 寫資料到JVM程式快取
        //itemCache.put(after.getId(), after);
        // 寫資料到redis
        //redisHandler.saveItem(after);
    }

    @Override
    public void delete(UserEntity item) {
        System.out.println("delete," + item);
        // 刪除資料到JVM程式快取
        //itemCache.invalidate(item.getId());
        // 刪除資料到redis
        //redisHandler.deleteItemById(item.getId());
    }
}

當表tb_user進行insert、update、delete操作時,會發現監控已生效。

注意:更改canal例項名稱為canaltest
1、在D:\dev\canal.deployer-1.1.5\conf目錄下,把example資料夾改成canaltest
2、在D:\dev\canal.deployer-1.1.5\conf\canal.properties檔案中,找到canal.destination配置項改為canaltest
3、修改canal配置
canal.destination=canaltest

相關文章