docker中搭建canal監聽mysql例子

Limpid發表於2020-11-30

canal是眾所周知的阿里監聽解析mysql的binlog的工具,由於在本機使用時不方便直接執行,所以使用docker來部署mysql+canal,也可以加上canal-admin,下面直接展示:

部署mysql

本來mysql在容器啟動時可以新增引數配置log-bin和binlog-format但無法配置server_id導致容器無法啟動,所以使用預設配置啟動容器再進入容器修改配置方式
這裡可以不對映相關路徑,根據需求決定

//建立一個容器內網路
docker network create my_network
//構建mysql
docker run --name mysql-es --net my_network   -v /youdir:/var/lib/mysql   -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d  mysql:5.7.32

然後需要進入docker內部修改配置檔案,之所以沒有使用對映配置檔案路徑,因為配置對映後可能導致預設配置檔案丟失情況,正式使用時也可以重新打包mysql,不用每次都進去修改。

//進入docker中
docker exec -it mysql-es /bin/bash
//修改相關配置
cd /etc/mysql/mysql.conf.d/
echo 'log-bin=mysqlbin'>> mysqld.cnf
echo 'server_id=1' >> mysqld.cnf
echo 'binlog-format=ROW'>> mysqld.cnf
exit
//重啟該容器
docker restart mysql-es

在任意客戶端連線該mysql執行

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

啟動canal

這裡分為使用canal-admin和不適用兩種部署方式

  • 1.使用canal-admin
    先啟動canal-admin,這裡沒有讓canal-admin再接入mysql所以未對其加入mysql引數配置
    docker run --name mycanal-admin --net my_network --link mycanal:mycanal  -e server.port=8089 -e canal.adminUser=admin -e canal.adminPasswd=admin  --link mysql-es:db -p 8089:8089  -d  canal/canal-admin:v1.1.4
    再啟動canal
    docker run --name mycanal --net my_network -e canal.auto.scan=false  -e canal.destinations=test  -e canal.instance.master.address=db:3306   -e canal.instance.dbUsername=canal   -e canal.instance.dbPassword=canal   -e canal.instance.connectionCharset=UTF-8  -e canal.instance.tsdb.enable=true  -e canal.instance.gtidon=false -e canal.admin.manager=mycanal-admin:8089 -e canal.admin.port=11110 -e canal.admin.user=admin -e canal.admin.passwd=4ACFE3202A5FF5CF467898FC58AAB1D615029441  -p 11112:11112  -p 11111:11111 -p 11110:11110 --link mysql-es:db  -d canal/canal-server:v1.1.4
    這裡canal.admin.passwd引數,由於canal.admin設定密碼是admin,所有要使用mysql執行select password(‘admin’)檢視對應的加密後的值填入
    之所以先啟動admin再啟動canal-server,因為如果canal-server配置中有admin相關引數,而在啟動時無法連線到admin會導致啟動失敗。

至此瀏覽器登入localhost:8089,使用者名稱:admin,密碼:123456
可以看到正常顯示
另外在canal-server啟動時已經加入canal.destinations該引數相關配置,所以若是啟動正常,可以直接在canal-admin管理介面看到一個正常啟動的instance,若是沒有看到,有可能提示instance配置檔案不存在,此時直接在管理介面,手動新增一個instance,名稱為建立容器時canal.destinations的引數賦值的名稱即可

  • 2.不使用canal-admin方式
    因為canal-admin佔用記憶體不小,在同時開啟多個容器,比如es+mysql+canal+kibana+canal-admin,在本機往往撐不住,此時就放棄canal-admin,直接啟動canal:
    docker run --name sicanal --net my_network -e canal.auto.scan=false  -e canal.destinations=test  -e canal.instance.master.address=db:3306   -e canal.instance.dbUsername=canal   -e canal.instance.dbPassword=canal   -e canal.instance.connectionCharset=UTF-8  -e canal.instance.tsdb.enable=true  -e canal.instance.gtidon=false   -p 11112:11112  -p 11111:11111 -p 11110:11110 --link mysql-es:db  -d canal/canal-server:v1.1.4
    至於相關日誌和相關引數調整可以進入容器內部自行調整和檢視。

到此已經完成完成搭建部分的基礎邏輯,後續客戶端執行呼叫可參照官方文件根據自身語言進行後續編寫
最後說下這只是本機測試和開發時可以用的一個實現方式,正式環境還要考慮容器內部檔案儲存對映,記憶體管理等等因素

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章