docker 搭建canal
一、参考文献
二、环境
- 乌班图操作系统
- Docker 29.1.4
- Java 11.0.29
- rabbitMQ
三、前期准备
-
安装Java11
# 先更新源 sudo apt-get update # 安装java11 sudo apt-get install openjdk-11-jdk -y -
拉取canal镜像
-
# 拉取canal管理页面镜像 sudo docker pull canal/canal-admin # 拉取canal服务镜像 sudo docker pull canal/canal-server
-
-
在rabbitMQ中创建好相关内容,因为本教程是将canal监听到的变化放到rabbitMQ中
-
创建Exchange;名称:canal-exchange
-
创建Queue;名称:example_queue
-
点击创建好的Queues; 绑定一下交换机:交换机名称:canal-exchange;Routing Key:example
-
四、安装canal-admin
-
在官网 https://github.com/alibaba/canal/releases 的canal.admin-1.1.8-SNAPSHOT.tar.gz文件的解压包中找到canal_manager.sql,并在mysql中执行脚本。
-
修改配置文件
-
# 新建目录/mydata/canal/admin/conf,并新建application.yml文件 sudo mkdir -p /mydata/canal/admin/conf # 给权限 sudo chown 777 /mydata/canal # 创建并修改配置文件 sudo vim /mydata/canal/admin/conf/application.yml // application.yml 文件的内容 server: port: 8089 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 spring.datasource: address: mysql:3306 // canal_manager.sql的数据库地址 database: canal_manager // canal_manager.sql的数据库 username: root // 数据库账号 password: root // 数据库密码 driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false hikari: maximum-pool-size: 30 minimum-idle: 1 canal: adminUser: admin adminPasswd: 123456
-
-
创建canal-admin
-
# 创建docker网络 sudo docker network create canal_net # 创建canal-admin sudo docker run -d --name canal-admin \ -v /mydata/canal/admin/conf/application.yml:/home/admin/canal-admin/conf/application.yml \ -v /mydata/canal/admin/logs/:/home/admin/canal-admin/logs/ \ --network canal_net -p 8089:8089 canal/canal-admin
-
-
打开界面: 主机地址:8089
五、创建canal-server
-
# 创建配置文件 sudo mkdir -p /mydata/canal/conf/example sudo mkdir -p /mydata/canal/conf sudo mkdir -p /mydata/canal/logs # 先创建容器,用来拉取配置文件到主机上配置 docker run --name canal-server -d canal/canal-server # 拉取配置文件到主机上配置 docker cp canal-server:/home/admin/canal-server/conf/canal.properties /mydata/canal/conf/canal.properties docker cp canal-server:/home/admin/canal-server/conf/example/instance.properties /mydata/canal/conf/example/instance.properties -
canal.properties配置文件说明
-
# 配置文件声明(只涉及到调整到的,其他保持默认即可) # register ip to zookeeper # canal-server 服务自身的IP,因为运行 docker 时使用了 dockers network 网络,所以这里直接配置了 canal-server 的服务名 canal.register.ip = canal-server canal.port = 11111 canal.metrics.pull.port = 11112 # canal admin config 这里配置 canal-admin 的IP和端口,以便 canal-admin 管理页面能显示和配置canal 服务,注意用户名和密码来自于 canal-admin 服务配置的 aplication.yml 中的adminUser、adminPassword,默认都为 admin(4ACFE3202A5FF5CF467898FC58AAB1D615029441是admin加密字符串) canal.admin.manager = canal-admin:8089 canal.admin.port = 11110 canal.admin.user = admin # canal-admin的密码,用脚本创建的话默认是123456 canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 # admin auto register 自动注册 canal.admin.register.auto = true canal.admin.register.name = taskCanal # canal-server 的服务名 # tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ (canal服务模式,指监听到变化后发送到哪里) canal.serverMode = rabbitMQ # table meta tsdb info(数据库配置) canal.instance.tsdb.enable = true canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:} canal.instance.tsdb.url = jdbc:mysql://数据库地址:3306/taskdata?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&useSSL=false canal.instance.tsdb.dbUsername = root //数据库账号 canal.instance.tsdb.dbPassword = 000000 //数据库密码 #canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml canal.destinations = example # mq 配置 rabbitmq.host = 192.168.1.107 rabbitmq.virtual.host = / rabbitmq.exchange = canal-exchange rabbitmq.username = admin rabbitmq.password = admin123 rabbitmq.queue = example_queue # 这里不配置的话,好像会用canal.destinations的内容,所以前面交换机的routing Key 填了example rabbitmq.routingKey = rabbitmq.deliveryMode = direct
-
-
instance.properties配置文件说明(这个配置文件目前测试是没用的,要再admin管理页面上配置才生效,目前原因还不知道,有待研究)
-
# 监听的数据库消息 canal.instance.master.address=192.168.1.132:33061 canal.instance.dbUsername=root canal.instance.dbPassword=abc123456 # 监听的库名和表 # canal.instance.filter.regex=testdb\\.tast canal.instance.filter.regex=.*\\..*
-
-
创建canal-server
-
# 创建容器 sudo docker run --name canal-server -p 11111:11111 -d -v /mydata/canal/conf/example/instance.properties:/home/admin/canal-server/conf/example/instance.properties -v /mydata/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties -v /mydata/canal/logs/:/home/admin/canal-server/logs/ --network canal_net canal/canal-server
-
-
创建好后就会有服务
-
在界面上创建一个instance配置
-
![图像 6]()
-
![图像 7]()
-
配置内容:
-
################################################# ## mysql serverId , v1.0.26+ will autoGen # canal.instance.mysql.slaveId=0 # enable gtid use true/false canal.instance.gtidon=false # position info canal.instance.master.address=192.168.1.132:33061 canal.instance.master.journal.name= canal.instance.master.position= canal.instance.master.timestamp= canal.instance.master.gtid= # rds oss binlog canal.instance.rds.accesskey= canal.instance.rds.secretkey= canal.instance.rds.instanceId= # table meta tsdb info canal.instance.tsdb.enable=true #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb #canal.instance.tsdb.dbUsername=canal #canal.instance.tsdb.dbPassword=canal #canal.instance.standby.address = #canal.instance.standby.journal.name = #canal.instance.standby.position = #canal.instance.standby.timestamp = #canal.instance.standby.gtid= # username/password canal.instance.dbUsername=root canal.instance.dbPassword=abc123456 canal.instance.connectionCharset = UTF-8 # enable druid Decrypt database password canal.instance.enableDruid=false #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ== # table regex canal.instance.filter.regex=taskdata\\.task_scheduler_command # table black regex canal.instance.filter.black.regex=mysql\\.slave_.* # table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2) #canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch # table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2) #canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch # mq config canal.mq.topic=example # dynamic topic route by schema or table regex #canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..* canal.mq.partition=0 # hash partition config #canal.mq.partitionsNum=3 #canal.mq.partitionHash=test.table:id^name,.*\\..* #################################################
-
-
配置好后修改task_scheduler_command表的内容后,在mq上就可以看到消息了
-









浙公网安备 33010602011771号