如何通过Canal中间件实现MySQL数据库与Elasticsearch搜索引擎的数据同步?

62 阅读2分钟

一句话理解核心原理

Canal 就像一个 "数据搬运工":它盯着 MySQL 的变化(比如新增、修改、删除数据),然后把这些变化原原本本地告诉 Elasticsearch,让两者数据保持一致。

简单实现步骤(不用写代码)

1. 让 MySQL"记录自己的操作"

MySQL 默认不会记录数据变化,我们需要让它开启 "日志本"(binlog):

  • 找到 MySQL 的配置文件(比如叫 my.cnf)

  • 加上这几行配置:

    plaintext

    log_bin = mysql-bin
    binlog_format = ROW
    server_id = 1
    
  • 重启 MySQL,这样它就会把所有数据变化记在 "日志本" 上了

2. 启动 Canal"监控 MySQL"

Canal 就像一个 "监控员",专门看 MySQL 的 "日志本":

  • 从官网下载 Canal Server(选个稳定版本,比如 1.1.6)

  • 解压后,修改配置文件,告诉它:

    • 要监控的 MySQL 地址(比如 127.0.0.1:3306)
    • MySQL 的账号密码(专门给 Canal 用的,需要提前创建)
  • 双击启动脚本(startup.bat 或 startup.sh),Canal 就开始工作了

3. 启动 Canal Adapter"转发数据"

Canal Adapter 是 "搬运工",负责把 Canal 监控到的变化发给 Elasticsearch:

  • 下载 Canal Adapter(和 Canal Server 版本保持一致)

  • 解压后,修改两个配置文件:

    • 告诉它 Canal Server 的地址(让它能拿到数据变化)
    • 告诉它 Elasticsearch 的地址(要把数据搬到哪里去)
    • 配置 MySQL 的表和 Elasticsearch 的索引对应关系(比如 MySQL 的 user 表对应 ES 的 user_index)
  • 启动 Adapter,它就会自动把 MySQL 的变化同步到 ES 了

4. 测试一下

  • 在 MySQL 里新增一条数据:INSERT INTO user (name, age) VALUES ('张三', 20)
  • 去 Elasticsearch 里查一下,如果能看到这条数据,就说明同步成功了

为什么不用写 Java 代码?

因为 Canal 官方已经做好了现成的工具(Canal Server 和 Canal Adapter),我们只需要简单配置一下就能用,不用自己写代码实现同步逻辑。

如果以后需要定制化同步规则(比如只同步某些字段),再去学习如何修改配置文件就可以了,入门阶段先掌握这个流程就行~