如何保证ES和数据库的数据一致性?

在业务中,我们通常需要把数据库中的数据变更同步到ES中,那么如何保证数据库和ES的一致性呢?通常有以下几种做法:

双写

在代码中,对数据库和ES进行双写,并且先操作本地数据库,后操作ES,而且还需要把两个操作放到一个事务中:

 在以上逻辑中,如果写数据库成功,写ES失败,那么事务会回滚。

如果写数据库成功,写ES超时,实际上ES操作成功,这时候数据库会回滚,导致数据不一致。这时候需要重试保证最终一致性。

这个方案的好处就是简单,容易实现。并且实时性比较高。

缺点首先是需要改代码,有入侵性,还有就是存在不一致的情况。并且在本地事务中发生了外调ES,大大拖长了事务,白白占用数据库连接,影响整体的吞吐量。

MQ异步消费

在应用中,如果我要更新数据库了,那么久抛出一个消息出去,然后数据库和ES各自有一个监听者,监听消息之后自去做数据变更,如果失败了就基于消息的重试在重新执行。

或者像之前那个方案一样,先操作数据库,然后异步通知ES去更新,这时候就可以借助本地消息表的方式来保证最终一致性了。

这个方案的好处是用了MQ,起到了解耦的的作用,而且还做到了异步,提升了整体性能。

缺点就是MQ可能存在延迟,并且需要引入新的中间件,复杂度有所提升。

扫表定时同步

如果是ES中的数据变更的实时性要求不高,可以考虑定时任务扫表,然后批量更新ES

这个方案优点没有侵入性,数据库的写操作处不需要改代码。

缺点是实时性很差,并且轮询可能存在性能问题,效率问题以及给数据库带来压力。

监听binlog同步

还有一种方案,就是可以利用数据库变更时产生的binlog来更新ES。通过监听binlog来更新ES中的数据,也有成熟的框架可以做这样的事情。

好处就是对业务代码完全没有侵入性,业务也非常解耦,不需要关系这个ES的更新操作。

缺点就是需要基于binlog监听,需要引入第三方框架。存在一定的延迟。

总结一下,目前业内比较流行的方案是基于binlog监听的这种,首先一般业务量小的业务也不太需要用ES,所以用了ES的团队,一般并不太会关系引入新框架的复杂度问题,而且ES这种搜索,一般来说,毫秒级的延迟都可以接受的,所以,综合来讲,基于canal做数据同步的方案,比较合适的

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

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

相关文章

Ubuntu20.04安装并配置vscode

Ubuntu20.04安装并配置vscode vscode安装miniconda安装创建虚拟python3.8环境pytorch和匹配的cuda安装 vscode安装 VSCode可以通过 Snapcraft 商店或者微软源仓库中的一个 deb 软件包来安装。 我们这里选用安装VSCode snap版,打开你的终端(CtrlAltT)并且运行下面的…

Apache Paimon 使用之 Creating Table

1.创建 Catalog 管理的 Tables 在Paimon Catalog中创建的Tables由Catalog管理,当Tables从Catalog中删除时,其table files也将被删除。 当使用Paimon Catalog,创建一个名为MyTable的managed table,在Catalog的default数据库中有五…

px2rem实现vue项目响应式布局

第一步 首先需要在项目中安装px2rem插件 npm install postcss-px2rem px2rem-loader --save 第二步 在项目src目录下新建util文件夹,在util文件夹下新建rem.js文件,内容如下: // rem等比适配配置文件 // 基准大小 const baseSize 14 //…

【机器学习300问】27、什么是决策树?

〇、两个预测任务 (1)任务一:银行预测偿还能力 当前,某银行正致力于发掘潜在的放贷用户。他们掌握了每位用户的三个关键特征:房产状况、婚姻状况以及年收入。此外,银行还拥有过往这些用户的债务偿还能力的…

刚工作菜鸟的小总结2

刚工作菜鸟的小总结2 1. using 关键字 using关键字可以用来定义一个类型的别名。例如 using SI_Error = int ,它的作用是将 SI_Error 这个名称与 int 类型进行关联,也就是说在后续代码中,可以使用 SI_Error 来代替 int 类型。如果程序中出现了 SI_Error ,我们就能清晰知道…

c/c++ 指针

参考链接:https://blog.csdn.net/soonfly/article/details/51131141 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 一、指针定义 复杂指针定义涉及较多运算符,分析指针功能从变量名处起,根据运算符优先级结合,一步一步分析。首…

Linux系统——LVS-DR群集部署及拓展

