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 | cat mytest_user.yml |
多表关联实现
建议参考官网: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