myql 实时同步数据到 ES
需求背景
存储在 Mysql 中的数据量比较大,在 web 端需要进行搜索框搜索,使用的是 es ,问题是如何保证 mysql 数据与 es 数据的实时一致性
技术选型
canal 与 maxwell 都可以实现 mysql binlog 实时监控,将增量数据同步。最后定为使用 canal
环境搭建
根据当前公司提供的 es 版本与 mysql 版本在本地搭建虚拟机服务,通过下载 canal-server 与 canal-adapter 构建环境
遇到的问题
在 canal-adapter 始终可以打印消费日志,但是无法同步到 es ,对问题进行了排查
1.配置问题,查询相关资料,对配置进行分析,无果
2.数据库与es 是否正常,数据库是确定正常,问题基本确定在下游写入问题
3.下载源码,对配置分析,是否正确
4.github 官网,issue 查找相关的类似问题,确定为系统 bug , 更改当前部署版本 ,成功
2021-07-06 17:31:34.199 [pool-2-thread-1] INFO c.a.o.canal.client.adapter.logger.LoggerAdapterExample - DML: {"data":[{"id":1,"title":"新的title","sub_title":"这是一个title","price":1010.0,"pic":"1"}],
"database":"canal_test","destination":"example","es":1625563894000,"groupId":"g1","isDdl":false,"old":[{"price":10.0}],"pkNames":["id"],"sql":"","table":"product","ts":1625563894199,"type":"UPDATE"} 2021-07-06 17:31:34.201 [pool-2-thread-1] DEBUG c.a.o.canal.client.adapter.es.core.service.ESSyncService - DML: {"data":[{"id":1,"title":"新的title","sub_title":"这是一个title","price":1010.0,"pic":"1"}]
,"database":"canal_test","destination":"example","es":1625563894000,"groupId":"g1","isDdl":false,"old":[{"price":10.0}],"pkNames":["id"],"sql":"","table":"product","ts":1625563894199,"type":"UPDATE"} Affected indexes: product
以上为服务器上消费到的 binlog 日志 ,同时 es 也进行了实时的更新
//初始化后需要全量同步一次
curl http://127.0.0.1:8081/etl/es6/product.yml -X POST
参考文章:https://blog.csdn.net/jcmj123456/article/details/109705562