canal 實現Mysql到Elasticsearch實時增量同步


 

簡介: MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL是一種關系數據庫管理系統,關系數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

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、多表關聯實現

建議參考官網:https://github.com/alibaba/canal/wiki/Sync-ES
支持:

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

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、同步選型小結

image.png

以上不同選型各有利弊,建議結合實際業務斟酌選擇。

阿里雲參考教程鏈接

https://developer.aliyun.com/article/707093


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM