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引數配置
再啟動canaldocker 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.admin.passwd引數,由於canal.admin設定密碼是admin,所有要使用mysql執行select password(‘admin’)檢視對應的加密後的值填入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
之所以先啟動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 協議》,轉載必須註明作者和本文連結