MySQL篇:MySQL如何实时同步到ES

MySQL如何实时同步到ES

😄生命不息,写作不止

🔥 继续踏上学习之路,学之分享笔记

👊 总有一天我也能像各位大佬一样

🏆 博客首页 @怒放吧德德 To记录领地 @一个有梦有戏的人

🌝分享学习心得,欢迎指正,大家一起学习成长!

转发请携带作者信息 @怒放吧德德(掘金) @一个有梦有戏的人(CSDN)

需求

在使用 MySQL 的时候,由于数据量比较大,会将其存储到 ES 中,那么这里就会涉及到,要如何设计方案,使得 MySQL 能够实时的同步到Elasticsearch。

对于这个需求,在数据变化的瞬间,要能够及时地反映到另一个系统。对 MySQL 与 ES 的实时同步场景,需要考虑能够保持数据的一致性和实时性。

方案

双写

要让 MySQL 与 ES 实时同步,可以考虑使用双写的方案,当 MySQL 进行修改数据的时候同时更新到 elasticsearch 中。对于这种方案,耦合度会很高,当需求变更的时候,维护成本就会比较高。

消息队列的异步同步

也就是当数据发生变更的时候,触发 MQ 消息,再通过消费端去订阅消息,进行同步到 elasticsearch 中。这种方案能够降低系统的耦合度,也能够有可靠性消息队列来保障,还能够在同步失败的时候自动重试;但是引入了三方组件,系统复杂度会增加。

使用Binlog解析工具

可以通过工具来进行解析Binlog并输出变更事件。

Canal

canal 是阿里开源的组件,其工作原理是去监听 MySQL 中的 binlog 日志(Canal 的工作机制基于 MySQL 主从同步原理),通过捕获数据变更事件,在实时推送存储到 elasticsearch 中。这个方式和 MQ 的方式有点像,就是不需要嵌入到业务系统中。

工作原理:

  • 伪装 Slave:Canal 模拟 MySQL Slave 协议,向 Master 发送 Dump 请求,接收 Binlog 增量日志;
  • 解析与分发:解析 Binlog 日志(支持 Statement、Row、Mixed 格式,推荐 Row 模式以保证数据一致性),将其转换为结构化事件,通过消息队列(如 Kafka)或直接推送至下游系统
Debezium

Debezium 是一个开源的分布式平台,能够通过解析 MySQL 的 Binlog 实时捕获数据变更,并将变更事件通过 Kafka 传递到下游系统(如 Elasticsearch)。

总结

实时将 MySQL 数据同步到 elasticsearch 中,以上介绍了几种方案,具体需要哪种方案,需要通过综合业务需求进行考虑,通过系统架构、数据量来决定使用何种方案。canal 和 MQ 的实时性和稳定性都比较高,对于更多的企业来说都会选择这种方案。

附件

文章基于以下学习所得:


转发请携带作者信息 @怒放吧德德 @一个有梦有戏的人

持续创作很不容易,作者将以尽可能的详细把所学知识分享各位开发者,一起进步一起学习。转载请携带链接,转载到微信公众号请勿选择原创,谢谢!

👍创作不易,如有错误请指正,感谢观看!记得点赞哦!👍

谢谢支持!

相关推荐
小猿姐5 小时前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生
Ruihong16 小时前
Vue withDefaults 转 React:VuReact 怎么处理?
vue.js·react.js·面试
kyriewen16 小时前
别再这样写 async/await 了:我在 Code Review 中见过最多的 8 个错误
前端·javascript·面试
烬羽1 天前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
云技纵横1 天前
一个 @Async,把 @Transactional 的事务边界打穿了
后端·面试
Elasticsearch1 天前
使用 Elastic Agent Builder 和 Sarvam AI 构建多语言语音 agent
elasticsearch
想要成为糕糕手1 天前
Harness Engineering:大模型时代的“马鞍”——从记忆层开始,让AI真正为你所用
面试·ai编程·claude
kyriewen2 天前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
她的男孩2 天前
后台接口加密别只会 HTTPS,ForgeAdmin 的 RSA + SM4/AES 源码拆解
后端·面试·开源
Randyliu2 天前
20260508-Agent搭建记录以及对ReAct框架的理解
面试·agent