MySQL 与 Elasticsearch 数据一致性方案

MySQL 与 Elasticsearch 数据一致性方案

  • 前言
  • 一、同步双写(Synchronous Dual Write)🔄
  • 二、异步双写(Asynchronous Dual Write)📤
  • 三、定时同步(Scheduled Synchronization)🕒
  • 四、基于 Binlog 的实时同步(Real-time Synchronization via Binlog)🔄
  • 五、选型建议 🧠
  • 六、快速对比表 📊
  • 七、总结 📝


前言

在实际系统设计中,为了充分发挥 MySQL 与 Elasticsearch(ES)的优势,常常需要将两者结合使用。MySQL 负责事务处理和数据一致性,而 ES 提供高效的全文检索和分析能力。然而,如何在两者之间实现数据的一致性,是系统架构设计中的关键问题。

在这里插入图片描述

一、同步双写(Synchronous Dual Write)🔄

  1. 🔧 原理

    在业务操作中,数据同时写入 MySQL 和 Elasticsearch(ES),确保两者数据实时一致。

  2. ✅ 优点

    • 实时性高:数据变更立即同步至 ES,适用于对实时性要求高的场景。

    • 实现简单:无需引入额外中间件,直接在业务代码中实现同步逻辑。

    • 一致性强:在操作成功的情况下,MySQL 与 ES 保持强一致性。

  3. ❌ 缺点

    • 代码耦合度高:业务逻辑与数据同步逻辑混合,增加维护难度。

    • 失败处理复杂:若 ES 写入失败,需处理事务回滚,增加系统复杂度。

    • 性能影响:每次写操作需等待 ES 写入完成,可能影响系统吞吐量。

  4. 🛠️ 优化建议

    • 引入事务管理:使用分布式事务或补偿机制,确保 MySQL 与 ES 的写操作在同一事务中执行。

    • 实现幂等性操作:确保重复写入不会导致数据异常,避免数据重复或丢失。

    • 增加失败重试机制:对 ES 写入失败的操作进行重试,确保数据最终能够写入 ES。

    • 建立监控和报警机制:实时监控数据同步状态,及时发现并处理异常情况。

    • 使用中间件解耦:引入消息队列(如 Kafka)或数据变更捕获工具(如 Debezium)等中间件,解耦业务逻辑与数据同步逻辑,提高系统的可扩展性和可维护性。

  5. 🎯 适用场景

    • 数据一致性要求高的场景:如金融系统、订单系统等,对数据一致性和实时性要求严格的业务场景。

    • 系统规模较小的场景:系统复杂度较低,便于实现和维护同步双写逻辑。

二、异步双写(Asynchronous Dual Write)📤

  1. 🔧 原理

    在业务操作中,数据首先写入主数据库(如 MySQL),随后将操作信息发送到消息队列(如 Kafka、RabbitMQ)。独立的消费者服务从消息队列中消费消息,并将数据异步写入 Elasticsearch(ES),实现数据的最终一致性。

  2. ✅ 优点

  • 降低主库写入延迟:主业务流程无需等待 ES 写入完成,提高系统响应速度。

  • 系统解耦:通过消息队列实现业务逻辑与数据同步逻辑的解耦,提升系统的可维护性和扩展性。

  • 提高系统可用性:即使 ES 出现故障,主库的正常运行和数据写入不受影响。

  • 支持多数据源写入:便于扩展更多的数据源写入,满足多样化的数据同步需求。

  1. ❌ 缺点
  • 系统复杂度增加:引入消息中间件,增加了系统的部署和维护成本。

  • 数据同步延迟:由于异步处理,可能存在数据同步的延迟,影响数据的实时性。

  • 数据一致性风险:在消息处理失败或消费者服务异常的情况下,可能导致数据不一致。

  1. 🛠️ 优化建议
  • 使用高可靠性的消息队列:选择如 Kafka、RabbitMQ 等具备持久化和高可用性的消息队列,确保消息的可靠传输。

  • 实现幂等性操作:在消费者服务中实现幂等性处理,确保重复消费不会导致数据异常。

  • 建立重试机制和死信队列:对处理失败的消息进行重试,超过重试次数的消息转入死信队列,便于后续排查和处理 。

  • 监控和报警机制:实时监控消息队列和消费者服务的运行状态,及时发现并处理异常情况。

  • 数据补偿机制:对于处理失败或丢失的消息,建立数据补偿机制,确保数据的最终一致性。

  1. 🎯 适用场景
  • 对系统性能要求高、数据一致性要求相对较低的场景:如电商平台的商品浏览记录、用户行为日志等数据的同步。

  • 需要支持多数据源写入的场景:如将数据同步到多个搜索引擎或分析平台。

  • 对数据实时性要求不高的场景:如定期生成报表、数据分析等。

