保证Mysql数据库到ES的数据一致性的解决方案
文章目录
- 1.业务场景介绍
- 1.1 需求分析
- 1.2 技术实现方案
- 2.业界常用数据一致性方案分析
- 2.1 同步双写方案
- 2.2 MQ异步双写方案
- 2.3 扫表定期同步方案
- 2.4 监听binlog同步方案
1.业务场景介绍
1.1 需求分析
某知名的在线旅游平台,在即将到来的春季促销活动之前,决定推出一项新的功能:用户可以通过输入目的地、酒店名称、房型、价格范围等属性来搜索旅游优惠酒店。为了及时上线这一功能,运营团队需要将现有的酒店数据同步到高效的搜索引擎中,以支持用户的高频搜索需求。
- 功能需求:
按目的地、酒店名称、房型、价格范围等属性进行全模糊搜索酒店信息。
- 非功能需求:
- 性能:预计春季促销期间酒店搜索的QPS将达到1000左右,搜索结果会包含丰富的酒店信息。
- 响应时间:搜索响应时间需控制在500毫秒以内,以确保良好的用户体验。
数据一致性:确保搜索结果反映的是最新的酒店信息及可用性。
1.2 技术实现方案
假设底层使用MySQL数据库存储酒店数据,以下是实现该需求的技术方案:
- 数据同步:利用MySQL的binlog或第三方数据同步工具(如Debezium、Canal等)来实时监听酒店数据的变更,并将这些变更同步到Elasticsearch中。
- 索引构建:在Elasticsearch中为目的地、酒店名称、房型、价格范围等字段建立合适的索引,以支持快速和高效的模糊搜索。
通过将数据从MySQL实时同步到Elasticsearch,并优化查询性能,我们可以实现一个快速、准确的酒店搜索功能,满足春季促销期间的高并发搜索需求。
思考: 如何保证Mysql数据库和ES的数据一致性?
2.业界常用数据一致性方案分析
在确保My数据库和Elasticsearch(ES)数据一致性方面,业界有几种常见的方案:
- 同步双写方案
在代码中对数据库和ES进行双写操作,确保先更新数据库后更新ES。如果数据库更新成功而ES更新失败,可以通过事务回滚来保证一致性。这种方案简单易实现,但可能存在性能瓶颈和不一致的风险。 - MQ异步双写方案
使用消息队列(如RocketMQ、Kafka等)作为中间件,应用程序在更新数据库后发送消息到MQ,由MQ的消费者异步更新ES。这种方案可以解耦数据库和ES,提高性能,但可能存在消息延迟和系统复杂度增加的问题。 - 扫表定时同步方案
通过定时任务定期扫描数据库,将变更的数据同步到ES。这种方案的实时性较差,但可以减少对数据库的即时压力。 - 监听binlog同步方案
通过直接监听MySQL的binlog来实现数据库和ES之间的实时同步。这种方案对业务代码没有侵入性,可以实现数据库和ES的实时同步,但需要额外的框架和可能存在一定的延迟。
2.1 同步双写方案
实现思路
在数据写入MySQL的同时,直接将相同的数据写入ES。
优缺点对比
优点
- 数据一致性:双写策略可以保证在MySQL和Elasticsearch之间数据的强一致性,因为每次数据库的变更都会在Elasticsearch中同步反映。
- 实时性:双写策略可以实现数据的实时同步,用户在MySQL中进行的任何操作都会立即在Elasticsearch中体现。
- 易于实现:从技术角度来说,双写策略的实现相对简单,通常只需要在应用程序代码中添加额外的写入逻辑。
缺点
- 代码复杂性:需要在应用程序中增加额外的代码来处理数据的双写,这会增加代码的复杂性和维护难度。
- 性能开销:每次数据库操作都需要执行两次,这会导致额外的性能开销,尤其是在高并发的场景下。
- 数据不一致风险:在双写过程中,如果发生系统故障或网络延迟,可能会出现数据不一致的情况,尤其是在写入MySQL成功但写入ES失败时。
应用场景
系统特点:旧系统年限长、单体架构且技术比较落后,如果引入除es之外的其他中间件治理成本很高,可以考虑这个方案。
业务场景:用户量少、偏后台管理类的系统,对数据同步的实时性要求很高,接近实时。
2.2 MQ异步双写方案
实现思路
使用消息队列(如RocketMQ、Kafka等)作为中间件,应用程序在更新数据库后发送消息到MQ,由MQ的消费者异步更新ES。
方案核心
- 生产者端双写:生产者系统在发送消息到MQ的同时,也写入到Mysql。
- 消费者端异步处理:消费者从MQ中读取消息,并异步地将消息处理结果写入到ES。
优缺点对比
优点
- 系统解耦:MQ的使用使得MySQL和ES之间的依赖性降低,提高了系统的可维护性和扩展性。
- 高可用性:MQ可以提供消息的持久化存储,确保即使系统故障,消息也不会丢失。
- 容错性:在双写过程中,即使某个系统出现故障,数据仍然可以通过其他系统恢复。
缺点
- 延迟:异步处理可能会导致数据同步的延迟,特别是在高负载或系统资源不足的情况下。
- 复杂度:引入MQ和双写机制增加了系统的复杂度,需要更多的开发和维护工作。
- 补偿机制:需要设计复杂的补偿机制来处理同步失败的情况,增加了系统的复杂性。
应用场景
系统特点:
- C端系统:该系统面向最终用户,可能是移动应用、Web应用或桌面应用。
- 引入MQ中间件:系统架构中已经包含了消息队列中间件,这为异步处理提供了基础。
- 接口TPS性能要求:系统对接口的吞吐量(TPS,Transactions Per Second)有一定要求,需要保证高并发情况下的性能。
业务场景:
- 用户体量大,高并发场景:系统服务的大量用户同时进行操作,导致系统面临高并发压力。
- 业务变更少:业务逻辑变更相对较少,数据同步的需求比较稳定。
- 允许一定的延迟:在保证用户体验的前提下,数据同步的延迟在秒级范围内是可以接受的。
2.3 扫表定期同步方案
实现思路
通过定时任务定期扫描数据库,将变更的数据同步到ES。
优缺点对比
优点
- 实现简单:使用定时任务调度框架,不需要复杂的开发工作。
- 适合批量数据:对于大量数据的迁移,批量处理可以减少网络传输次数和ES的写入压力。
- 对业务影响小:定时任务可以在系统负载较低的时段运行,对在线业务影响较小。
缺点
- 实时性差:由于是定期执行,数据同步存在延迟,不适合对实时性要求高的应用。
- 性能影响:同步过程中可能会对MySQL和ES的性能产生短期影响,尤其是在数据量大时。
- 数据一致性:如果在同步周期内数据发生变化,可能会导致ES中数据与MySQL不一致。
应用场景
- 系统特点:旧系统年限长、技术框架老旧,引入其他的中间件成本很高。
- 业务场景:用户体量小、偏报表统计类业务、对数据实时性要求不高。
2.4 监听binlog同步方案
实现思路
通过直接监听MySQL的binlog来实现数据库和ES之间的实时同步。
在高并发场景下,直接将binlog事件推送到ES可能会导致ES负载过高。Kafka可以作为缓冲层,暂时存储binlog事件,平滑数据流,避免瞬时的高负载。
优缺点对比
优点
- 业务无侵入,数据同步准实时
- 业务解耦,不需要关注原来系统的业务逻辑。
缺点
- 构建 Binlog 系统复杂;
- 如果采用 MQ 消费解析的 Binlog 信息,也会像方案二一样存在 MQ 延时的风险。
应用场景
- 系统特点: c端系统,开放mysql binlog日志监听,引入第三方canal中间件成本不高。
- 业务场景: 互联网公司,用户体量大、大型多中心组织、高并发场景,业务上允许有一定的延迟(秒级)。
相关文章:

