当前位置: 首页 > news >正文

保证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)数据一致性方面,业界有几种常见的方案:

  1. 同步双写方案
    在代码中对数据库和ES进行双写操作,确保先更新数据库后更新ES。如果数据库更新成功而ES更新失败,可以通过事务回滚来保证一致性。这种方案简单易实现,但可能存在性能瓶颈和不一致的风险。
  2. MQ异步双写方案
    使用消息队列(如RocketMQ、Kafka等)作为中间件,应用程序在更新数据库后发送消息到MQ,由MQ的消费者异步更新ES。这种方案可以解耦数据库和ES,提高性能,但可能存在消息延迟和系统复杂度增加的问题。
  3. 扫表定时同步方案
    通过定时任务定期扫描数据库,将变更的数据同步到ES。这种方案的实时性较差,但可以减少对数据库的即时压力。
  4. 监听binlog同步方案
    通过直接监听MySQL的binlog来实现数据库和ES之间的实时同步。这种方案对业务代码没有侵入性,可以实现数据库和ES的实时同步,但需要额外的框架和可能存在一定的延迟。

2.1 同步双写方案

实现思路
在数据写入MySQL的同时,直接将相同的数据写入ES。
在这里插入图片描述
优缺点对比
优点

  1. 数据一致性:双写策略可以保证在MySQL和Elasticsearch之间数据的强一致性,因为每次数据库的变更都会在Elasticsearch中同步反映。
  2. 实时性:双写策略可以实现数据的实时同步,用户在MySQL中进行的任何操作都会立即在Elasticsearch中体现。
  3. 易于实现:从技术角度来说,双写策略的实现相对简单,通常只需要在应用程序代码中添加额外的写入逻辑。

缺点

  1. 代码复杂性:需要在应用程序中增加额外的代码来处理数据的双写,这会增加代码的复杂性和维护难度。
  2. 性能开销:每次数据库操作都需要执行两次,这会导致额外的性能开销,尤其是在高并发的场景下。
  3. 数据不一致风险:在双写过程中,如果发生系统故障或网络延迟,可能会出现数据不一致的情况,尤其是在写入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。
在这里插入图片描述
优缺点对比
优点

  1. 实现简单:使用定时任务调度框架,不需要复杂的开发工作。
  2. 适合批量数据:对于大量数据的迁移,批量处理可以减少网络传输次数和ES的写入压力。
  3. 对业务影响小:定时任务可以在系统负载较低的时段运行,对在线业务影响较小。

缺点

  1. 实时性差:由于是定期执行,数据同步存在延迟,不适合对实时性要求高的应用。
  2. 性能影响:同步过程中可能会对MySQL和ES的性能产生短期影响,尤其是在数据量大时。
  3. 数据一致性:如果在同步周期内数据发生变化,可能会导致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 需求分析 某知名的在线旅游平台,在即将到来的春季促销活动之前&#xff…...

Flutter Xcode 16+ iOS 18.1 使用image_pickers无法弹出选择图片的视图问题

解决 Flutter Xcode 16 使用 image_pickers 无法弹出选择图片视图的问题 在开发 Flutter 应用时,图片选择功能是常见的需求之一。image_pickers 库因其便捷性和功能丰富性,成为了许多开发者的选择。然而,随着 Xcode 版本的不断更新&#xff…...

socket网络编程-TC/IP方式

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

《分布式光纤测温:解锁楼宇安全的 “高精度密码”》

在楼宇建筑中,因其内部空间庞大,各类电器设施众多,如何以一种既高效又稳定,兼具低成本与高覆盖特性的方式,为那些关键线路节点开展温度监测,是目前在安全监测领域一项重点研究项目,而无锡布里渊…...

C语言基本知识复习浓缩版:数组

所谓数组(Array),就是一系列数据的集合。这些数据具有相同的类型,并且在内存中挨着存放,彼此之间没有缝隙。换句话说,数组用来存放多份数据,但是它有两个要求: 这些数据的类型必须相…...

Python贪心

