HoRain云--详解Canal同步MySQL增量数据到Elasticsearch(ES)

  

🎬 HoRain 云小助手个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

详解Canal同步MySQL增量数据到Elasticsearch(ES)

一、环境准备与依赖

二、Canal服务端部署

三、数据同步到Elasticsearch

四、数据同步验证

五、高级配置与优化

六、常见问题与解决


 

 

Canal是阿里巴巴开源的一款基于MySQL数据库增量日志(binlog)解析的数据同步工具,能够实时捕获数据库的增删改操作,适用于将数据同步到ES等目标存储。以下是完整实现步骤及注意事项:


一、环境准备与依赖
  1. 组件版本要求

    • MySQL:5.6+(需开启binlog,建议ROW模式)
    • Canal:1.1.5+(最新稳定版)
    • Elasticsearch:6.x/7.x(需与客户端版本兼容)
    • Java:JDK8+
  2. 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;
      

二、Canal服务端部署
  1. 下载并解压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
    
  2. 修改配置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
    
  3. 启动Canal Server

    sh bin/startup.sh
    # 检查日志
    tail -f logs/canal/canal.log
    

三、数据同步到Elasticsearch

Canal官方提供Canal Adapter工具,可直接将binlog数据转换为ES文档。

  1. 配置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    # 批量提交大小
      
  2. 启动Adapter

    sh bin/startup.sh
    # 验证日志
    tail -f logs/adapter/adapter.log
    

四、数据同步验证
  1. 操作MySQL数据

    INSERT INTO user(name, age) VALUES ('Alice', 28);
    UPDATE user SET age=30 WHERE name='Alice';
    DELETE FROM user WHERE name='Alice';
    
  2. 检查ES数据

    # 查询user_index
    curl -XGET "http://127.0.0.1:9200/user_index/_search?pretty"
    

    应能实时看到增删改的记录。


五、高级配置与优化
  1. 自定义数据转换

    • 复杂字段处理(如JSON解析)可在SQL中使用MySQL函数。
    • 若需动态生成ES索引名,可在sql中拼接字段:
      SELECT id, CONCAT('user_', DATE_FORMAT(create_time,'%Y%m')) AS _index
      
  2. 批量性能调优

    • 调整commitBatch(默认3000)和syncInterval(同步间隔)。
    • 增加Adapter的JVM内存:
      JAVA_OPTS="-Xms4g -Xmx4g"
      
  3. 容错与监控

    • 断点续传:Canal Server会记录消费位点,重启后自动恢复。
    • 监控指标
      • Canal Server:canal.log中查看解析的binlog位点。
      • Adapter:日志中统计batch commit次数及错误信息。

六、常见问题与解决
  1. 数据未同步到ES

    • 检查Adapter的esMapping配置中的SQL是否正确。
    • 确认ES索引是否存在且字段类型兼容(如age是否为integer)。
  2. 同步延迟高

    • 优化MySQL的binlog写入速度。
    • 增加Adapter节点,分散负载。
  3. Canal连接失败

    • 验证MySQL账号权限(需REPLICATION SLAVE权限)。
    • 检查防火墙是否开放MySQL端口(默认3306)。

通过以上步骤,可实现MySQL到Elasticsearch的实时增量数据同步,适用于搜索、日志分析等场景。建议在测试环境充分验证后,再部署到生产环境。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值