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

彻底理解如何保证ElasticSearch和数据库数据一致性问题

一.业务场景举例

需求:

一个卖房业务,双十一前一天,维护楼盘的运营人员突然接到合作开发商的通知,需要上线一批热门的楼盘列表,上传完成后,C端小程序支持按楼盘的名称、户型、面积等产品属性全模糊搜索热门楼盘。

需求分析,提取其中的关键点:

1.功能需求:按楼盘的名称、户型、面积等产品属性全模糊搜索;

2.非功能需求(比如性能、安全等):双十一期间,楼盘搜索QPS预计在800左右,搜索完成后展示的楼盘字段信息非常多。

假设底层使用Mysql数据库存储,用户输入楼盘的名称、户型、面积等产品属性,支持全模糊查询,就无法走索引,如果QPS并发上来后,数据库很容易被打爆,所以我们需要考虑其他的存储方案

通过技术调研发现,在全文搜索领域,ES已经成为事实的标准方案,它有很多优势:

(1)高性能;

(2)分布式部署,水平扩容;

(3)准实时。

所以综合考虑,最终我们在方案选型上选择了ES,热门楼盘在运营后台完成新增或修改,写入Mysql后,将数据库的变更记录同步到ES中,那如何保证Es与Mysql的数据一致性?

解决方案:

1.ES与数据库双写方案;

2.MQ异步写入方案(大厂第二推荐);

3.定时任务同步方案;

4.监听Binlog异步同步方案(大厂第一推荐)。

具体使用哪种方案,还需根据自身业务场景来定,接下就对这四种方案分别进行优缺点的分析。

二.ES与数据库双写方案

在数据库写入Mysql的同时,通过编程逻辑将相同的数据写入ES。(串行写入数据)

优点:

1.实时性:数据变更能够立即反映到Elasticsearch,保证了查询的实时性;

2.简单性:实现起来相对简单,不需要引入额外的组件或复杂逻辑。 

缺点:

1.性能影响:每次写入MySQL的同时写入Elasticsearch,可能会对两个系统的性能都产
生影响;
2.数据一致性风险:在高并发情况下,可能会遇到双写失败导致数据不一致的问题;
3.系统耦合:每个写入操作都需要双写逻辑,增加了业务逻辑的复杂性和维护难度。

实现步骤:

1.代码修改:在业务逻辑中,对于每次对MySQL的写入操作,复制相同的逻辑到Elasticsearch;

2.事务管理:使用数据库事务确保操作的原子性,避免数据不一致;

3.性能优考:虑使用批量写入或异步处理来减少对性能的影响。

三.MQ异步写入方案

利用消息队列(MQ)异步处理数据写入操作。(通过订阅MQ来写如ES,可以优化同步写入性能问题)

优点:

1.性能提升:通过异步处理,减少了对MySQL写入性能的影响;

2.容错性:利用消息队列的持久化和重试机制,提高了数据同步的可靠性(即使MQ挂了,重启MQ以后,还是可以继续消费消息进行同步)。

缺点:

1.数据延迟:由于是异步处理,存在数据同步的延迟问题;

2.系统复杂度:需要引入消息队列和额外的消费者逻辑,增加了系统的复杂性(因为在MQ的下游还需要编写一个消费者来同步更新ES)。

实现步骤:

1.消息队列集成:选择并集成一个消息队列系统,如Kafka或RabbitMQ;

2.业务逻辑修改:将数据写入MySQL后,将变更信息发送到消息队列;

3.消费者开发:开发消费者服务,从消息队列中读取消息并异步写入ES;

4.异常处理:为消息队列的消费者实现异常处理和重试逻辑。

四.定时任务同步方案

通过定时任务,根据数据库中的时间戳字段变化来抽取并同步到ES。(这个方式还需要在表中增加以一个时间戳的字段来进行记录,才能方便同步的应用抽取数据)

优点:

1.无侵入性:不需要修改现有业务逻辑,对原系统无感知;

2.简单实现:通过定时任务实现,逻辑简单,易于理解和维护。

缺点:

1.时效性差:数据同步存在延迟,无法满足实时性要求(因为定时任务的脚本并不是实时的,所以会导致ES中的数据要比Mysql中的数据慢很多);