保证Mysql数据库到ES的数据一致性的解决方案
文章目录 1.业务场景介绍1.1 需求分析1.2 技术实现方案 2.业界常用数据一致性方案分析2.1 同步双写方案2.2 MQ异步双写方案2.3 扫表定期同步方案2.4 监听binlog同步方案 1.业务场景介绍 1.1 需求分析 某知名的在线旅游平台,在即将到来的春季促销活动之前ÿ…...
Flutter Xcode 16+ iOS 18.1 使用image_pickers无法弹出选择图片的视图问题
解决 Flutter Xcode 16 使用 image_pickers 无法弹出选择图片视图的问题 在开发 Flutter 应用时,图片选择功能是常见的需求之一。image_pickers 库因其便捷性和功能丰富性,成为了许多开发者的选择。然而,随着 Xcode 版本的不断更新ÿ…...

socket网络编程-TC/IP方式
网络编程 1.概念:两台设备之间通过网络数据传输。 2.网络通信:将数据通过网络从一台设备传输另外一台设备。 3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。 TCP和UDP TCP协议: 1.使用TCP协…...

《分布式光纤测温:解锁楼宇安全的 “高精度密码”》
在楼宇建筑中,因其内部空间庞大,各类电器设施众多,如何以一种既高效又稳定,兼具低成本与高覆盖特性的方式,为那些关键线路节点开展温度监测,是目前在安全监测领域一项重点研究项目,而无锡布里渊…...
C语言基本知识复习浓缩版:数组
所谓数组(Array),就是一系列数据的集合。这些数据具有相同的类型,并且在内存中挨着存放,彼此之间没有缝隙。换句话说,数组用来存放多份数据,但是它有两个要求: 这些数据的类型必须相…...
Python贪心
贪心 贪心:把整体问题分解成多个步骤,在每个步骤都选取当前步骤的最优方案,直至所有步骤结束;每个步骤不会影响后续步骤核心性质:每次采用局部最优,最终结果就是全局最优如果题目满足上述核心性质…...
rk3568 内核态OOM内存泄漏kmemleak使用
1,配置,修改\kernel\arch\arm64\configs\rockchip_linux_defconfig,修改后查看.config. larkubuntu:~/Public/rk356x-linux/rk356x-linux/kernel$ cat .config | grep -i kmemleak CONFIG_HAVE_DEBUG_KMEMLEAKy CONFIG_DEBUG_KMEMLEAKy CONFI…...

