天天看點

實戰 | canal 實作Mysql到Elasticsearch實時增量同步

題記

關系型資料庫Mysql/Oracle增量同步Elasticsearch是持續關注的問題,也是社群、QQ群等讨論最多的問題

之一。

問題包含但不限于:

1、Mysql如何同步到Elasticsearch?

2、Logstash、kafka_connector、canal選型有什麼不同,如何取舍?

3、能實作同步增删改查嗎? …

本文給出答案。

1、Canal同步

1.1 canal官方已支援Mysql同步ES6.X

同步原理,參見之前: 幹貨 | Debezium實作Mysql到Elasticsearch高效實時同步。

canal 1.1.1版本之後, 增加用戶端資料落地的适配及啟動功能。canal adapter 的 Elastic Search 版本支援6.x.x以上。

需要借助adapter實作。

1.2 同步效果

1)已驗證:僅支援增量同步,不支援全量已有資料同步。這點,canal的初衷訂位就是“阿裡巴巴mysql資料庫binlog的增量訂閱&消費元件”。

2)已驗證:由于采用了binlog機制,Mysql中的新增、更新、删除操作,對應的Elasticsearch都能實時新增、更新、删除。

3)推薦使用場景

canal适用于對于Mysql和Elasticsearch資料實時增、删、改要求高的業務場景。

實時場景要求不高的業務場景,logstash_input_jdbc也能滿足。

建議,做好選型甄别。

2、同步版本:

ES:6.6.1

Mysql: 5.7.25

canal:v1.1.3-alpha-2

canal-adapter:v1.1.3-alpha-2

canal下載下傳位址:

https://github.com/alibaba/canal/releases

3、同步步驟解讀

3.1 啟動canal,可作為常駐程序背景運作。

官網已有較長的描述

https://github.com/alibaba/canal/wiki/QuickStart

以下僅列舉關鍵注意事項。

對應下載下傳檔案:canal.deployer-1.1.3-SNAPSHOT.tar.gz, 可以實時關注最新版本。

3.1.1 啟用binlog

canal的原理是基于mysql binlog技術,是以這裡一定需要開啟mysql的binlog寫入功能,建議配置binlog模式為row.

[mysqld]
log-bin=mysql-bin #添加這一行就ok
binlog-format=ROW #選擇row模式
server_id=1 #配置mysql replaction需要定義,不能和canal的slaveId重複           

3.1.2 修改配置檔案

vi conf/example/instance.properties           

配置資料庫基本資訊。

3.1.3 啟動canal

bin/startup.sh           

可通過日志排查錯誤。

3.2 配置ElasticSearch擴充卡,并實作同步。

官網已有較長的描述:

https://github.com/alibaba/canal/wiki/Sync-ES

以下僅針對部署遇到的坑做描述。

3.2.1 部署版本

anal.adapter-1.1.3-SNAPSHOT.tar.gz,如有更新,建議使用最新版本。

3.2.2 核心配置

[root@localhost es]# cat mytest_user.yml 
dataSourceKey: defaultDS
destination: example
esMapping:
  _index: baidu_index
  _type: _doc
  _id: _id
  pk: id
  sql: "select a.id as _id, a.title, a.url, a.publish_time, a.content, 
        from baidu_info as a"
#  objFields:
#    _labels: array:;
  etlCondition: "where a.id >= 1"
  commitBatch: 3000           

實作目的:庫表id字段作為Elasticsearch的_id,以期實作自增。

4、多表關聯實作

建議參考官網:

支援:

  • 一對一
  • 一對多
  • 多對多

5、坑

坑1:canal.adapter-1.1.2 啟動失敗

啟動失敗:

https://github.com/alibaba/canal/issues/1513

該問題在1.1.3版本已經修複。

坑2:不支援全量同步

全量同步建議使用logstash或者其他工具:

坑3:必須先在ES建立好對應索引的Mapping

否則,會沒有識别索引,會報寫入錯誤。

坑4:多張表的同步如何實作?

在canal.adapter-1.1.3/conf/es的新增*.yml配置即可。

也就是說,可以一張Mysql表一個配置檔案。

坑5:空指針異常錯誤

解決方案:sql語句部分,指定對應庫表id為ES中的_id,否則會報錯。

舉例:

select sx_sid as _id, name from baidu_info           

坑6:基于 row 模式的 binlog 會不會記錄變更前、變更後的值呢?

6、同步選型小結

實戰 | canal 實作Mysql到Elasticsearch實時增量同步

以上不同選型各有利弊,建議

結合實際業務

斟酌選擇。

歡迎留下你的同步實踐方案和思考。

實戰 | canal 實作Mysql到Elasticsearch實時增量同步

銘毅天下——Elasticsearch基礎、進階、實戰第一公衆号

繼續閱讀