最近我们项目需要使用到 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 完成同步操作,你必须部署两个服务:
- canal-server:与 mysql 通讯,对数据进行解析,把数据传给下游
- canal-adapter:和 canal-server 通讯,目前支持把数据导入到 es,RDB,Hbase
上面提到的下游不仅仅可以是 canal-adapter 还可以是 Kafka/RocketMQ,ClientAdapter,java 客户端。
此外 canal-server 也支持 Prometheus 监控。
canal-server docker 部署
- 启动文件
canal-server github
canal-adapter docker 部署
-
dockerfile 地址
canal-adapter Dockerfile -
启动文件
canal-adapter start -
使用 canal-adapter 填坑
- sql 必须要有 scheme
- 字段不要加 ``,例如,status 不要写成
`status`
网友评论