Redis 的脑裂现象和解决方案

article/2025/9/21 2:51:14

Redis 中的脑裂是什么?

从名字分析,脑裂现象就是大脑裂开了,一个人如果有两个大脑,就出现了两个决策者,此时身体就不知道该听谁的了,势必会造成混乱。

对应到 Redis 上,就是指在主从集群中,同时有两个主节点,它们都能接收写请求,那么什么时候会出现这种情况呢?

就是如果当前主库突然出现暂时性 “失联”,而并不是真的发生了故障,此时监听的哨兵会自动启动主从切换机制。当这个原始的主库从假故障中恢复后,又开始处理请求,但是哨兵已经选出了新的主库,这样一来,旧的主库和新主库就会同时存在,这就是脑裂现象

脑裂有什么影响?

脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。严重的话,脑裂会进一步导致数据丢失。也就是说,等到哨兵让原主库和新主库做全量同步后,原主库在切换期间保存的数据就丢失了。

详细点来说,当主从切换后,从库升级为新主库,原主库和新主库会重新进行数据的全量同步,在这个过程中会发生数据的丢失,过程如下所示:
在这里插入图片描述

  • 从服务器 Slave 向主服务器 Master 发送数据同步命令;
  • Master 主服务器接收到同步命令后,保存快照生成 RDB 文件,同时使用缓冲区记录从现在开始执行的所有写命令;
  • Master 主服务器将快照文件(RDB文件)发送给 Slave 从服务器,Slave 从服务器接收到后,清空旧数据,载入新数据
  • Master 主服务器快照发送完后开始向 Slave 从服务器发送缓冲区的写命令,Slave 从服务器接收命令并执行,完成复制初始化;
  • 此后 Master 主服务器每次执行一个写命令都会同步发送给 Slave 从服务器,保持相互之间数据的一致性;

上述步骤中的关键一步就是,原主库需要清空本地的数据后加载新主库发送的 RDB 文件,这样一来,原主库在主从切换期间保存的新写数据就丢失了。

数据丢失一定是发生了脑裂吗?

那可能你想问了,数据丢失一定是发生了脑裂吗?如何判断发生了脑裂?

数据丢失不一定是发生了脑裂,最常见的原因是主库的数据还没有同步到从库,结果主库发生了故障,等从库升级为主库后,未同步的数据就丢失了。

如果是这种情况的数据丢失,我们可以通过比对主从库上的复制进度差值来进行判断,也就是计算 master_repl_offset 和 slave_repl_offset 的差值。如果从库上的 slave_repl_offset 小于原主库的 master_repl_offset,那么,我们就可以认定数据丢失是由数据同步未完成导致的。

而判断是否发生了脑裂,可以采取排查客户端的操作日志的方式。

通过看日志能够发现,在主从切换后的一段时间内,会有客户端仍然在和原主库通信,并没有和升级的新主库进行交互,这就相当于主从集群中同时有了两个主库。根据这个迹象,我们就可以判断可能是发生了脑裂。

如何解决脑裂问题?

Redis 中有两个关键的配置项可以解决这个问题,分别是 min-slaves-to-write(最小从服务器数)min-slaves-max-lag(从连接的最大延迟时间)

min-slaves-to-write 是指主库最少得有 N 个健康的从库存活才能执行写命令。

这个配置虽然不能保证 N 个从库都一定能接收到主库的写操作,但是能避免当没有足够健康的从库时,主库无法正常写入,以此来避免数据的丢失 ,如果设置为 0 则表示关闭该功能。

min-slaves-max-lag :是指从库和主库进行数据复制时的 ACK 消息延迟的最大时间;

可以确保从库在指定的时间内,如果 ACK 时间没在规定时间内,则拒绝写入。

这两个配置项组合后的要求是,主库连接的从库中至少有 N 个从库,和主库进行数据复制时的 ACK 消息延迟不能超过 T 秒,否则,主库就不会再接收客户端的请求了。

这样一来,即使原主库是假故障,它在假故障期间也无法响应哨兵发出的心跳测试,也不能和从库进行同步,自然也就无法和从库进行 ACK 确认了。

此时的 min-slaves-to-write 和 min-slaves-max-lag 的组合要求就无法得到满足,原主库就会被限制接收客户端请求,客户端也就不能在原主库中写入新数据,就可以避免脑裂现象的发生了。

本篇博客参考了如下内容,非常感谢:
https://www.jianshu.com/p/e12608ee15a5
https://zhuanlan.zhihu.com/p/308534431
https://time.geekbang.org/column/article/303568


http://chatgpt.dhexx.cn/article/TZyD51Pt.shtml

相关文章

Redis脑裂现象及解决方案

Redis脑裂现象及解决方案 什么是Redis的脑裂现象 当Redis主从集群环境出现两个主节点为客户端提供服务,这时客户端请求命令可能会发生数据丢失的情况。 脑裂出现的场景 场景一 主从哨兵集群中如果当发生主从集群切换时,那么一定是超过预设quorum数量…

分布式系统的“脑裂”到底是个什么玩意?

目前大多数项目都在往分布式上发展,一旦系统采用分布式系统,便会引入更多复杂场景和解决方案。比如,当你在系统中使用了Elasticsearch、ZooKeeper集群时,你是否了解过集群的“脑裂”现象?又是否知道它们是如何解决脑裂…

JDBC编程--jdbc基本操作步骤

JDBC即java数据库互连,是java语言和数据库之间独立于数据库的连接标准API,JDBC从根本上来说是一种规范,具体的实现需要依赖于具体数据库生产商提供jar包【驱动】,提供了统一的接口用于访问不同的底层数据库,允许使用ja…

【Java】JDBC连接数据库详细步骤(面试必备)

