mysql到elasticsearch实时增量同步

mysql到elasticsearch实时增量同步

同步选型

同步版本canal下载地址:https://github.com/alibaba/canal/releases

同步步骤解读

启动canal,可作为常驻进程后台运行。
官网已有详细描述https://github.com/alibaba/canal/wiki/QuickStart,
以下仅列举关键注意事项。

对应下载文件:canal.deployer-1.1.5-SNAPSHOT.tar.gz, 可以实时关注最新版本。

启用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重复

修改配置文件
vim conf/example/instance.properties
配置数据库基本信息。

启动canal
bin/startup.sh
可通过日志排查错误。

配置ElasticSearch适配器,并实现同步。

官网已有详细描述:https://github.com/alibaba/canal/wiki/Sync-ES。
以下仅针对部署遇到的坑做描述。

部署版本
anal.adapter-1.1.5-SNAPSHOT.tar.gz,如有更新,建议使用最新版本。

核心配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,以期实现自增。

多表关联实现

建议参考官网:https://github.com/alibaba/canal/wiki/Sync-ES
支持:一对一,一对多,多对多

坑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

-------------本文结束-------------
0%