彻底理解如何保证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 快速入门到实战案例》文章。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机将图片数组调出来显示MPU8_8bpp_Memory_Write

界面显示图片是很常见的需求,使用外挂的FLASH是最常用的方法。但是如果图片需求不大,比如说我们只要显示一个小图标,那么为了节省硬件成本,是不需要外挂一颗FLASH芯片的,我们可以将图标转成数组,存在单片机…

VS的安装和配置

目录 概述 安装Visual Studio 下载引导安装包 在线安装(推荐) 使用Visual Studio进行开发 创建项目 配置项目 项目 VS 解决方案(重要) 命名 完成项目创建 创建源文件 编写代码 VS项目目录的说明(补充&…

linux模拟HID USB设备及wireshark USB抓包配置

文章目录 1. 内核配置2. 设备配置附 wireshark USB抓包配置 linux下模拟USB HID设备的简单记录&#xff0c;其他USB设备类似。 1. 内核配置 内核启用USB Gadget&#xff0c;使用fs配置usb device信息。 Device Drivers ---> [*] USB support ---><*> USB …

【C++】vector的使用

1. vector的构造 (constrator)构造函数声明 接口说明 vector(); (重点) 无参构造 vector (const vector& x); &#xff08;重点&#xff09; 拷贝构造 vector (InputIterator first, InputIterator last); 使用迭代器区间进行初始化构造 vector (size_type n, co…

Easy Excel 通过【自定义批注拦截器】实现导出的【批注】功能

目录 Easy Excel 通过 【自定义批注拦截器】实现导出的【批注】功能需求原型&#xff1a;相关数据&#xff1a;要导出的对象字段postman 格式导出对象VO 自定义批注拦截器业务代码&#xff1a; 拦截器代码解释&#xff1a;详细解释&#xff1a;格式优化&#xff1a; Easy Excel…

Qt/C++基于重力模拟的像素点水平堆叠效果

本文将深入解析一个基于 Qt/C 的像素点模拟程序。程序通过 重力作用&#xff0c;将随机分布的像素点下落并水平堆叠&#xff0c;同时支持窗口动态拉伸后重新计算像素点分布。 程序功能概述 随机生成像素点&#xff1a;程序在初始化时随机生成一定数量的像素点&#xff0c;每个…

矩阵重构——sortrows函数

s o r t r o w s sortrows sortrows函数依据某列的属性对其元素所在的行进行排序从而进行矩阵的排序 s o r t r o w s sortrows sortrows函数常用方法&#xff1a; 1. 1. 1. s o r t r o w s ( a , [ c 1 , c 2 ] ) sortrows(a,[c_1,c_2]) sortrows(a,[c1​,c2​])&#xff0c…

Linux之网络基础

网络发展 网络的发展可以从人与人之间的工作模式开始谈起, 人与人的工作模式反应了机器与机器的工作模式: 1. 独立模式: 在网络发展的早期计算机间处于独立模式, 计算机之间相互独立 最开始计算机之间是独立运行的, 数据之间的交互需要人用软盘等存储介质拷贝过去, 一般涉及…

【pyspark学习从入门到精通22】机器学习库_5

训练-验证分割 TrainValidationSplit 模型为了选择最佳模型&#xff0c;会对输入数据集&#xff08;训练数据集&#xff09;进行随机分割&#xff0c;分成两个子集&#xff1a;较小的训练子集和验证子集。分割只执行一次。 在这个例子中&#xff0c;我们还将使用 ChiSqSelect…

【Petri网导论学习笔记】Petri网导论入门学习(十一) —— 3.3 变迁发生序列与Petri网语言

目录 3.3 变迁发生序列与Petri网语言定义 3.4定义 3.5定义 3.6定理 3.5例 3.9定义 3.7例 3.10定理 3.6定理 3.7 有界Petri网泵引理推论 3.5定义 3.9定理 3.8定义 3.10定义 3.11定义 3.12定理 3.93.3 变迁发生序列与Petri网语言 对于 Petri 网进行分析的另一种方法是考察网系统…

IDEA:配置Serializable class without ‘serialVersionUID’ 找不到

在使用Java原生序列化的时候&#xff0c;serialVersionUID起到了一个类似版本号的作用&#xff0c;在反序列化的时候判断serialVersionUID如果不相同&#xff0c;会抛出InvalidClassException。 File -> Settings -> Editor -> Inspections -> 搜索 Serialization …

win10 禁止更新

一、winR 输入 regedit 二、输入注册列表路径&#xff1a; &#xff08;1&#xff09;计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings &#xff08;2&#xff09;按照格式&#xff0c;创建文件命名: FlightSettingsMaxPauseDays &#xff08;3&…

OpenAI Whisper 语音识别 模型部署及接口封装

环境配置: 一、安装依赖&#xff1a; pip install -U openai-whisper 或者&#xff0c;以下命令会从这个存储库拉取并安装最新的提交&#xff0c;以及其Python依赖项&#xff1a; pip install githttps://github.com/openai/whisper.git 二、安装ffmpeg&#xff1a; cd …

springboot视频网站系统的设计与实现(代码+数据库+LW)

摘 要 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在视频信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的视频网站系统管理员功…

安装QT6.8(MSVC MinGW)+QT webengine+QT5.15.2

本篇主要针对只使用过QT5的qmake&#xff0c;没有用过MSVC&#xff0c;VS的老同学。 建议一部分一部分安装&#xff0c;全部勾选安装遇到问题会中断&#xff0c;前功尽弃。 我自己需要的是QT5&#xff0c;编出的软件用在公司设备上。 QT6&#xff1a;建议也安装学习&#xf…

自动驾驶目标检测融合全貌

1、early fusion 早期融合&#xff0c;特点用到几何空间转换3d到2d或者2d到3d的转换&#xff0c;用像素找点云或者用点云找像素。 2、deep fusion 深度融合&#xff0c;也是特征级别融合&#xff0c;也叫多模态融合&#xff0c;如bevfusion范式 3、late fusion 晚融合&#x…

Microsoft Excel如何插入多行

1.打开要编辑的excel表&#xff0c;在指定位置&#xff0c;鼠标右键点击“插入”一行 2.按住shift键&#xff0c;鼠标的光标箭头会变化成如下图所示 3.一直按住shift键和鼠标左键&#xff0c;往下拖动&#xff0c;直至到插入足够的行

node.js基础学习-http模块-创建HTTP服务器、客户端(一)

http模块式Node.js内置的模块&#xff0c;用于创建和管理HTTP服务器。Node.js使用JavaScript实现&#xff0c;因此性能更好。 使用http模块创建服务器&#xff0c;我们建议使用commonjs模块规范&#xff0c;因为很多第三方的组件都使用了这种规范。当然es6写法也支持。 下面就是…

2024御网杯信息安全大赛个人赛wp(misc方向)

目录 一.信息安全大赛的通知二、编码转换1. 第一部分2. 第二部分3. 第三部分 三、1.txt四、buletooth 题目附件以及工具链接&#xff1a; 通过网盘分享的文件&#xff1a;御网杯附件 链接: https://pan.baidu.com/s/1LNA6Xz6eZodSV0Io9jGSZg 提取码: jay1 –来自百度网盘超级会…

浅谈pdfbox2.0和pdfbox3.0的运用与区别

前言 Apache PDFBox 是一个开源的Java库&#xff0c;可以用来对PDF文档做一些基本操作&#xff0c;比如实际应用中的pdf读取、写入、合并、拆分、写文字、写图片、加水印等&#xff0c;甚至还应用到了电子签章。本文逐个介绍对pdf的操作&#xff0c;以备作为后续参考使用。 一…