前言
- mysql 8.0版本 数据库为dtm_busi
- 在docker网络bridge -promexus_monitoring网络,
- 容器内用容器名称访问,防止ip变更
- 确保数据库用户名密码可在终端访问成功
- golang客户端监听GitHub - withlin/canal-go: Alibaba mysql database binlog incremental subscription & consumer components Canal's golang client[阿里巴巴mysql数据库binlog的增量订阅&消费组件 Canal 的 go 客户端 ] https://github.com/alibaba/canal
以下docker-compose文件 持久卷地址都是我们相对地址
canal docker-compose 文件
创建桥接网络
docker network create promexus_monitoring
version: '3.8'
services:
canal-server:
image: canal/canal-server:latest
container_name: canal-server
ports:
- "11111:11111"
- "11112:11112"
environment:
- canal.auto.scan=false
# destinations名称可自定义与数据库名称无强依赖
- canal.destinations=dtm_busi
- canal.auto.scan.interval = 5
- canal.instance.master.address=mysql-latest:3306
# mysql 复制账号
- canal.instance.dbUsername=canal
- canal.instance.dbPassword=canal
- canal.instance.mysql.slaveId=222
# mysql 需要监听的数据库
- canal.instance.filter.regex=dtm_busi.*
- canal.instance.tsdb.enable=false
volumes:
- ./canal.properties:/canal-server/conf/canal.properties
# - ./dtm_busi/instance.properties:/canal-server/conf/dtm_busi/instance.properties
- ./logs:/home/admin/canal-server/logs
networks:
- promexus_monitoring
networks:
promexus_monitoring:
external: true
volumes:
db_datadd:
driver: local
运行
docker-compose up -d
mysql docker-compose
version: '3.8'
services:
db:
image: mysql:8.0.13
container_name: mysql-latest
environment:
MYSQL_ROOT_PASSWORD: sa123456
MYSQL_DATABASE: test
MYSQL_USER: sa
MYSQL_PASSWORD: sa123456
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
- ./my.cnf:/etc/mysql/my.cnf # 确保缩进正确
restart: always
networks:
- promexus_monitoring
volumes:
db_data:
driver: local
networks:
promexus_monitoring:
external: true
# docker run -d \
# --name mysql-latest \
# -e MYSQL_ROOT_PASSWORD=sa123456 \
# -e MYSQL_USER=sa \
# -e MYSQL_PASSWORD=sa123456 \
# -e MYSQL_DATABASE=test\
# -p 3306:3306 \
# -v db_data:/var/lib/mysql \
# mysql:latest
my.cnf文件
[mysqld]
log_timestamps=SYSTEM
default-time-zone='+8:00'
server-id=1
log-bin=mysql-bin
binlog_format=ROW
数据库账号密码设置
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal'; --创建账号密码
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; --账号密码授权
select host,user,plugin from mysql.user ;
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal'; --user表plugin 需要为mysql_native_password类型
GRANT ALL PRIVILEGES ON dtm_busi.* TO 'canal'@'%'; --给canal用户授权
FLUSH PRIVILEGES; --刷新权限 重启数据库
实战
golang客户端监听,完整代码访问github客户端获取
func main() {
// 192.168.199.17 替换成你的canal server的地址
// example 替换成-e canal.destinations=example 你自己定义的名字
connector := client.NewSimpleCanalConnector("localhost", 11111, "", "", "dtm_busi", 60000, 60*60*1000)
err := connector.Connect()
if err != nil {
log.Println(err)
os.Exit(1)
}
// https://github.com/alibaba/canal/wiki/AdminGuide
//mysql 数据解析关注的表,Perl正则表达式.
//
//多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
//
//常见例子:
//
// 1. 所有表:.* or .*\\..*
// 2. canal schema下所有表: canal\\..*
// 3. canal下的以canal打头的表:canal\\.canal.*
// 4. canal schema下的一张表:canal\\.test1
// 5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
err = connector.Subscribe(".*\\..*")
if err != nil {
log.Println(err)
os.Exit(1)
}
for {
message, err := connector.Get(100, nil, nil)
if err != nil {
log.Println(err)
os.Exit(1)
}
batchId := message.Id
if batchId == -1 || len(message.Entries) <= 0 {
time.Sleep(3 * time.Second)
fmt.Println("===没有数据了===")
continue
}
printEntry(message.Entries)
}
}
监听到数据变更
参考资料
docker-compose-canal-server.yml · 鱼皮花生/docker-compose - Gitee.com
docker-compose 部署 Canal(直击docker-compose配置文件)_docker-compose安装 canal server admin-CSDN博客