ASP.NET Core - 日志记录系统(二)
ASP.NET Core - 日志记录系统(二) 2.4 日志提供程序2.4.1 内置日志提供程序2.4.2 源码解析 本篇接着上一篇 ASP.NET Core - 日志记录系统(一) 往下讲,所以目录不是从 1 开始的。 2.4 日志提供程序 2.4.1 内置日志提供程序 ASP.NET Core 包括…...
阿里云直播互动Web
官方文档:互动消息Web端集成方法_视频直播(LIVE)-阿里云帮助中心 以下是代码实现: <!-- 引入阿里云互动文件 --> <script src"https://g.alicdn.com/code/lib/jquery/3.7.1/jquery.min.js"></script> <script src&quo…...

解锁无证身份核验:开启便捷安全新征程
在当今快速发展的数字化时代,身份核验作为确保信息安全与交易诚信的基石,正经历着前所未有的变革。传统的身份核验方式,如携带身份证件进行现场验证,虽在一定程度上保障了安全,却也带来了诸多不便。随着科技的进步&…...

[DO374] Ansible 配置文件
[DO374] Ansible 配置文件 1. 配置文件位置2. 配置文件3. Ansible 配置4. Ansible的Ad-hoc5. Ansible 模块6. playbook段落7. 任务执行后续8. Ansible 变量8.1 ansible 变量的定义8.1.1 主机变量8.1.2 主机组变量 8.2 vars的循环 9. Ansible Collection10. Ansible-galaxy 安装…...

【杂谈】-50+个生成式人工智能面试问题(四)
7、生成式AI面试问题与微调相关 Q23. LLMs中的微调是什么? 答案:虽然预训练语言模型非常强大,但它们并不是任何特定任务的专家。它们可能对语言有惊人的理解能力,但仍需要一些LLMs微调过程,开发者通过这个过程提升它…...

RuoYi Cloud项目解读【四、项目配置与启动】
四、项目配置与启动 当上面环境全部准备好之后,接下来就是项目配置。需要将项目相关配置修改成当前相关环境。 1 后端配置 1.1 数据库 创建数据库ry-cloud并导入数据脚本ry_2024xxxx.sql(必须),quartz.sql(可选&…...

51c~Pytorch~合集5
我自己的原文哦~ https://blog.51cto.com/whaosoft/13059544 一、PyTorch DDP 正在郁闷呢 jetson nx 的torchvision安装~~ 自带就剩5g 想弄到ssd 项目中的 venv中又 cuda.h没有... 明明已经装好什么都对 算了说今天主题 啊对 还是搬运啊 学习之工具人而已 勿怪 Distrib…...

【芯片封测学习专栏 -- 什么是 Chiplet 技术】
请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewChiplet 背景UCIeChiplet 的挑战 Overview Chiplet 又称为小芯片。该技术通过将大型SoC划分为更小的芯片,使得每个部分都能采用不同…...
Java SpringBoot + Vue + Uniapp 集成JustAuth 最快实现多端三方登录!(QQ登录、微信登录、支付宝登录……)
注:本文基于 若依 集成just-auth实现第三方授权登录 修改完善,所有步骤仅代表本人如下环境亲测可用,其他环境需自辩或联系查看原因! 系统环境 运行系统:Windows10专业版、Linux Centos7.6 Java 版本:1.8.0_…...

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测
简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…...

ZYNQ初识10(zynq_7010)UART通信实验
基于bi站正点原子讲解视频: 系统框图(基于串口的数据回环)如下: 以下,是串口接收端的波形图,系统时钟和波特率时钟不同,为异步时钟,,需要先延时两拍,将时钟同…...

专题 - STM32
基础 基础知识 STM所有产品线(列举型号): STM产品的3内核架构(列举ARM芯片架构): STM32的3开发方式: STM32的5开发工具和套件: 若要在电脑上直接硬件级调试STM32设备,则…...

2 XDMA IP中断
三种中断 1. Legacy 定义:Legacy 中断是传统的中断处理方式,使用物理中断线(例如 IRQ)来传递中断信号。缺点: 中断线数量有限,通常为 16 条,限制了可连接设备的数量。中断处理可能会导致中断风…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...