docker中搭建canal监听mysql例子

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 协议》,转载必须注明作者和本文链接
讨论数量: 2

canal启动过一会就自动重启是什么原因?docker logs canal 也没显示原因

2年前 评论
Limpid (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!