系列文章目录 本文旨在详细讲解使用JDBC连接数据库的六个步骤 其中第一步注册驱动的讲解链接:JDBC—MySQL以类加载的方式注册驱动(反射)_m0_56164356的博客-CSDN博客 // 1、注册驱动// 2、获取连接// 3、获取数据库操作对象// 4、执行sql语句…

JDBC基本步骤

JDBC编程 JDBC即java数据库互连,是java语言和数据库之间独立于数据库的连接标准API,JDBC从根本上来说是 一种规范,具体的实现需要依赖于具体数据库生产商提供jar包【驱动】,提供了统一的接口用于访问不 同的底层数据库&#xff0…

Java使用JDBC步骤

学习目标: Java使用JDBC步骤 学习内容: 1.为项目导入mysql-jdbc的jar包 2.初始化驱动 3.建立与数据库的连接 4.创建Statement 5.执行SQL语句 6.关闭连接 7.使用try-with-resourced的方式自动关闭连接 知识详解: JAVA使用JDBC步骤&#xff…

JDBC之程序编写步骤

当当当当~~~~欢迎大家阅读,今天我们学习JDBC程序编写步骤 以上是JDBC程序编写步骤的流程图 步骤一:导入java.sql包 步骤二:加载并注册驱动程序 java.sql.Driver 接口:是所有 JDBC 驱动程序需要实现的接口,这个接口是…

JDBC具体的操作步骤

目录 1.加载驱动 Driver 2.获得连接 3.执行指令 4.关闭资源 一: 首先先建立一个包为:com.zking.util 包中建立一个类:DBHelper类//帮助类 使用静态代码块加载驱动 2. 定义连接语句 3. 获得连接方法 : 4. 关闭资源:连接c…

浅谈JDBC,JDBC实现的几大步骤

前言 当我们学完数据库之后总觉得数据库和java之间是没有联系的,但是我们还是要去学数据库是为了什么呐?现在就来了,现在我就来给大家讲讲怎么将数据库和java进行联系,我们也可以用数据库代替以前的IO流来存东西了。 JDBC 概述 …

【JDBC-1】jdbc编程六大步骤

文章目录 jdbc编程步骤1.注册驱动2.获取数据库的连接3.获取数据库操作对象4.执行sql语句5.处理查询结果集6.释放资源 jdbc编程步骤 jdbc编程6步:1.注册驱动2.获取连接3.获取数据库操作对象4.执行sql5.处理查询结果集6.释放资源1.注册驱动 注册驱动的作用&#xff…

如何使用jetty

一直都听说jetty跟Tomcat一样,是一个web容器。之前做项目的时候,也使用过jetty,不过当时jetty是作为一个插件,跟maven集成使用的。那个时候,由于是第一次使用jetty,感觉jetty跟Tomcat并不一样,启…

BAT优秀工具

1、腾讯智图:图片压缩优化平台 地址:智图_图片压缩在线工具_在线制作webp 智图可以帮你把图片压缩到很小,但是还是很清晰!有很多网站限制图片上传的大小,用这个就可以!在线的,很方便&#xff01…

GifCam2.0使用

GifCam2.0使用 有时候我们需要制作一个gif,那么我们可以用GifCam 。 GifCam 是一款能够轻松录制gif的软件,它体积小、免安装。它可以给现有的gif增加帧数。编辑gif图片,如添加文字、删除某些帧、修改特定帧的延迟等。 下载地址:h…

荒野大镖客2-解压即玩

游戏名称:荒野大镖客2发行时间:2019年12月6日游戏详细介绍:https://store.steampowered.com/app/1174180/Red_Dead_Redemption_2/ (STEAM网站)不了解这是什么游戏的可以看一下版本介绍:该版本由EMPRESS小组…

火炬2 贴吧导航(大纲1.0)

火炬2 贴吧导航(大纲1.0) time/2020.7.25 前言 因前导航贴中部分链接失效或失时,为方便吧友查阅攻略及数据,故作此帖。 注:此贴仅作导航,不回复不解疑,有个人疑惑请按正常流程询问其他吧友。 …

MYSQL 5.7 分组 1055解决方法

1.免安装版 在根目录下创建 my.ini 将一下内容拷贝到my.ini,然后重启服务即可 [mysqld] sql_mode‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’ 相信有些小伙伴在使用数据库的过程中会经常频繁的启动…

iSystem调试器系列文章—1.连接测试

iSystem调试器系列文章——1.连接测试 做嵌入式开发测试的人一般情况下都听过Lauterbach、iSystem、PLS这三个大名鼎鼎的调试器品牌。可惜的是博主在之前的工作中从未接触过这些大神级的调试器,只闻其声不见其人。今天有幸从厂家获取到了iSystem的IC5700调试器&…

小工具推荐

我们在使用计算机的过程中,总会有各种各样的需求,也许是为了颜值,也许是为了工作效率,有或是为了方便。这些需求系统本身没有提供相应的功能,或者系统提供的功能并不是那么好用。我们就渴望找一个好的工具代替。 本更新…

前端音视频之WebRTC初探

WebRTC Web Real-Time Communication 网页即时通信 WebRTC 于 2011 年 6 月 1 日开源,并在 Google、Mozilla、Opera 等大佬们的支持下被纳入 W3C 推荐标准,它给浏览器和移动应用提供了即时通信的能力。 WebRTC 优势及应用场景 优势 跨平台(Web、Window…

(常规更新)1.C++入门第一讲——编程如此简单

格言:自立才能自主,靠人更须靠己。有志之人立长志,无志之人常立志。千里之行,始于足下;艰难困苦,玉汝于成。少壮不努力,老大徒伤悲。✊✊✊ 📫 如果您觉得文章里有错误的地方&#x…