目录 引言 1.LVS的工作模式及其工作过程 2.列举出LVS调度算法 3.LVS调度常见算法(均衡策略) 3.1固定调度算法:rr,wrr,dh,sh 3.2动态调度算法:wlc,lc,lblc 4.LVS三种工作模式区别 一、I…

前端每日一练:vue3 为什么要用 proxy 替换 Object.defineproperty ?为什么只对对象劫持,而要对数组进行方法重写?

vue3 为什么要用 proxy 替换 Object.defineproperty ? Vue 3 在设计上选择使用 Proxy 替代 Object.defineProperty 主要是为了提供更好的响应性和性能。​Object.defineProperty 是在 ES5 中引入的属性定义方法,用于对对象的属性进行劫持和拦截。Vue 2.…

更快更强,Claude 3全面超越GPT4,能归纳15万单词

ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了? 3月4日周一,人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人,其中包括Opus、Sonnet和Haiku三种模型,该公司声称,这是迄今为止它们开发的最快速、最强…

.NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例

在本文中,我们将详细介绍.NET Core日志内容,包括不同日志级别的区别,以及一些常用的日志记录实用工具和第三方库。同时,我们还将通过示例来展示如何使用这些工具和库。 一、.NET Core日志级别 .NET Core日志系统提供了五种日志级…

Linux系统——SElinux

目录 前言 一、SELinux 的作用及权限管理机制 1.SELinux 的作用 1.1DAC 1.2MAC 1.3DAC 和 MAC 的对比 2.SELinux 基本概念 2.1主体(Subject) 2.2对象(Object) 2.3政策和规则(Policy & Rule)…

Nginx+Tomcat实现负载均衡动静分离

目录 一、背景与环境 1. 背景 2. 环境图示 3. 目标 二、操作过程 1. 第一层 2. 第二层 一、背景与环境 1. 背景 在一个Web应用程序中,通常会将动态内容(由Tomcat处理)与静态内容(如图片、CSS、JavaScript文件等&#xff…

什么是5G边缘计算网关?

随着5G技术的飞速发展和普及,边缘计算作为5G时代的关键技术之一,正日益受到业界的关注。而5G边缘计算网关,作为连接5G网络和边缘计算节点的桥梁,扮演着至关重要的角色。HiWoo Box,作为一款卓越的5G边缘计算网关&#x…

springcloud:3.5测试慢调用熔断降级

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用:http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…

Unity3D Netty网络框架的使用详解与原理详解

前言 Unity3D是一款强大的跨平台游戏开发引擎,而Netty是一个高性能、异步事件驱动的网络应用框架。结合使用Unity3D和Netty可以实现网络游戏的开发,实现客户端和服务器端之间的通信。本文将详细介绍Unity3D和Netty的使用方法和原理,以及如何…

学习大数据,所必需的java基础(8)

文章目录 字符缓冲流字符缓冲输出流 _Buffered和Writer字符缓冲输入流字符缓冲流练习 转换流字符编码字符集转换流转换流_OutputStreamWriter序列流和反序列流的介绍序列化流_ObjectOutputStream反序列化_ObjectInputStream不想被序列化操作反序列化时出现的问题以及分析和解决…

解决:hive数据库初始失败

1、背景 采用Mysql数据库保存hive元数据时,我们一般是这样操作: 启动mysql服务;用mysql新建一个库(比如库名为"hive“,这个“hive”与hive-site.xml中的local:3306/hive的“hive”对应,是用来保存hiv…

滴滴基于 Clickhouse 构建新一代日志存储系统

ClickHouse 是2016年开源的用于实时数据分析的一款高性能列式分布式数据库,支持向量化计算引擎、多核并行计算、高压缩比等功能,在分析型数据库中单表查询速度是最快的。2020年开始在滴滴内部大规模地推广和应用,服务网约车和日志检索等核心平…

SkyWalking 本地启动以及闪退问题

1. 下载包 Downloads | Apache SkyWalking SkyWalking APM包含OAP和UI Java Agent 就是Java 的探针 2. 运行 UI 默认端口是 8080, OAP 默认端口是 11800(grpc)12800(http) 如果占用可以修改配置文件 UI 项目的配…

MySQL和Redis Common Command

Ubuntu 配置 MySQL 下载对应版本的deb包并解压,用不到test可删除,wegt或者直接去镜像网站下载均可 tar xvf mysql-server_5.7.37-1ubuntu18.04_amd64.deb-bundle.tar -C /mnt/d/opt/mysql-debrm -f mysql-community-test_5.7.37-1ubuntu18.04_amd64.deb…