基于canal的MySQL=>ES数据同步方案
1、概念
canal
,译意为 水道/管道/沟渠
- 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger
(触发器) 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅
和消费业务
。
2、应用场景
Elasticsearch
不支持事务
。 ES通常在分布式系统架构中承担“搜索引擎”的角色,一般来说解决词类问题,可以把ES和支持ACID特性的关系型数据库结合起来使用。首先把对数据的更(增删改)操作在RDB中执行,然后把这些动作同步到Elasticsearch
。 通过这种方式,你将受益于数据库 ACID 事务支持,并且在 Elasticsearch 中以正确的顺序产生变更。 并发在关系数据库中得到了处理。
以MySQL
为例,如果要把数据从同步至ES,canal + binary log
就是常用的一种增量解决方案。
3、原理
MySQL主备复制原理
- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
- MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
- MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
canal 工作原理
-
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
-
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
-
canal 解析 binary log 对象(原始为 byte 流)
4、优势
- 准实时性
- 性能好
- 一劳永逸
5、玩法
-
环境:
Java和ES兼容性:https://www.elastic.co/cn/support/matrix#matrix_jvm
- JDK:1.8
- Elasticsearch:7.x
- MySQL: 5.7
- Canal: 1.1.4
-
下载:
Github: https://github.com/alibaba/canal/
Github 咻咻咻: https://github.com/fhefh2015/Fast-GitHub
-
步骤:
-
保证
Elasticsearch
服务可用 -
保证
MySQL
服务可用 -
开启MySQL的
binary log
(主备模式)- 配置:
在mysql.cfg 文件中添加以下代码
server_id = 1 #开启主从模式后每个MySQL节点的id log-bin = mysql-bin #bin-log的存储位置 binlog-format = ROW #选择存储binlog日志方式为ROW模式
- 重启MySQL服务:
systemctl restart mysqld
- 验证是否开启成功
使用如下代码 需要登录mysql
才可以
SHOW VARIABLES LIKE 'log_bin'; log_bin ON #开启
- 配置:
-
canal-deployer
-
配置
conf/example/instance.properties
#canal示例的slaveId canal.instance.mysql.slaveId=1234 #mysql地址<
-
-