基于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地址 canal.instance.master.address= 127.0.0.1:3306 #用户名 canal.instance.dbUsername = root
-
-

本文介绍了基于canal的MySQL到Elasticsearch数据同步方案,包括概念、应用场景、工作原理和优势。canal模拟MySQL slave与master交互,监听并解析MySQL的二进制日志,实现实时数据同步。该方案适用于需要结合ACID特性的数据库和搜索引擎场景。

4232

被折叠的 条评论
为什么被折叠?



