保证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中间件成本不高。
  • 业务场景: 互联网公司,用户体量大、大型多中心组织、高并发场景,业务上允许有一定的延迟(秒级)。

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

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

相关文章

初学stm32 --- DAC模数转换器工作原理

目录 什么是DAC? DAC的特性参数 STM32各系列DAC的主要特性 DAC框图简介(F1/F4/F7) 参考电压/模拟部分电压 触发源 关闭触发时(TEN0)的转换时序图 DMA请求 DAC输出电压 什么是DAC? DAC,全称:Digital…

《HTTP协议与内外网划分:网络世界的基石知识》

http协议与内外网的划分 http协议的简介 HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从服务器传输超文本(如HTML)到本地浏览器的传输协议。以下是关于HTTP协议的简介: HTTP协议的基本…

二叉树层序遍历 Leetcode102.二叉树的层序遍历

二叉树的层序遍历相当于图论的广度优先搜索,用队列来实现 (二叉树的递归遍历相当于图论的深度优先搜索) 102.二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右…

特制一个自己的UI库,只用CSS、图标、emoji图 第二版

图&#xff1a; 代码&#xff1a; index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>M…

12工具篇(D3_Lombok)

目录 一、基本介绍 二、Lombok使用说明 1. 基本介绍 2. 安装插件 IDEA在线安装Lombok插件 IDEA离线安装Lombok插件 3. 引入依赖坐标 4. Lombok注解功能说明 NonNull Getter&Setter Cleanup ToString EqualsAndHashCode Constructor RequiredArgsConstructor …

STM32如何测量运行的时钟频率

前言 环境&#xff1a; 芯片&#xff1a;STM32F103C8T6 Keil&#xff1a;V5.24.2.0 一、简介STM32F103C8T6的时钟源 ①HSI 内部高速时钟,RC振荡器&#xff0c;频率为8MHz&#xff0c;精度不高。②HSE 外部高速时钟,可接石英/陶瓷谐振器&#xff0c;频率范围为4MHz~16MHz&…

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…

时序数据库InfluxDB—介绍与性能测试

目录 一、简述 二、主要特点 三、基本概念 1、主要概念 2、保留策略 3、连续查询 4、存储引擎—TSM Tree 5、存储目录 四、基本操作 1、Java-API操作 五、项目中的应用 六、单节点的硬件配置 七、性能测试 1、测试环境 2、测试程序 3、写入测试 4、查询测试 一…

探索数据存储的奥秘:深入理解B树与B+树

key value 类型的数据红黑树&#xff08;最优二叉树&#xff0c;内存最优&#xff09;&#xff0c;时间复杂度&#xff1a;O&#xff08;logn&#xff09;,调整方便&#xff1b;一个结点分出两个叉B树一个节点可以分出很多叉数据量相等的条件下&#xff1a;红黑树的层数很高&am…

element ui前端小数计算精度丢失的问题如何解决?

文章目录 前言一、什么是精度丢失&#xff1f;产生精度丢失的原因如何避免或减少精度丢失的影响 二、实际项目开发实例举例以项目预算模块为例如何解决精度丢失 总结 前言 在《工程投标项目管理系统》项目开发中工程项目预算、成本管理、财务管理等模块的开发中不可避免的要和…

小程序textarea组件键盘弹起会遮挡住输入框

<textarea value"{{remark}}" input"handleInputRemark" ></textarea> 如下会有遮挡&#xff1a; 一行代码搞定 cursor-spacing160 修改后代码 <textarea value"{{remark}}" input"handleInputRemark" cursor-spacin…

k8s笔记29--使用kyverno提高运维效率

k8s笔记29--使用kyverno提高运维效率 介绍原理安装应用场景自动修正测试环境pod资源强制 Pod 标签限制容器镜像来源禁止特权容器其它潜在场景 注意事项说明 介绍 Kyverno是一个云原生的策略引擎&#xff0c;它最初是为k8s构建的&#xff0c;现在也可以在k8s集群之外用作统一的…

如何理解机器学习中的线性模型 ?

在机器学习中&#xff0c;线性模型是一类重要且基础的模型&#xff0c;它假设目标变量&#xff08;输出&#xff09;是输入变量&#xff08;特征&#xff09;的线性组合。线性模型的核心思想是通过优化模型的参数&#xff0c;使模型能够捕捉输入与输出之间的线性关系。以下是线…

数据结构初阶---排序

一、排序相关概念与运用 1.排序相关概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的…

树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍

文章目录 1 GPIO编码方式1.1 管脚信息1.2 使用场合1.3 I2C总线1.4 SPI总线2 RPI.GPIO2.1 PWM脉冲宽度调制2.2 静态函数2.2.1 函数setmode()2.2.2 函数setup()2.2.3 函数output()2.2.4 函数input()2.2.5 捕捉引脚的电平改变2.2.5.1 函数wait_for_edge()2.2.5.2 函数event_detect…

学习RocketMQ

1.为什么要用MQ&#xff1f; 消息队列是一种“先进先出”的数据结构 其应用场景主要包含以下4个方面&#xff1a; 1.1 异步解耦​ 最常见的一个场景是用户注册后&#xff0c;需要发送注册邮件和短信通知&#xff0c;以告知用户注册成功。传统的做法有以下两种&#xff1a; …

3DGabor滤波器实现人脸特征提取

import cv2 import numpy as np# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # 相位偏移# 生成 Gabor 滤…

LabVIEW自动扫描与图像清晰度检测

要在LabVIEW中实现通过电机驱动相机进行XY方向扫描&#xff0c;找到物品并获取最清晰的图像&#xff0c;可以采用以下方案&#xff1a; 1. 系统概述 硬件组成&#xff1a;电机驱动的XY扫描平台、工业相机、控制器&#xff08;如NI的运动控制卡&#xff09;、计算机。 软件平台…

Vue3(一)

1.Vue3概述 Vue3的API由Vue2的选项式API改为了组合式API。但是&#xff0c;也是Vue2中的选项式API也是兼容的。 2.创建Vue3项目 create-vue 是 Vue 官方新的脚手架工具&#xff0c;底层切换到了 vite。使用create-vue创建项目的步骤如下&#xff1a; 安装 create-vue npm i…

使用wav2vec 2.0进行音位分类任务的研究总结

使用wav2vec 2.0进行音位分类任务的研究总结 原文名称&#xff1a; Using wav2vec 2.0 for phonetic classification tasks: methodological aspects 研究背景 自监督学习在语音中的应用 自监督学习在自动语音识别任务中表现出色&#xff0c;例如说话人识别和验证。变换器模型…