一文完成 Docker 部署Canel 并配置ES与MySQL 的数据同步

article/2025/7/6 22:37:19

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/在这里插入图片描述
请添加图片描述

启动错误原因排查:

  1. 检查环境变量中的数据库信息是否配置正确

在这里插入图片描述

  1. Canal Admin登录报错

检查 canal_manager 中是否正确已经导入了SQL文件。

检查 登录的账号是否有对应的权限

  1. 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 ) 访问

在这里插入图片描述

创建索引

  1. 在左侧导航栏,单击Dev Tools

  2. 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 文档


http://www.hkcw.cn/article/xASUwAnhjt.shtml

相关文章

mysql的锁-->一篇读懂所有锁机制

目录 mysql的锁 概述:根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁? 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…

免费送源码:Java+C+++MySQL C++学生信息管理系统的设计与实现 计算机毕业设计原创定制

目 录 1 绪论 1 1.1选题背景 1 1.2课题研究意义 1 1.3论文结构与章节安排 1 2 相关技术介绍 3 2.1 C语言 3 2.2 Mysql数据库 3 3 系统分析 3 3.1 可行性分析 3 3.1.1 技术可行性分析 3 3.1.2 经济可行性分析 3 3.1.3 法律可行性分析 3 3.2 系统功能分析 3 3.2.1…

达梦DTS数据迁移工具生产篇(MySQL->DM8)

本文章使用的DTS工具为 2024年9月18日的版本,使用的目的端DM8数据库版本为2023年12月的版本,注意数据库版本和DTS版本之间跨度不要太大,以免出现各种兼容性的报错。若发现版本差距过大时,请联系达梦技术服务工程师处理。 1. 迁移…

MySQL 数据库备份与还原

作者:IvanCodes 日期:2025年5月18日 专栏:MySQL教程 思维导图 备份 (Backup) 与 冗余 (Redundancy) 的核心区别: 🎯 备份是指创建数据的副本并将其存储在不同位置或介质,主要目的是在发生数据丢失、损坏或逻辑错误时进…

MySQL Binlog 日志查看方法及查看内容解析

一、Binlog 日志概述 Binlog(二进制日志)记录了 MySQL 数据库执行的所有更改数据的操作,包括INSERT、UPDATE、DELETE等。它对于数据恢复、主从复制以及审计等方面有着至关重要的作用。 二、查看 Binlog 日志方法 开启 Binlog 日志功能 默…

【金仓数据库征文】金仓数据库(KingbaseES)迁移与集群部署实战:从MySQL到KES的全流程解析

随着企业信息化和数字化转型的加速,企业对数据库的要求不仅仅局限于基础的数据存储功能,更涉及到性能、可扩展性、安全性、以及持续的系统升级能力。因此,数据库迁移已经成为现代企业升级IT架构时的一个重要步骤。特别是在国产化替代的浪潮中…

【MySQL】 基本查询(下)

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 基本查询(下) 发布时间:2025.2.18 隶属专栏:MySQL 目录 Update语法案例Delete删除数据语法案例截断表语法案例插入查询结果语法案例聚合函数函数介绍案例group by子句的使用语法having和where案例结语Update 语法 UPDATE …

MySQL开大招了! 三十周年庆典推出四项 OCP 认证免费

🎉 MySQL 30岁生日大礼包!OU掏家底了! 狠心决定:4.20-7.31期间 🔥全系列MySQL课程四大认证 🔥原价$2,500/人的考试资格 通!通!免!费! 💡30年只此一…

Kettle9.1链接mysql报错: Connection failed. Verify all connection parameters and confirm that the appropr

Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. The server time zone value ‘D1’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC 连接失败。验证所…

2025最新版|八股文面试题库+答案详解(附高频考点解析)

我相信大多 Java 开发的程序员或多或少经历过 BAT 一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,小编经历过多次面试,有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#xff…

库室门禁报警系统|多功能控制器运用

库室门禁报警系统 库室门禁报警系统是一套综合性的安全防护体系,它集成了门禁控制、入侵报警、视频监控等多种功能。门禁控制功能通过对人员进出权限的精准管理,严格限制无关人员进入库室。系统可根据人员的身份、职务、工作需求等设定不同的权限&#…

【我给AI出题-1】DCMTK的storescu在发送医学图像给服务器时,能否指定客户端的端口号?

本文由Markdown语法编辑器编辑完成。 封面图像由: "即梦AI"创作,提示词: “几个AI工具,在一起激烈地讨论问题,包括: 豆包,kimi, deepseek, chatgpt, csdn的图标,作为人物形象. 可以生成吉普力的风格.” 1.…

研华工控机安装Windows10系统,适用UEFI(GPT)格式安装

主要硬件 主板:AIMB-787 、CPU:i5-6500 U盘启动工具:通过网盘分享的文件:rufus-3.20.zip 链接: https://pan.baidu.com/s/1YlFfd-_EhFHCG4sEHBQ8dQ?pwdQT12 提取码: QT12 Win10 22H2 Pro 纯净版系统:通过网盘分享…

ubuntu系统安装Pyside6报错解决

目录 1,问题: 2,解决方法: 2.1 首先查看pypi是否有你需要包的镜像: 2.2 其它方案: 2.3 如果下载很慢,可以换源: 2.4 查看系统架构 Windows Ubuntu 1,问题&#xf…

第六十一节:深度学习-使用 OpenCV DNN 模块

一、OpenCV DNN模块:传统与AI的桥梁 在深度学习席卷计算机视觉领域的今天,OpenCV作为最广泛使用的视觉库,通过其强大的DNN(Deep Neural Networks)模块架起了传统算法与深度学习之间的桥梁。该模块允许开发者在无需依赖原始深度学习框架的情况下,直接加载和运行预训练模型…

MySql(七)

目录 创建表 准备数据 1.更新表中的数据 1)不带条件修改 修改eno表中的性别为女 查看表中的数据 修改表中的性别为女 2)带条件修改 修改张三的性别为男 查看表 把地址为木星的修改为火星 一次修改多个列 删除数据 1)语法(删除表中…

算力租赁革命:弹性模式如何重构数字时代的创新门槛​

一、算力革命:第四次工业革命的核心驱动力​ 在科技飞速发展的当下,我们正悄然迎来第四次工业革命。华为创始人任正非在一场程序设计竞赛中曾深刻指出,这场革命的基础便是大算力。随着 5G、人工智能、大数据、物联网等信息技术的迅猛发展&am…

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest。

Springboot cloud gateway集成sa-token中报错 cn.dev33.satoken.exception.NotWebContextException: 非 web 上下文无法获取 HttpServletRequestat cn.dev33.satoken.spring.SpringMVCUtil.getRequest(SpringMVCUtil.java:45) ~[sa-token-spring-boot-starter-1.38.0.jar:?]官…

动态规划-300.最长递增子序列-力扣(LeetCode)

一、题目解析 子数组vs子序列 回过头来,我们分析题目给出的条件,其中要注意的是严格递增这个字眼 二、算法原理 1、状态表示 我们想要知道的是最长递增子序列长度,所以dp[i]表示:以i位置元素为结尾的所有子序列中最长递增子序列…

MySQL中怎么看是否走了索引

学生表 创建普通索引 create index index_name on student (name); 1.使用EXPLAIN查看执行计划(核心) explain select * from student where name 李明 key字段:显示实际使用的索引名称。若值为NULL,表示未使用索引;若显示具体索引名&…