工作原理
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
canal 解析 binary log 对象(原始为 byte 流)
实现场景: canal-admin管理canal,canal读取mysql的增量bin-log数据,发送至kafka,然后服务端消费kafka队列,实现数据监控功能
1.canal-admin 安装
canal-admin 官方参考文档 : https://github.com/alibaba/canal/wiki/Canal-Admin-Docker
# 下载脚本
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run_admin.sh
# 以8089端口启动canal-admin
sh run_admin.sh -e server.port=8089 \
-e canal.adminUser=admin \
-e canal.adminPasswd=admin
# 指定外部的mysql作为admin的库
sh run_admin.sh -e server.port=8089 \
-e spring.datasource.address=xxx \
-e spring.datasource.database=xx \
-e spring.datasource.username=xx
-e spring.datasource.password=xx
- run_admin.sh 中封装的是 docker run 的命令
以下截取run_admin.sh
cmd="docker run -d -it -h $LOCALHOST $CONFIG --name=canal-admin $VOLUMNS $NET_MODE $PORTS $MEMORY canal/canal-admin"
echo $cmd
eval $cmd
- 实际输出的docker命令
root@picbook-preprod:/opt/kafka/canal# sh run_admin.sh -e server.port=8089 \
> -e canal.adminUser=admin \
> -e canal.adminPasswd=admin
docker run -d -it -h 0 -e server.port=8089 -e canal.adminUser=admin -e canal.adminPasswd=admin --name=canal-admin --net=host -m 1024m canal/canal-admin
- 如果不想使用host的网络模式的话,可以修改sh文件在其中添加端口映射,或者直接运行以下docker run命令
docker run -d -it -h 0 \
-e server.port=8089 \
-e canal.adminUser=admin \
-e canal.adminPasswd=admin \
--name=canal-admin \
-p 8089:8089 \
-m 1024m canal/canal-admin
- 1.访问 canal-admin, ip:8089
-
2.在-集群管理-配置主配置文件
配置zk地址
主配置1
主配置2
主配置3
-
2.在-instance管理-配置
instance管理
2.canal-server 安装
官方参考文档: canal-server: https://github.com/alibaba/canal/wiki/Docker-QuickStart
# 下载脚本
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh
root@picbook-preprod:/opt/kafka/canal# sh run.sh -e canal.admin.manager=47.111.29.234:8089 \
> -e canal.admin.port=11110 \
> -e canal.admin.port=11110 \
> -e canal.admin.user=admin \
> -e canal.admin.passwd=4ACFE3202A5FF5CF467898FC58AAB1D615029441 \
> -e canal.admin.register.cluster=online
docker run -d -it -h 0 -e canal.admin.manager=47.111.29.234:8089 -e canal.admin.port=11110 -e canal.admin.port=11110 -e canal.admin.user=admin -e canal.admin.passwd=4ACFE3202A5FF5CF467898FC58AAB1D615029441 -e canal.admin.register.cluster=online --name=canal-server --net=host -m 4096m canal/canal-server
- 执行sh脚本默认使用host网络模式,如果不想使用docker host网络模式,修改sh文件,或者直接使用以下docker run命令
# 其中 4ACFE3202A5FF5CF467898FC58AAB1D615029441 是字符 'admin' 在mysql下password函数加密后的字符串结果
docker run -d -it -h 0 -e canal.admin.manager={canal-admin的ip地址}:8089 \
-e canal.admin.port=11110 \
-e canal.admin.port=11110 \
-e canal.admin.user=admin \
-e canal.admin.passwd=4ACFE3202A5FF5CF467898FC58AAB1D615029441 \
-e canal.admin.register.cluster=online \
--name=canal-server \
-p 11110:11110 \
-p 11111:11111 \
-p 11112:11112 \
-p 9100:9100 \
-m 4096m canal/canal-server
- 运行成功后,canal将自动注册到canal-admin中,在canal-admin web页面中的
主页/Canal Server/Server 管理 能看到新注册的server
3.测试
测试 canal.serverMode=tcp模式下,canal解析bin-log
执行 https://github.com/alibaba/canal/wiki/ClientExample
测试 canal.serverMode=kafka 模式下,canal解析bin-log->kafka->java服务端消费者消费
执行 https://github.com/sunzsh/canaldemo.git
参考:
https://github.com/alibaba/canal/wiki
https://blog.csdn.net/daziyuanazhen/article/details/106098887