2.性能压力:定时任务可能会对数据库产生额外的查询压力(原本Mysql只需要支持系统应用的运行,现在还需要支持定时任务的查询,就可能导致额外的查询压力)。

实现步骤:

1.时间截字段添加:在MySQL的数据表中添加时间戳字段,用于记录数据变更时间;

2.定时任务配置:设置定时任务,按照固定频率查询MySQL中自上次同步以来发生变化的数据;

3.数据抽取:定时任务将查询结果抽取出来,准备同步到ES;

4.数据同步:将抽取的数据写入ES,完成同步过程。

五.监听Binlog异步同步方案

利用Mysql的Binlog日志,通过消息队列或者直接消费Binlog变化来同步数据至ES。(相比于用Binlog的组件替代了定时任务,Binlog组件伪装成一个从节点,当主节点发送了数据变更后,它就回把数据发送到子子节点,也就是Binlog组件中,然后组件收到数据后就同步到ES)

优点:

1.无侵入性:不需要修改现有的亚务代码,对现有系统无感知;

2.数据一致性:可以利用Binlog精确捕捉到数据库的所有变更,确保数据同步的完整;

3.高性能:Binog可以高效地处理数据变更,对原数据库性能影响较小(因为只是伪装了一个从节点,也就是相当于多一个节点需要同步数据);

4.容错性:通常配合消息队列使用,即使在网络波动或服务故障的情况下,也能保证数据最终一致性。

缺点:

1.系统复杂性:需要搭建和维护Binlog监听和消息队列系统,增加了系统架构的复杂度;

2.延时问题:虽然是基于实时同步,但在极端情况下,如消息队列积压,仍然可能遇到数据同步延迟。

实现步骤:

1.Binlog启用:确保MySQL实例开启了Binog功能,并且Binlog格式(row或mixed)能够支持所需的数据同步需求;

2.Binlog监听器配置:部署并配置Binlog监听器(如Debezium),监听指定的MySQL实例和数据库。
消息队列集成:将Binlog监听器与消息队列(如Kafka)集成,确保Binlog变更能够被转换成消息并发送到队列中;

3.消息消费者开发:开发消息消费者服务,该服务从消息队列中读取Binog变更消息并将其转换为Elasticsearch能够理解的格式;

4.数据同步:消息消费者服务将转换后的数据写入Elasticsearch,完成数据同步异常处理:实现异常处理机制,确保在数据同步失败时能够进行重试或记录日志以便后续处理。

推荐使用数据同步工具:Canal

PS:

如果还需要了解更多的ElasticSerache的使用方法,可以查看《ElasticSearch7.6.x 快速入门到实战案例》文章。

相关文章:

彻底理解如何保证ElasticSearch和数据库数据一致性问题

一.业务场景举例 需求: 一个卖房业务,双十一前一天,维护楼盘的运营人员突然接到合作开发商的通知,需要上线一批热门的楼盘列表,上传完成后,C端小程序支持按楼盘的名称、户型、面积等产品属性全模糊搜索热门…...

2024-2025热门留学趋势

在信息爆炸的时代,留学已成为许多人规划未来、拓宽视野的重要途径。随着全球教育格局的不断变化,留学领域也涌现出一系列新热点和趋势。本文将为您解读2024年最热门的留学话题,并提供实用的准备策略,助您在留学之路上一帆风顺。 热…...

寻找视频特效素材的优质网站推荐 轻松提升作品魅力

在短视频、影视和广告制作中,视频特效素材已成为提升作品专业感的关键元素。炫酷的光效、震撼的爆炸、动感的粒子效果和流畅的转场特效,都能让作品更具吸引力。那么,视频特效素材去哪里找呢?今天,小编为大家精心挑选了…...

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-36

文件下载与邀请翻译者 学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么&#xff…...

信息安全实验--密码学实验工具:CrypTool

1. CrypTool介绍💭 CrypTool 1的开源教育工具,用于密码学研究。通过CrypTool 1,可以实现加密和解密操作,数字签名。CrypTool1和2有很多区别的。 2. CrpyTool下载🔧 在做信息安全实验--密码学相关实验时,发…...

python的class 类创建、方法调用以及属性赋值

题目:购物车系统 创建一个简单的购物车系统,要求如下: 定义一个 Product 类,表示商品,包含以下属性和方法: 属性: name:商品名称(字符串) price&#xff1…...

