1. 背景
项目中业务数据量比较大,每类业务表都达到千万级别,虽然做了分库分表,每张表数据控制在300W以下,但是效率还是达不到要求,为了提高查询效率,打算使用ES进行数据查询。
2. 同步原理
-
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
-
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
-
canal 解析 binary log 对象(原始为 byte 流),转换为json格式
-
Canal 客户端通过 TCP 协议或 MQ 形式监听 Canal 服务端,同步数据到 ES。
优点: 可以完全和业务代码解耦,增量日志订阅。
缺点:实时性不高,订阅mysql日志,DB中数据事务成功后,开始同步至canal。
3. 环境信息
名称 | 版本 |
---|---|
MySQL | 8.0.35 |
elasticsearch | 7.17.9 |
canal | 1.1.7 |
jdk | 1.8 |
本文以MySQL中的表ibds2.proof_data_history_202311为例进行数据同步实验。
4. 部署配置
本文的的重点是讲述canal的配置与使用,不再详细描述MySQL与ES的部署和配置。
4.1. MySQL
MySQL的部署与配置相对较简单,需要主要的是需要开启binlog,且配置binlog-format 为ROW
模式。此处不再做详细描述。
4.2. Elasticsearch
ES的部署与配置也比较简单,此处不再做详细描述。
建议安装同版本的分词器插件。
4.3. canal
版本下载地址:
deployer:
adapter:
4.3.1. deployer
4.3.1.1. 配置
将canal.deployer-1.1.7.tar.gz
上传到/data/canal/Server
,并进行解压:
cd /data/canal/Server
tar -zxvf canal.deployer-1.1.7.tar.gz
修改配置文件conf/example/instance.properties,按如下配置即可,主要是修改数据库相关配置:
## mysql serverId , v1.0.26+ will autoGen 不要与MySQL的id重复
canal.instance.mysql.slaveId=10
# enable gtid use true/false 是否使用gtid
canal.instance.gtidon=true
# position info MySQL数据库信息
canal.instance.master.address=192.168.10.101:3307
# username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=X87_5w2Anxp3
canal.instance.connectionCharset = UTF-8
# table regex 需要订阅binlog的表的过滤正则表达式
canal.instance.filter.rege