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數據實時增、刪、改要求高的業務場景。 實時場景要求不高的業務場景,logstashinputjdbc也能滿足。
建議,做好選型甄別。
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 會不會記錄變更前、變更后的值呢?
-
INSERT:只有變更后的值。
-
UPDATE:包含了變更前、變更后的值。
-
DELETE:變更前的值
關於全量同步:https://github.com/alibaba/canal/issues/376
6 同步選型小結
轉載自 銘意天下公眾號