Angular v19 (二):响应式当红实现signal的详细介绍:它擅长做什么、不能做什么?以及与vue、svelte、react等框架的响应式实现对比

本文紧接着Angular v19 新版本来啦,一起瞧瞧新特性吧!,主要针对它在v18引入了一项全新的响应式技术——Signal,这引起了开发者社区的广泛关注,最新的v19版本推出了更多的signal工具。Signal的加入旨在优化Angular的响应…...

IMX 平台UART驱动情景分析:write篇--从 TTY 层到硬件驱动的写操作流程解析

往期内容 本专栏往期内容:Uart子系统 UART串口硬件介绍深入理解TTY体系:设备节点与驱动程序框架详解Linux串口应用编程:从UART到GPS模块及字符设备驱动 解UART 子系统:Linux Kernel 4.9.88 中的核心结构体与设计详解IMX 平台UART驱…...

网络安全拟态防御技术

一. 拟态防御 拟态现象(Mimic Phenomenon, MP)是指一种生物如果能够在色彩、纹理和形状等特征上模拟另一种生物或环境,从而使一方或双方受益的生态适应现象。按防御行为分类可将其列入基于内生机理的主动防御范畴,又可称之为拟…...

灵活开源低代码平台——Microi吾码(一)

开源低代码平台-Microi吾码-平台简介1. 什么是低代码平台?2. 它能做什么?3. 它的优点是什么? 平台预览图平台亮点版本区别成功案例源码目录说明Microi吾码 - 系列文档 开源低代码平台-Microi吾码-平台简介 技术框架:.NET8 Redis …...

frida_hook_libart(简单解释)

一:直接取代码 //frida -U -f com.xingin.xhs -l hook_art.js -o xhsart.log //frida -U -f com.tencent.mobileqq -l hook_art.js -o qqart.logconst STD_STRING_SIZE 3 * Process.pointerSize; class StdString {constructor() {this.handle Memory.alloc(STD_S…...

计算机网络八股整理(二)

计算机网络八股整理(二) 应用层 1:dns的全称了解过吗? dns全称domain-name-system,翻译过来就是域名系统,是在计算机网络中将域名转换成ip地址的分布式数据库系统; 域名服务器的层级类似一个树…...

强化学习off-policy进化之路(PPO->DPO->KTO->ODPO->ORPO->simPO)

需要LLM在训练过程中做生成的方法是 On Policy,其余的为Off Policy。 On Policy是包含了反馈机制,Off Policy不包含反馈机制。 若进行环境交互的模型与被更新的模型是相同的模型,通常这种更新策略被称为on-policy的策略。on-policy的方法会有…...

Linux 如何创建逻辑卷并使用

一、逻辑卷的介绍 生成环境中逻辑卷使用率很高 逻辑卷的诞生:如果对磁盘直接使用fdisk分区,那么这中分区,我们叫做Linux的标准分区,Linux的标准分区格式化成文件系统之后,挂载使用,那么一旦文件系统的空间…...

java实现将图片插入word文档