三、定时同步(Scheduled Synchronization)🕒

  1. 🔧 原理

    定时同步是通过预设的时间间隔(如每小时、每天)从主数据库(如 MySQL)中提取数据,批量写入 Elasticsearch(ES)。常用工具包括 Logstash 的 JDBC 插件、定时任务(如 cron)、ETL 工具(如 Apache NiFi)等。

  2. ✅ 优点

    • 实现简单,业务代码无侵入:无需修改现有业务逻辑,易于部署和维护。

    • 适用于对实时性要求不高的场景:如报表生成、数据分析等。

    • 支持批量处理:利用 Elasticsearch 的 Bulk API 进行批量写入,提高数据同步效率 。

  3. ❌ 缺点

    • 实时性较差:存在数据同步延迟,无法满足对实时性要求高的场景。

    • 对数据库有一定的轮询压力:频繁的查询操作可能增加数据库负载。

    • 处理删除操作复杂:需要额外的机制来识别和同步删除的数据 。

  4. 🛠️ 优化建议

    • 使用增量同步:通过记录数据的更新时间戳,仅同步自上次同步以来发生变化的数据,减少数据同步量 。

    • 在业务低峰期执行同步任务:降低对系统的影响,确保主业务的稳定运行。

    • 利用 Logstash 的 JDBC 插件:配置定时任务,自动从 MySQL 中提取数据并写入 ES,支持数据的解析、转换和过滤 。

    • 建立监控和报警机制:实时监控数据同步状态,及时发现并处理异常情况。

  5. 🎯 适用场景

    • 对实时性要求不高的场景:如报表生成、数据分析、数据归档等。

    • 数据变更频率较低的场景:如每日或每周更新的数据。

    • 系统资源有限的场景:无法支持实时同步所需的系统资源。

四、基于 Binlog 的实时同步(Real-time Synchronization via Binlog)🔄

  1. 🔧 原理

    通过订阅 MySQL 的 Binlog(Binary Log)日志,实现数据的实时同步。Binlog 记录了数据库的所有更改操作(如 INSERT、UPDATE、DELETE),可以被外部工具解析并同步到其他系统,如 Elasticsearch(ES)或 Kafka。常用的 Binlog 解析工具包括 Canal、Maxwell 和 Debezium。

  2. ✅ 优点

    • 实时同步,延迟低:能够实现近实时的数据同步,适用于对实时性要求高的场景。

    • 业务代码无侵入,解耦性好:无需修改现有业务逻辑,解耦性强,便于维护。

    • 支持增量同步:仅同步数据的变更,减少数据传输量,提高效率。

    • 支持多种数据目标系统:可以将数据同步到多种目标系统,如 ES、Kafka、HDFS 等。

  3. ❌ 缺点

    • 系统复杂度高:需要部署和维护 Binlog 解析工具,增加系统复杂度。

    • 对系统的稳定性和一致性要求高:需要确保 Binlog 解析工具的稳定运行,避免数据丢失或重复。

    • 性能开销:启用 Binlog 会增加数据库的 I/O 开销,可能影响性能。

  4. 🛠️ 优化建议

    • 选择合适的 Binlog 解析工具:根据业务需求选择合适的工具,如 Canal、Maxwell 或 Debezium。

    • 配置合适的 Binlog 格式:根据需要选择 Statement、Row 或 Mixed 格式,以平衡性能和数据一致性。

    • 部署高可用的 Binlog 解析架构:确保 Binlog 解析工具的高可用性,避免单点故障。

    • 监控和报警机制:建立完善的监控和报警机制,及时发现并处理异常情况。

    • 性能优化:优化 Binlog 解析工具的配置,减少对数据库性能的影响。

  5. 🎯 适用场景

    • 对数据实时性要求高,且系统规模较大的场景:如实时搜索、实时推荐等业务场景。

    • 需要实现数据的增量同步和高可用性:如数据仓库建设、日志分析等。

    • 需要将数据同步到多种目标系统的场景:如多系统数据整合、数据备份等。