贪心 贪心:把整体问题分解成多个步骤,在每个步骤都选取当前步骤的最优方案,直至所有步骤结束;每个步骤不会影响后续步骤核心性质:每次采用局部最优,最终结果就是全局最优如果题目满足上述核心性质&#xf…...

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

官方文档&#xff1a;互动消息Web端集成方法_视频直播(LIVE)-阿里云帮助中心 以下是代码实现&#xff1a; <!-- 引入阿里云互动文件 --> <script src"https://g.alicdn.com/code/lib/jquery/3.7.1/jquery.min.js"></script> <script src&quo…...

解锁无证身份核验:开启便捷安全新征程

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

[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中的微调是什么&#xff1f; 答案&#xff1a;虽然预训练语言模型非常强大&#xff0c;但它们并不是任何特定任务的专家。它们可能对语言有惊人的理解能力&#xff0c;但仍需要一些LLMs微调过程&#xff0c;开发者通过这个过程提升它…...

RuoYi Cloud项目解读【四、项目配置与启动】

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

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划分为更小的芯片&#xff0c;使得每个部分都能采用不同…...

Java SpringBoot + Vue + Uniapp 集成JustAuth 最快实现多端三方登录!(QQ登录、微信登录、支付宝登录……)

注&#xff1a;本文基于 若依 集成just-auth实现第三方授权登录 修改完善&#xff0c;所有步骤仅代表本人如下环境亲测可用&#xff0c;其他环境需自辩或联系查看原因&#xff01; 系统环境 运行系统&#xff1a;Windows10专业版、Linux Centos7.6 Java 版本&#xff1a;1.8.0_…...

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测

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

ZYNQ初识10(zynq_7010)UART通信实验

基于bi站正点原子讲解视频&#xff1a; 系统框图&#xff08;基于串口的数据回环&#xff09;如下&#xff1a; 以下&#xff0c;是串口接收端的波形图&#xff0c;系统时钟和波特率时钟不同&#xff0c;为异步时钟&#xff0c;&#xff0c;需要先延时两拍&#xff0c;将时钟同…...

专题 - STM32

基础 基础知识 STM所有产品线&#xff08;列举型号&#xff09;&#xff1a; STM产品的3内核架构&#xff08;列举ARM芯片架构&#xff09;&#xff1a; STM32的3开发方式&#xff1a; STM32的5开发工具和套件&#xff1a; 若要在电脑上直接硬件级调试STM32设备&#xff0c;则…...

2 XDMA IP中断

三种中断 1. Legacy 定义&#xff1a;Legacy 中断是传统的中断处理方式&#xff0c;使用物理中断线&#xff08;例如 IRQ&#xff09;来传递中断信号。缺点&#xff1a; 中断线数量有限&#xff0c;通常为 16 条&#xff0c;限制了可连接设备的数量。中断处理可能会导致中断风…...

自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器

使用 Open AI 兼容的 API&#xff0c;可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑&#xff0c;私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量&#xff0c;为了简化网络配置&#…...

抖音矩阵是什么

抖音矩阵是指在同一品牌或个人IP下&#xff0c;通过创建多个不同定位的抖音账号&#xff08;如主号、副号、子号等&#xff09;&#xff0c;形成一个有机的整体&#xff0c;以实现多维度、多层次的内容覆盖和用户互动。以下是关于抖音矩阵的详细介绍&#xff1a; 抖音矩阵的类…...

怎么抓取ios 移动app的https请求?

怎么抓取IOS应用程序里面的https&#xff1f; 这个涉及到2个问题 1.电脑怎么抓到IOS手机流量&#xff1f; 2.HTTPS怎么解密&#xff1f; 部分app可以使用代理抓包的方式&#xff0c;但是正式点的app用代理抓包是抓不到的&#xff0c;例如pin检测&#xff0c;证书双向校验等…...

pyqt鸟瞰

QApplication‌是Qt框架中的一个类&#xff0c;专门用于管理基于QWidget的图形用户界面&#xff08;GUI&#xff09;应用程序的控制流和主要设置。QApplication类继承自QGuiApplication&#xff0c;提供了许多与GUI相关的功能&#xff0c;如窗口系统集成、事件处理等。 QAppli…...

【Docker】入门教程

目录 一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 …...

Token和JWT的关系详细讲解

Token 和 JSON Web Token (JWT) 是两个相关但概念上不同的术语&#xff0c;它们在现代 Web 应用程序的身份验证和授权中扮演着重要角色。下面将详细介绍两者之间的关系以及 JWT 的具体工作原理。 1. Token 概述 Token 是一种广义的概念&#xff0c;指的是任何可以证明用户身份…...

【Linux系列】Curl 参数详解与实践应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

解决 Git SSL 连接错误:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno

问题描述 在执行 git pull 命令时遇到以下错误&#xff1a; > git pull --tags origin main fatal: unable to access github仓库: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0这个错误通常表示 Git 在尝试通过 HTTPS 连接到 GitHub 时遇到了 SSL 连接问题。 解决方案…...

《Vue3 八》<script setup> 语法

<script setup> 是在单文件中使用 Composition API 的编译时语法糖&#xff0c;里面的代码会被编译成组件 setup() 函数的内容。 <script setup> 中的代码在每次组件实例被创建的时候都都会被执行。 定义数据&#xff1a; 在 <script setup> 语法糖的写法中…...

51单片机和STM32集成蓝牙模块实用指南

51单片机和STM32集成蓝牙模块实用指南 蓝牙模块&#xff08;如HC-05、HC-06、JDY-31等&#xff09;是嵌入式开发中常用的无线通信模块&#xff0c;广泛应用于智能家居、物联网、机器人等领域。本文将详细介绍如何将蓝牙模块集成到 51单片机 和 STM32 中&#xff0c;并提供一个…...

广东江门市新会区疫情最新消息/重庆seo务

题目传送门 题目大意&#xff1a; 给一个长度为 LLL 的圆环&#xff0c;有两只青蛙&#xff0c;给出两者的起点和速度&#xff0c;问何时相遇。 题解 显然是个追击问题&#xff0c;先列出柿子&#xff1a; xtn≡ytm(modL)xtn\equiv ytm \pmod L xtn≡ytm(modL) 其中 ttt 即…...

电子邮箱/曲靖seo

这篇文章主要介绍了JS自动生成动态HTML验证码页面&#xff0c;输入错误自动清空输入框的功能&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下本文为大家分享了JS自动生成动态HTML验证码页面&#xff0c;输入错误自动清空输入框功能&#xff0c;供大家…...

建设部网站危房鉴定标准规定/免费网站模板网

时间同步: 首先需了解linux内一任务计划工具crontabcrontab可以定时去执行你要做的动作直接用crontab命令编辑crontab -u //设定某个用户的cron服务&#xff0c;一般root用户在执行这个命令的时候需要此参数crontab -l //列出某个用户cron服务的详细内容crontab -r //删除某个用…...

炉石卡牌制作网页/seo自动点击排名

在PHP语言总&#xff0c;单引号与双引号的作用不尽相同。 PHP单引号及双引号均可以修饰字符串类型的数据&#xff0c;如果修饰的字符串中含有变量&#xff08;例$name&#xff09;&#xff1b;最大的区别是&#xff1a;双引号会替换变量的值&#xff0c;而单引号会把它当做字符…...

自学网站官网/打广告在哪里打最有效

随着工作年限的增加&#xff0c;发现以前根本不关注的事情反而变成了瓶颈&#xff0c;比如说前端相关的知识。在写接口自动化&#xff0c;页面自动化或是服务自动化的时候&#xff0c;根本不会涉及太多前端的东西&#xff0c;后来在开发测试平台的时候&#xff0c;一个简单的前…...

网站开发的各个阶段及其完成的任务/百度广告投放平台

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录细粒度相关研究中用到的主要数据集如下弱监督 细粒度分类任务中&#xff0c;示例…...