创建文件夹
mkdir -p {data/mysql/data,data/mysql/conf,data/canal/logs,data/canal/conf/example,data/mq/broker/conf}
compose 文件 ( 注意版本信息 )
services:
mysql:
image: mysql:8.0.35
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_USER: canal
MYSQL_PASSWORD: canal
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- ./data/mysql/conf/my.cnf:/etc/mysql/my.cnf
- ./data/mysql/data:/var/lib/mysql
networks:
- canal-network
# RocketMQ Namesrv
rmqnamesrv:
image: apache/rocketmq:5.3.1
container_name: rmqnamesrv
ports:
- 9876:9876
networks:
- canal-network
command: sh mqnamesrv
# RocketMQ Broker
rmqbroker:
image: apache/rocketmq:5.3.1
container_name: rmqbroker
ports:
- 10911:10911
environment:
- NAMESRV_ADDR=rmqnamesrv:9876
- JAVA_OPT_EXT=-Drocketmq.namesrv.addr=rmqnamesrv:9876
volumes:
- ./data/mq/broker.conf:/home/rocketmq/rocketmq-5.3.1/conf/broker.conf
command: sh mqbroker -c /home/rocketmq/rocketmq-5.3.1/conf/broker.conf
depends_on:
- rmqnamesrv
networks:
- canal-network
# Canal Server
canal-server:
image: canal/canal-server:v1.1.7
container_name: canal
depends_on:
- mysql
- rmqbroker
environment:
- canal.auto.scan=false
- TZ=Asia/Shanghai # 修复时区
volumes:
# - ./data/conf/canal.properties:/home/admin/canal-server/conf/canal.properties
# - ./data/conf/example/instance.properties:/home/admin/canal-server/conf/example/instance.properties
- ./data/canal/logs:/home/admin/canal-server/logs
networks:
- canal-network
# RocketMQ Dashboard
mq-dashboard:
image: apacherocketmq/rocketmq-dashboard:latest
container_name: mq-dashboard
ports:
- 8080:8080
environment:
JAVA_OPTS: -Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
depends_on:
- rmqnamesrv
networks:
- canal-network
proxy:
image: apache/rocketmq:5.3.1
container_name: rmqproxy
networks:
- canal-network
depends_on:
- rmqbroker
- rmqnamesrv
ports:
- 8081:8081
restart: on-failure
environment:
- NAMESRV_ADDR=rmqnamesrv:9876
command: sh mqproxy
networks:
canal-network:
driver: bridge
启动 docker-compose 拷贝数据
docker cp canal:/home/admin/canal-server/conf/example/instance.properties ./data/canal/conf/example
docker cp canal:/home/admin/canal-server/conf/canal.properties ./data/canal/conf
修改如下配置项
nano ./data/canal/conf/canal.properties
canal.serverMode = rocketMQ
##################################################
######### RocketMQ #############
##################################################
rocketmq.producer.group = canal-producer-group
rocketmq.enable.message.trace = false
rocketmq.customized.trace.topic = canal_test
rocketmq.namespace =
rocketmq.namesrv.addr = 192.168.0.101:9876 # 对应的服务器ip
rocketmq.retry.times.when.send.failed = 0
rocketmq.vip.channel.enabled = false
rocketmq.tag = cannal_tag
nano ./data/canal/conf/example/instance.propertie
# MySQL连接信息
canal.instance.mysql.slaveId=1234 # 这里只要跟主机不冲突就行
# 根据实践情况配
canal.instance.master.address=mysql:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset=UTF-8
canal.mq.topic=canal_test
# 过滤规则(监听所有库)
canal.instance.filter.regex=.*\..*
nano ./data/mysql/conf/my.cnf
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server-id=1
gtid-mode=on
enforce-gtid-consistency=1
log-slave-updates=1
nano ./data/mq/broker.conf
brokerClusterName = DefaultCluster
#brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 192.168.0.101 # 对应服务的ip
# 指定监听端口
listenPort = 10911
autoCreateTopicEnable=true
解开 canal 的数据挂载 , 然后
docker-compose down && docker-compose up-d
检查所有的日志文件是否报错
进入 mysql 检查 binlog 是否启动
docker exec -it mysql bash
SHOW VARIABLES LIKE 'log_bin'; -- 必须返回ON
SHOW VARIABLES LIKE 'binlog_format'; -- 必须返回ROW
设置权限
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
校验结果
CREATE DATABASE test;
USE test;
CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO user VALUES(1, 'test');
登录 ip:8080 的 mq 界面, 查看是否成功转发数据
至此 , 收工