Mysql数据同步elasticsearch-canal实战

最近我们项目需要使用到 elasticsearch(以下称 es),需要对商品数据进行索引。那这里就会有一个数据同步的问题,就是当修改数据库的数据时,数据如何导入到 es 中。一般会有这几种方案:

  • 同步导入
    • 就是在你的项目中接入 es 客户端,在写完数据库后,同步写入到 es。可以使用 aop。
  • 异步导入
    • 使用消息队列,当写完数据库后,使用消息队列异步写入到 es
    • 使用 mysql 的 binlog,异步写入到 es

优缺点

同步写入,很明显代码侵入行最高,并且会增大业务服务器的开销。消息队列其实已经是非常好的方案,代码侵入性较低,几乎不影响效率。当然我个人最喜欢的还是使用 binlog,因为完全和业务无耦合。

1. canal(管道)介绍

canal 就是一个 alibaba 出品的一个 mysql binlog 同步工具。

工作原理

  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
  • canal 解析 binary log 对象(原始为 byte 流)

具体的操作

使用 canal 完成同步操作,你必须部署两个服务:

  1. canal-server:与 mysql 通讯,对数据进行解析,把数据传给下游
  2. canal-adapter:和 canal-server 通讯,目前支持把数据导入到 es,RDB,Hbase

上面提到的下游不仅仅可以是 canal-adapter 还可以是 Kafka/RocketMQClientAdapterjava 客户端
此外 canal-server 也支持 Prometheus 监控。

canal-server docker 部署
  1. 启动文件
    canal-server github
canal-adapter docker 部署
  1. dockerfile 地址
    canal-adapter Dockerfile

  2. 启动文件
    canal-adapter start

  3. 使用 canal-adapter 填坑

  • sql 必须要有 scheme
  • 字段不要加 ``,例如,status 不要写成
`status`
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容