
🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录
详解Canal同步MySQL增量数据到Elasticsearch(ES)

Canal是阿里巴巴开源的一款基于MySQL数据库增量日志(binlog)解析的数据同步工具,能够实时捕获数据库的增删改操作,适用于将数据同步到ES等目标存储。以下是完整实现步骤及注意事项:
一、环境准备与依赖
-
组件版本要求:
- MySQL:5.6+(需开启binlog,建议ROW模式)
- Canal:1.1.5+(最新稳定版)
- Elasticsearch:6.x/7.x(需与客户端版本兼容)
- Java:JDK8+
-
MySQL配置:
- 开启binlog:在
my.cnf中配置:[mysqld] log-bin=mysql-bin # 启用binlog binlog-format=ROW # 必须为ROW模式 server_id=1 # 唯一服务ID - 创建Canal账号(用于读取binlog):
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal_password'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
- 开启binlog:在
二、Canal服务端部署
-
下载并解压Canal:
wget https://github.com/alibaba/canal/releases/download/canal-1.1.7/canal.deployer-1.1.7.tar.gz tar -zxvf canal.deployer-1.1.7.tar.gz -C /opt/canal -
修改配置(
conf/example/instance.properties):# MySQL连接配置 canal.instance.master.address=127.0.0.1:3306 canal.instance.dbUsername=canal canal.instance.dbPassword=canal_password # 订阅的库表(默认全库) canal.instance.filter.regex=.*\\..* # 主从切换时启用GTID(可选) canal.instance.gtidon=false -
启动Canal Server:
sh bin/startup.sh # 检查日志 tail -f logs/canal/canal.log
三、数据同步到Elasticsearch
Canal官方提供Canal Adapter工具,可直接将binlog数据转换为ES文档。
-
配置Canal Adapter:
-
下载Adapter:
wget https://github.com/alibaba/canal/releases/download/canal-1.1.7/canal.adapter-1.1.7.tar.gz tar -zxvf canal.adapter-1.1.7.tar.gz -C /opt/canal-adapter -
配置ES连接(
conf/application.yml):canal.conf: srcDataSources: defaultDS: url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true username: canal password: canal_password canalAdapters: groups: - groupId: g1 outerAdapters: - name: es7 hosts: 127.0.0.1:9200 # ES地址 properties: mode: rest # 使用RestHighLevelClient security.auth: elastic:elasticpass # 认证信息 cluster.name: elasticsearch -
定义同步规则(
conf/es7/*.yml): 创建文件user.yml,配置MySQL表到ES索引的映射:dataSourceKey: defaultDS destination: example # 对应Canal实例名 groupId: g1 esMapping: _index: user_index # ES索引名 _id: _id # 文档ID(对应MySQL主键) sql: "SELECT id AS _id, name, age FROM user" commitBatch: 3000 # 批量提交大小
-
-
启动Adapter:
sh bin/startup.sh # 验证日志 tail -f logs/adapter/adapter.log
四、数据同步验证
-
操作MySQL数据:
INSERT INTO user(name, age) VALUES ('Alice', 28); UPDATE user SET age=30 WHERE name='Alice'; DELETE FROM user WHERE name='Alice'; -
检查ES数据:
# 查询user_index curl -XGET "http://127.0.0.1:9200/user_index/_search?pretty"应能实时看到增删改的记录。
五、高级配置与优化
-
自定义数据转换:
- 复杂字段处理(如JSON解析)可在SQL中使用MySQL函数。
- 若需动态生成ES索引名,可在sql中拼接字段:
SELECT id, CONCAT('user_', DATE_FORMAT(create_time,'%Y%m')) AS _index
-
批量性能调优:
- 调整
commitBatch(默认3000)和syncInterval(同步间隔)。 - 增加Adapter的JVM内存:
JAVA_OPTS="-Xms4g -Xmx4g"
- 调整
-
容错与监控:
- 断点续传:Canal Server会记录消费位点,重启后自动恢复。
- 监控指标:
- Canal Server:
canal.log中查看解析的binlog位点。 - Adapter:日志中统计
batch commit次数及错误信息。
- Canal Server:
六、常见问题与解决
-
数据未同步到ES:
- 检查Adapter的
esMapping配置中的SQL是否正确。 - 确认ES索引是否存在且字段类型兼容(如
age是否为integer)。
- 检查Adapter的
-
同步延迟高:
- 优化MySQL的binlog写入速度。
- 增加Adapter节点,分散负载。
-
Canal连接失败:
- 验证MySQL账号权限(需
REPLICATION SLAVE权限)。 - 检查防火墙是否开放MySQL端口(默认3306)。
- 验证MySQL账号权限(需
通过以上步骤,可实现MySQL到Elasticsearch的实时增量数据同步,适用于搜索、日志分析等场景。建议在测试环境充分验证后,再部署到生产环境。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

&spm=1001.2101.3001.5002&articleId=147109499&d=1&t=3&u=99c6afbddbcf4addb9d486406d00ebb2)
3678

被折叠的 条评论
为什么被折叠?



