Docker 部署Canel 并且配置ES与MySQL 的数据同步
前期配置
开启MySQL binlog日志
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
创建 Canal 用户并授权
CREATE USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal_password';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
安装可视化工具 CanalAdmin
使用启动脚本启动(推荐):
创建canal_manager
数据库,并导入SQL文件:
https://github.com/alibaba/canal/blob/master/admin/admin-web/src/main/resources/canal_manager.sql
拉取镜像:
docker pull canal/canal-admin:v1.1.8
获取官方脚本
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run_admin.sh
运行脚本
sh run_admin.sh -e server.port=8089 \-e spring.datasource.address=127.0.0.1:3306 \-e spring.datasource.database=canal_manager \-e spring.datasource.username=canal \-e spring.datasource.password=canal_password \-e canal.adminUser=admin \-e canal.adminPasswd=admin
注意,这里连接 canal_manager数据的用户需要有对应的权限(修改表结构),最好单独分配一个用户专门用于canal_manager
查看运行情况
[root@Centos ~]# docker logs canal-admin
DOCKER_DEPLOY_TYPE=VM
==> INIT /alidata/init/02init-sshd.sh
==> EXIT CODE: 0
==> INIT /alidata/init/fix-hosts.py
==> EXIT CODE: 0
==> INIT DEFAULT
==> INIT DONE
==> RUN /home/admin/app.sh
==> START ...
start admin ...
登录 http:ip:8089/
启动错误原因排查:
- 检查环境变量中的数据库信息是否配置正确
- Canal Admin登录报错:
检查 canal_manager
中是否正确已经导入了SQL文件。
检查 登录的账号是否有对应的权限。
- Canal Admin 中 无法查看 运行的Canal Server:
重新启动一遍 canal server
启动 Canal Server
使用docker部署(推荐)
拉取镜像:
docker pull canal/canal-server:v1.1.8
获取官方部署脚本文件:
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh
采用Canal Admin 时使用下面的命令(推荐)
sh run.sh -e canal.admin.manager=127.0.0.1:8089 \-e canal.admin.port=11110 \-e canal.admin.user=admin \-e canal.admin.passwd=4ACFE3202A5FF5CF467898FC58AAB1D615029441
构建一个名为example的 instance 队列
sh run.sh -e canal.auto.scan=false \-e canal.destinations=example \-e canal.instance.master.address=127.0.0.1:3306\-e canal.instance.dbUsername=canal \-e canal.instance.dbPassword=canal_password \-e canal.instance.connectionCharset=UTF-8 \-e canal.instance.tsdb.enable=true \-e canal.instance.gtidon=false \
注意修改为自己的数据库地址和Canal账号密码
查看运行情况:
docker logs canal-server
显示:
start canal successful
==> START SUCCESSFUL ...
==> STOP
stop canal
stop canal successful ...
bash: killall: command not found
==> STOP SUCCESSFUL ...
DOCKER_DEPLOY_TYPE=VM
==> INIT /alidata/init/02init-sshd.sh
==> EXIT CODE: 0
==> INIT /alidata/init/fix-hosts.py
==> EXIT CODE: 0
==> INIT DEFAULT
==> INIT DONE
==> RUN /home/admin/app.sh
==> START ...
start canal ...
start canal successful
==> START SUCCESSFUL ...
使用本地部署(使用Docker部署时忽略)
拉取项目:
wget https://github.com/alibaba/canal/releases/download/canal-1.1.8/canal.deployer-1.1.8.tar.gz
新建文件夹并解压:
mkdir canal-server
tar -zxvf canal.deployer-1.1.8.tar.gz -C canal-server/
进入解压后的目录:
-
配置修改
vi conf/example/instance.properties
## mysql serverId canal.instance.mysql.slaveId = 1234 #position info,需要改成自己的数据库信息 canal.instance.master.address = 127.0.0.1:3306 canal.instance.master.journal.name = canal.instance.master.position = canal.instance.master.timestamp = #canal.instance.standby.address = #canal.instance.standby.journal.name = #canal.instance.standby.position = #canal.instance.standby.timestamp = #username/password,需要改成自己的数据库信息 canal.instance.dbUsername = canal canal.instance.dbPassword = canal canal.instance.defaultDatabaseName = canal.instance.connectionCharset = UTF-8 #table regex canal.instance.filter.regex = .\*\\\\..\*
如图:
创建 example instance 并启动
打开 Canal-admin ,点击左侧 Instance 管理,点击载入模板。
查看对应日志:
2025-03-28 07:28:24.041 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position
2025-03-28 07:28:24.041 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position just show master status
2025-03-28 07:28:24.051 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN c.a.otter.canal.parse.inbound.mysql.MysqlConnection - load MySQL @@version_comment : MySQL Community Server - GPL
2025-03-28 07:28:24.330 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=binlog.000023,position=56223,serverId=1,gtid=,timestamp=1743144102000] cost : 276ms , the next step is binlog dump
2025-03-28 07:28:24.374 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN c.a.otter.canal.parse.inbound.mysql.MysqlConnection - load MySQL @@version_comment : MySQL Community Server - GPL
出现 find start position successfully,表示成功!
部署Canal Adapter
拉取 canal adapter
wget https://github.com/alibaba/canal/releases/download/canal-1.1.8/canal.adapter-1.1.8.tar.gz
解压并进入文件
mkdir canal-adapter-1.1.8
tar -zxvf canal.adapter-1.1.8.tar.gz -C /root/canal.adapter-1.1.8
cd canal-adapter-1.1.8/
vim conf/application.yml
修改为自己的对应数据库信息
在根目录启动:
sh bin/startup.sh
查看日志输出:
监控到数据库的变更日志即成功!
验证 MySQL数据同步到Elasticsearch
部署elasticsearch+ Kibana
创建 docker compose
文件
services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0container_name: elasticsearchenvironment:- discovery.type=single-node- ES_JAVA_OPTS=-Xms512m -Xmx512mports:- "9200:9200"- "9300:9300"volumes:- esdata:/usr/share/elasticsearch/datanetworks:- elkkibana:image: docker.elastic.co/kibana/kibana:7.17.0container_name: kibanaports:- "5601:5601"environment:- ELASTICSEARCH_HOSTS=http://elasticsearch:9200- I18N_LOCALE=zh-CNdepends_on:- elasticsearchnetworks:- elkvolumes:esdata:networks:elk:
运行docker compose
docker compose up
成功后通过浏览器访问 [http:// ip: 5601](http:// ip: 5601 ) 访问
创建索引
-
在左侧导航栏,单击Dev Tools。
-
在Console中,执行以下命令创建索引。
PUT es_test?include_type_name=true {"settings" : {"index" : {"number_of_shards" : "5","number_of_replicas" : "1"}},"mappings" : {"_doc" : {"properties" : {"count": { "type": "text" },"id": {"type": "integer"},"name": {"type" : "text","analyzer": "ik_smart" },"color" : {"type" : "text" }}}} }
创建成功后,返回如下结果。
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "es_test" }
创建 my_test 数据库
创建es_test
表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for es_test
-- ----------------------------
DROP TABLE IF EXISTS `es_test`;
CREATE TABLE `es_test` (`id` bigint NOT NULL AUTO_INCREMENT,`name` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`count` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`color` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 237 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;SET FOREIGN_KEY_CHECKS = 1;
修改Adapter配置
进入canal-adapter-1.1.8
cd canal-adapter-1.1.8/
修改 对应 es7 配置
- name: es7hosts: http://127.0.0.1:9200 # 127.0.0.1:9200 for rest modeproperties:mode: rest # or rest# security.ca.path: /etc/es8/ca.crt# security.auth: test:123456 # only used for rest modecluster.name: elasticsearch
创建 es_test.yml
文件
进入 cd conf/es7/
vim es_test.yml
修改内容为:
dataSourceKey: defaultDS
destination: example
groupId: g1esMapping:_index: es_test_id: _idsql: " SELECT t.id AS _id,t.name,t.count,t.color FROM es_test t "commitBatch: 3000
重新启动Adapter
sh bin/stop.sh
sh bin/startup.sh
查看 日志
tail -f logs/ad
触发数据库变更,查看同步情况
INSERT INTO `my_test`.`es_test` (`name`, `count`, `color`) VALUES ('测试', '666', '红色')
日志输出:
在kibana 控制台中查看索引情况
GET /es_test/_search
结果: MySQL 数据成功同步到 elasticsearch 中!
参考文档
通过Canal将MySQL数据同步到阿里云ES
Canal github 文档