几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步

摘要:
问题包括但不限于:1.MySQL如何与Elasticsearch同步?canaldadapter的ElasticSearch版本支持6.x.x及更高版本。2) 验证:由于binlog机制,MySQL中的新操作、更新操作和删除操作可以实时添加、更新和删除相应的Elasticsearch。3) 推荐使用场景canal适用于对MySQL和Elastic搜索数据的实时添加、删除和修改要求较高的业务场景。官方网站已详细描述https://github.com/alibaba/canal/wiki/QuickStart,下面仅列出了关键预防措施。

文章转载自:
https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484377&idx=1&sn=199bc88f700f427f4515afac4c7402f1&chksm=eaa82bf1dddfa2e7c9f4319b52fc7a5ab721531039b928ce9624bfa26c6030f3f33167b827fd&scene=21#wechat_redirect

题记

关系型数据库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数据实时增、删、改要求高的业务场景。
实时场景要求不高的业务场景,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 同步选型小结
几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步第1张

以上不同选型各有利弊,建议 结合实际业务斟酌选择。

几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步第2张

免责声明:文章转载自《几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇canvas 做一个小鸟运动的小游戏 (第二步) 使小鸟飞起来Unity 几何着色器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL的读写分离---主从复制、主主复制

1.复制是基于BinLog日志 存在三种日志格式:Statement:存储Sql语句,存储日志量是最小的。有可能复制不一致Row:存储event数据,存储日志量大,但是不能很直接进行读取;Mixed:介于Row和statment之间 2.复制的基础 一、主从复制 1.原理    mysql要做到主从复制,其实依靠的是二进制日志,即:假设主服务器叫A,...

MySQL 当前时间,今日时间,前日时间 详解

MySQL 获取当前日期及日期格式 获取系统日期: NOW() 格式化日期: DATE_FORMAT(date, format) 注: date:时间字段 format:日期格式 返回系统日期,输出 2009-12-25 14:38:59 格式化 当前日期 mysql> select date_format(now(),'%y-%m-%d');  ...

MySQL5.7 的新特点

1、安全性 MySQL 5.7 的目标是成为发布以来最安全的 MySQL 服务器,其在 SSL/TLS 和全面安全开发方面有一些重要的改变。 mysql.user表结构升级 MySQL5.7用户表mysql.user的plugin字段不允许为空,默认值是mysql_native_password,而不是mysql_old_password,不再支持旧密码格...

MySQL监控、性能分析——工具篇

转自http://blog.csdn.net/leamonjxl/article/details/6431444 MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析、监控预警、容量扩展议题越来越多。“工欲善其 事,必先利其器”,那么我们如何在进行MySQL性能分析、监控预警、容量扩展问题上得到更好的解决方案,就...

mysql二进制日志

一、mysql的二进制日志文件 二、查看二进制日志文件信息:      1、查看二进制日志文件是否开启:show variables like 'log_bin';      2、查看所有二进制日志文件的列表:show binary logs;      3、查看当前二进制日志文件的名称(最后一个):show master status;      4、获...

常用MySQL操作

常用MySQL操作 更改MySQL数据库root的密码 将绝对路径加入环境变量并设置开机启动 # PATH=$PATH:/usr/local/mysql/bin # echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile # source /etc/profile 给root用户设定密码 #...