五、选型建议 🧠

  1. 小型系统,强一致性要求

    • 推荐方案:同步双写(Synchronous Dual Write)

    • 适用场景:金融系统、订单系统、库存管理等对数据一致性要求极高的业务场景。

    • 优点:实现简单,实时性高,确保数据在 MySQL 和 Elasticsearch 中的一致性。

    • 注意事项:业务代码耦合度高,维护复杂;写入 Elasticsearch 失败时需处理事务回滚,增加系统复杂度;对系统性能有一定影响。

  2. 中大型系统,性能优先

    • 推荐方案:异步双写(Asynchronous Dual Write)

    • 适用场景:电商平台、社交媒体、内容管理系统等对系统性能要求较高,但对数据一致性要求相对较低的场景。

    • 优点:降低主数据库写入延迟,提高系统性能;即使 Elasticsearch 出现问题,也不会影响主库的正常运行和数据写入;多源写入之间相互隔离,便于扩展更多的数据源写入。

    • 注意事项:系统复杂度增加,需要引入消息中间件;实时性较低,可能出现数据同步延迟;存在数据一致性风险,需确保最终一致性。

  3. 报表分析、非实时数据处理

    • 推荐方案:定时同步(Scheduled Synchronization)

    • 适用场景:数据仓库建设、日志分析、用户活跃度分析等对实时性要求不高的场景。

    • 优点:实现简单,业务代码无侵入;适用于对实时性要求不高的场景;支持批量处理,提高数据同步效率。

    • 注意事项:实时性较差,存在数据同步延迟;对数据库有一定的轮询压力;处理删除操作复杂,需要额外的机制来识别和同步删除的数据。

  4. 大型系统,实时搜索和推荐等场景

    • 推荐方案:基于 Binlog 的实时同步(Real-time Synchronization via Binlog)

    • 适用场景:实时搜索、实时推荐、数据仓库建设等对数据实时性要求高,且系统规模较大的场景。

    • 优点:实现实时同步,延迟低;业务代码无侵入,解耦性好;支持增量同步,减少数据传输量,提高效率;支持多种数据目标系统的同步。

    • 注意事项:系统复杂度高,需要部署和维护 Binlog 解析工具;对系统的稳定性和一致性要求高;性能开销,启用 Binlog 会增加数据库的 I/O 开销,可能影响性能。

六、快速对比表 📊

场景类型推荐方案实时性要求一致性要求系统规模复杂度优势
小型系统,强一致性要求同步双写(Synchronous Dual Write)实现简单,实时性高,确保数据一致性
中大型系统,性能优先异步双写(Asynchronous Dual Write)提升系统性能,解耦性好,适应高并发场景
报表分析、非实时数据处理定时同步(Scheduled Synchronization)实现简单,适用于批量数据处理,成本较低
大型系统,实时搜索和推荐等场景基于 Binlog 的实时同步(Real-time Synchronization via Binlog)实现实时同步,支持增量同步,适应大规模数据处理

七、总结 📝

  • 同步双写: 适用于对数据一致性要求极高的小型系统,但需要权衡系统性能和维护复杂度。

  • 异步双写 :适用于中大型系统,能够提升系统性能,但需要确保最终一致性。

  • 定时同步: 适用于对实时性要求不高的场景,成本较低,易于实现。

  • 基于 Binlog 的实时同步: 适用于大型系统,能够实现实时数据同步,适应大规模数据处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/235.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【相机标定】OpenCV 相机标定中的重投影误差与角点三维坐标计算详解

