最近我們項目需要使用到 elasticsearch(以下稱 es),需要對商品數(shù)據(jù)進行索引。那這里就會有一個數(shù)據(jù)同步的問題,就是當修改數(shù)據(jù)庫的數(shù)據(jù)時,數(shù)據(jù)如何導入到 es 中。一般會有這幾種方案:
- 同步導入
- 就是在你的項目中接入 es 客戶端,在寫完數(shù)據(jù)庫后,同步寫入到 es??梢允褂?aop。
- 異步導入
- 使用消息隊列,當寫完數(shù)據(jù)庫后,使用消息隊列異步寫入到 es
- 使用 mysql 的 binlog,異步寫入到 es
優(yōu)缺點
同步寫入,很明顯代碼侵入行最高,并且會增大業(yè)務(wù)服務(wù)器的開銷。消息隊列其實已經(jīng)是非常好的方案,代碼侵入性較低,幾乎不影響效率。當然我個人最喜歡的還是使用 binlog,因為完全和業(yè)務(wù)無耦合。
1. canal(管道)介紹
canal 就是一個 alibaba 出品的一個 mysql binlog 同步工具。
工作原理
- canal 模擬 MySQL slave 的交互協(xié)議,偽裝自己為 MySQL slave ,向 MySQL master 發(fā)送dump 協(xié)議
- MySQL master 收到 dump 請求,開始推送 binary log 給 slave (即 canal )
- canal 解析 binary log 對象(原始為 byte 流)
具體的操作
使用 canal 完成同步操作,你必須部署兩個服務(wù):
- canal-server:與 mysql 通訊,對數(shù)據(jù)進行解析,把數(shù)據(jù)傳給下游
- canal-adapter:和 canal-server 通訊,目前支持把數(shù)據(jù)導入到 es,RDB,Hbase
上面提到的下游不僅僅可以是 canal-adapter 還可以是 Kafka/RocketMQ,ClientAdapter,java 客戶端。
此外 canal-server 也支持 Prometheus 監(jiān)控。
canal-server docker 部署
- 啟動文件
canal-server github
canal-adapter docker 部署
dockerfile 地址
canal-adapter Dockerfile啟動文件
canal-adapter start使用 canal-adapter 填坑
- sql 必須要有 scheme
- 字段不要加 ``,例如,status 不要寫成
`status`