插入图片所用依赖 private static void insertImage(XWPFDocument document, String path) {List<XWPFParagraph> paragraphs document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {CTP ctp paragraph.getCTP();for (int dwI 0; dwI < ctp.sizeO…...

初识java(3)

大家好&#xff0c;今天我们来讲讲我们的老伙计-变量&#xff0c;在哪一门编程语言中&#xff0c;变量的作用都是不可或缺的&#xff0c;那么下面我们就来详细了解一下java中的变量。 一.变量概念 在程序中&#xff0c;除了有始终不变的常量外&#xff0c;有些内容可能会经常…...

coqui-ai TTS 初步使用

项目地址&#xff1a;https://github.com/coqui-ai/TTS 1. 创建一个新的conda环境&#xff0c;如果自己会管理python环境也可以用其他方法 克隆项目下来 pip install -r requirements.txt # 安装依赖 pip install coqui-tts # 只要命令行工具的话 下载自己想要的模型 …...

matlab代码--卷积神经网络的手写数字识别

1.cnn介绍 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习的算法&#xff0c;在图像和视频识别、图像分类、自然语言处理等领域有着广泛的应用。CNN的基本结构包括输入层、卷积层、池化层&#xff08;Pooling Layer&#xff09;、全连…...

Scala—Map用法详解

Scala—Map用法详解 在 Scala 中&#xff0c;Map 是一种键值对的集合&#xff0c;其中每个键都是唯一的。Scala 提供了两种类型的 Map&#xff1a;不可变 Map 和可变 Map。 1. 不可变集合&#xff08;Map&#xff09; 不可变 Map 是默认的 Map 实现&#xff0c;位于 scala.co…...

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【六】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

3分钟搞定Word参考文献:APA第7版免费安装终极指南

3分钟搞定Word参考文献&#xff1a;APA第7版免费安装终极指南 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为学术论文的APA格式烦恼吗&#xff…...

Anaconda 安装与配置 的所有核心步骤

下载&#xff1a;去官网或靠谱的镜像源&#xff08;如清华镜像&#xff09;下载 2025.06版 Windows x64 安装包&#xff08;约950MB&#xff09;。安装&#xff1a;运行 .exe 文件。关键选项1&#xff1a;勾选 Add Anaconda to my PATH &#xff08;添加到环境变量&#xff09;…...

超导输电技术:从原理到工程应用的挑战与前景

1. 超导输电线路&#xff1a;从技术神话到工程现实的漫长跋涉大约二十年前&#xff0c;当“高温超导”这个名词开始从实验室走向产业界的视野时&#xff0c;整个电力工程领域都为之振奋。想象一下&#xff0c;我们日常依赖的庞大电网&#xff0c;其输电线路中高达5%到10%的电能…...

CSS如何利用Sass实现透明度动态化_通过函数计算CSS颜色值

...

嵌入式软件在医疗设备开发中的关键技术与实践

1. 嵌入式软件如何重塑现代医疗设备开发作为一名在医疗电子行业摸爬滚打十余年的嵌入式系统工程师&#xff0c;我亲眼见证了嵌入式技术如何彻底改变医疗设备的形态与功能。2008年参与第一台便携式心电监护仪开发时&#xff0c;设备体积还像个手提箱&#xff0c;如今同样功能的设…...

Qt QColumnView实战:手把手教你打造一个macOS Finder风格的文件浏览器

Qt QColumnView实战&#xff1a;从零构建macOS风格文件浏览器 在桌面应用开发中&#xff0c;文件浏览器的实现一直是开发者面临的经典挑战。传统方案往往采用QTreeView或QListView&#xff0c;但它们难以还原macOS Finder那种优雅的列式导航体验。这正是QColumnView的用武之地—…...

CV前沿论文实战解码:轻量化与多模态对齐的工程落地指南

1. 这不是“论文速递”&#xff0c;而是一份面向实战者的CV研究动态解码指南你点开这个标题&#xff0c;大概率不是为了收藏一份PDF列表&#xff0c;而是想快速判断&#xff1a;这篇新出的视觉论文&#xff0c;值不值得我花三小时精读&#xff1f;它背后的技术思路&#xff0c;…...

硬件工程师必读:九大核心算法如何重塑芯片与系统设计

1. 项目概述&#xff1a;一次关于算法之美的深度阅读作为一名在电子工程和数字设计领域摸爬滚打了十几年的工程师&#xff0c;我的日常工作就是和FPGA、ASIC、各种EDA工具以及层出不穷的硬件描述语言打交道。我们这行&#xff0c;天天谈的是时序收敛、功耗优化、面积利用&#…...

10x-bench-eval:量化开发效率的基准测试框架设计与实践

1. 项目概述&#xff1a;当“10倍速”遇上“基准测试”在软件工程领域&#xff0c;“10倍速工程师”是一个充满争议又令人神往的概念。它描述的是一种理想状态&#xff1a;一位工程师凭借其卓越的工具链、深刻的问题洞察力以及高效的自动化能力&#xff0c;其产出效率能达到普通…...

Redis++完全指南:C++开发者的终极Redis客户端解决方案

Redis完全指南&#xff1a;C开发者的终极Redis客户端解决方案 【免费下载链接】redis-plus-plus Redis client written in C 项目地址: https://gitcode.com/gh_mirrors/re/redis-plus-plus Redis是一款专为C开发者打造的高性能Redis客户端&#xff0c;它提供了简洁易用…...