摘要: 本文将从以下几个方面展开,结合典型代码深入解析 OpenCV 中的相机标定过程,重点阐述重投影误差的计算方法与实际意义,并通过一个 calcBoardCornerPositions() 函数详细讲解棋盘格角点三维坐标的构建逻辑。 在计算机视觉领域…

【MySQL】联合查询

个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 一、什么是联合查询 1.概念 2.语法要求 3.示例 4.为什么要使用联合查询 内连接 1.概念 2.语法 3.步骤: 外连接 1.概念 2.分类: 左外连…

如何从极狐GitLab 容器镜像库中删除容器镜像?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 从容器镜像库中删除容器镜像 (BASIC ALL) 您可以从您的容器镜像库中删除容器镜像。 要基于特定标准自动删除容器镜像&#x…

【Git】【commit】查看未推送的提交查看指定commit的修改内容合并不连续的commit

文章目录 1. 查看未推送的提交方法一 :git status方法二:git log方法三:git cherry方法四:git rev-list 2. 查看指定commit的修改方法一:git show方法二:git log方法三:git diff 3. 合并不连续的…

神经网络—感知器、多层感知器

文章目录 前言一、生物神经元与感知器的类比二、感知器1、简单感知器2、多层感知器(1)多层感知机结构 3、神经网络结构 总结1、感知器的局限性如何突破感知器的局限性? 2、感知器的应用 前言 感知器(Perceptron)是神经…

C++:扫雷游戏

一.扫雷游戏项目设计 1.文件结构设计 首先我们要先定义三个文件 ①test.c //文件中写游戏的测试逻辑 ②game.c //文件中写游戏中函数的实现等 ③game.h //文件中写游戏需要的数据类型和函数声明等 2.扫雷游戏的主体结构 使⽤控制台实现经典的扫雷游戏 •游戏可以通过菜单…

k8s的pod挂载共享内存

k8s的pod挂载共享内存,限制不生效问题: 注:/dev/shm 是 Linux 系统中用于共享内存的特殊路径。通过将 emptyDir 的 medium 设置为 Memory,可以确保 /dev/shm 正确地挂载到一个基于内存的文件系统,从而实现高效的共享内…

【Linux学习笔记】基础IO之理解文件

【Linux学习笔记】基础IO之理解文件 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 前言 哈喽,各位小伙伴大家好!上期我们讲了进程替换 今天我们讲的是基础IO之理解文件。话不多说,我们进入正题&#…

XL32F001国产低成本单片机,24MHz主频,24KB Flash,3KB SRAM

XL32F001 是一颗基于ARM Cortex-M0内核的32 位微控制器,专为低成本、低功耗、小型化嵌入式系统设计,适合对资源需求中等但强调性价比和能效的场景。主频可达24M,内存方面有24KB Flash和3KB SRAM,适用于资源需求不大的应用场景。1.…

Oracle免费认证来袭

1、Oracle Cloud Infrastructure 2025 Foundations Associate” 🔗 考证地址:https://mylearn.oracle.com/ou/exam-unproctored/oracle-cloud-infrastructure-2025-foundations-associate-1z0-1085-25/148056/241954 2、Oracle Cloud Infrastructure 2…

C++ 完美转发

C 完美转发逐步详解 1. 问题背景与核心目标 在 C 模板编程中&#xff0c;若直接将参数传递给其他函数&#xff0c;参数的 值类别&#xff08;左值/右值&#xff09;和 类型信息&#xff08;如 const&#xff09;可能会丢失。例如&#xff1a; template<typename T> voi…

第2章 算法分析基础

2-1 算法的时间复杂度分析 2.1.1 输入规模与基本语句 输入规模&#xff1a;算法处理数据的规模&#xff0c;通常用 n 表示。 基本语句&#xff1a;执行次数与输入规模直接相关的关键操作。 例2.1 顺序查找 int SeqSearch(int A[], int n, int k) { for (int i 0; i < n…