Mysql數(shù)據(jù)同步elasticsearch-canal實戰(zhàn)

最近我們項目需要使用到 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ù):

  1. canal-server:與 mysql 通訊,對數(shù)據(jù)進行解析,把數(shù)據(jù)傳給下游
  2. canal-adapter:和 canal-server 通訊,目前支持把數(shù)據(jù)導入到 es,RDB,Hbase

上面提到的下游不僅僅可以是 canal-adapter 還可以是 Kafka/RocketMQClientAdapter,java 客戶端。
此外 canal-server 也支持 Prometheus 監(jiān)控。

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`
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容