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

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

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

相关文章

ReactPress(阮一峰推荐工具):一款基于Next.js的免费开源博客CMS系统

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的,包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的,项目已经开源,项目地址在 …

【论文阅读】点云预测-机器人操作

文章目录 1. 【CoRL 2024】IMAGINATION POLICY: Using Generative Point Cloud Models for Learning Manipulation Policies针对痛点和贡献摘要和结论引言方法实验思考不足之处 2. 【CVPR2023】Point Cloud Forecasting as a Proxy for 4D Occupancy Forecasting针对痛点和贡献…

clickhouse 分片键的重要性

文章目录 背景反思为啥出现问题为啥默认的语义是local 背景 问题背景 详细内容可以看这个 反思为啥出现问题 为啥会出现链接里出现的问题,对于goal join 和 join 语义不一样的问题,那是因为分片键设计不合理的情况 如果表a和表b 都是user_id 作分片键…

如何安全高效地打开和管理动态链接库(DLL)?系统提示dll丢失问题的多种有效修复指南

动态链接库(DLL)文件是Windows操作系统中非常重要的一部分,它们包含了程序运行所需的代码和数据。当系统提示DLL文件丢失时,可能会导致应用程序无法正常运行。以下是一些安全高效地打开和管理DLL文件以及修复DLL丢失问题的方法&am…

学习日记_20241126_聚类方法(自组织映射Self-Organizing Maps, SOM)

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…

关于 vue+element 日期时间选择器 限制只能选当天以及30天之前的日期

业务需求&#xff0c;需要实现选择当天以及30天之前的日期&#xff0c;于是我想到的是利用picker-options去限制可选范围 代码如下 <el-date-pickerv-model"searchData.acceptTime"type"datetimerange"value-format"yyyy-MM-dd hh:mm:ss"styl…

【C语言】int *p[ ] 与 int (*p)[ ] 的区分辨析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;基本概念&#xff1a;数组与指针&#x1f4af;理解 int *p[10] 与 int (*p)[10]1. int *p[10]&#xff1a;存放指针的数组2. int (*p)[10]&#xff1a;指向数组的指针 …

网安瞭望台第4期:nuclei最新poc分享

国内外要闻 多款 D-Link 停产路由器漏洞&#xff1a;攻击者可远程执行代码 近日&#xff0c;知名网络硬件制造商 D-Link 发布重要安全公告。由于存在严重的远程代码执行&#xff08;RCE&#xff09;漏洞&#xff0c;其敦促用户淘汰并更换多款已停产的 VPN 路由器型号。 此次…

【前端】JavaScript中的隐式声明及其不良影响分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是隐式声明&#xff1f;&#x1f4af;隐式声明的常见情景1. 赋值给未声明的变量2. 非严格模式下的隐式声明3. 函数中的变量漏掉声明4. for 循环中的隐式声明5. 使用…

【VRChat 改模】开发环境搭建:VCC、VRChat SDK、Unity 等环境配置

一、配置 Unity 相关 1.下载 UnityHub 下载地址&#xff1a;https://unity.com/download 安装打开后如图所示&#xff1a; 2.下载 VRChat 官方推荐版本的 Unity 跳转界面&#xff08;VRChat 官方推荐页面&#xff09;&#xff1a;https://creators.vrchat.com/sdk/upgrade/…

uniapp学习(010-3 实现H5和安卓打包上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第114p-116p的内容 文章目录 H5配置文件设置开始打包上传代码 安卓设置模拟器启动设置基础配置设置图标启动界面…

基于SpringBoot共享汽车管理系统【附源码】

基于SpringBoot共享汽车管理系统 效果如下&#xff1a; 系统注册页面 系统登陆页面 系统管理员主页面 用户信息管理页面 汽车投放管理页面 使用订单页面 汽车归还管理页面 研究背景 随着计算机技术和计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所。二十…

uniapp运行时,同步资源失败,未得到同步资源的授权,请停止运行后重新运行,并注意手机上的授权提示。

遇到自定义基座调试时安装无效或无反应&#xff1f;本文教你用 ADB 工具快速解决&#xff1a;打开 USB 调试&#xff0c;连接设备&#xff0c;找到应用包名&#xff0c;一键卸载问题包&#xff0c;清理干净后重新运行调试基座&#xff0c;轻松搞定&#xff01; 问题场景&#…

反向代理模块开发

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

AI助力PPT创作:从手动到智能,打造高效演示

在今天这个信息化时代&#xff0c;演示文稿已经成为我们表达观点、传递信息的重要工具。不论是企业汇报、学术交流&#xff0c;还是个人创作&#xff0c;PPT&#xff08;PowerPoint&#xff09;都在日常生活中扮演着不可或缺的角色。创建一份高质量的PPT往往需要花费大量时间与…

金融租赁系统助力企业升级与风险管理的新篇章

内容概要 在当今的商业环境中&#xff0c;“金融租赁系统”可谓是企业成功的秘密武器。简单来说&#xff0c;这个系统就像一位聪明的财务顾问&#xff0c;帮助企业在资金和资源的运用上达到最优化。从设备采购到项目融资&#xff0c;它提供了一种灵活的方式&#xff0c;让企业…

九、Ubuntu Linux操作系统

一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统&#xff0c;于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助其官方网站:http…

戴尔电脑安装centos7系统遇到的问题

1&#xff0c;找不到启动盘&#xff08;Operation System Loader signature found in SecureBoot exclusion database(‘dbx’).All bootable devices failed secure Boot Verification&#xff09; 关闭 Secure Boot&#xff08;推荐&#xff09;&#xff1a; 进入 BIOS/UEFI…

spring +fastjson 的 rce

前言 众所周知&#xff0c;spring 下是不可以上传 jsp 的木马来 rce 的&#xff0c;一般都是控制加载 class 或者 jar 包来 rce 的&#xff0c;我们的 fastjson 的高版本正好可以完成这些&#xff0c;这里来简单分析一手 环境搭建 <dependency><groupId>org.spr…

导入100道注会cpa题的方法,导入试题,自己刷题

一、问题描述 复习备考的小伙伴们&#xff0c;往往希望能够利用零碎的时间和手上的试题&#xff0c;来复习和备考 用一个能够导入自己试题的刷题工具&#xff0c;既能加强练习又能利用好零碎时间&#xff0c;是一个不错的解决方案 目前市面上刷题工具存下这些问题 1、要收费…