【Redis 】Redis 的脑裂现象和解决方案

news2024/11/17 17:45:58

文章目录

  • Redis 中的脑裂是什么?
  • 脑裂有什么影响?
  • 数据丢失一定是发生了脑裂吗?
  • 如何解决脑裂问题?

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://www.coloradmin.cn/o/727292.html

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

相关文章

Golang每日一练(leetDay0116) 路径交叉、回文对

目录 335. 路径交叉 Self-crossing 🌟🌟🌟 336. 回文对 Palindrome Pairs 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/…

【PCIE】链路训练的TS训练序列解释

TS码流解释 TS1和TS2有序集合是PCIe(Peripheral Component Interconnect Express)协议中使用的一种特殊数据包格式。这些有序集合用于在PCIe链路的训练阶段进行通信和控制。 TS1(Training Sequence 1)有序集合:TS1有…

Django实现简单的音乐播放器 2

在《Django实现简单的音乐播放器 1》前期准备的基础上开始开发。 效果: 目录 项目视图 创建视图方法 路由加载视图 加载模板 创建首页html文件 加载静态资源文件 加载静态文件 使用方法 启动服务器 加载数据表 创建表模型 生成表迁移 执行创建表 插入…

CRM中的多业务场景管理是什么?有哪些功能?

为了适应不同的客户需求和市场变化,很多企业开展了多个业务场景(产品线、销售渠道等)。这些多业务场景给企业的客户管理带来了很大的挑战,如何有效地管理多种业务是企业急需解决的问题。下面说说,多业务场景下的CRM管理…

在Window仿Linux终端命令学习Python

在Window仿Linux终端命令学习Python Echox 命令 -- 主要带颜色输出ls 命令findx 命令~~待续~~ python3 Echox 命令 – 主要带颜色输出 查看 python输出颜色(终端控制台) ls 命令 1、getopt 模块参数解析 : Python 命令行参数 2、os.getcwd…

怎么免费视频压缩器?这 9 个最佳免费视频压缩器教你轻松学会!

视频有多种格式、不同的大小和不同的压缩级别。但是,您可以使用最好的视频压缩器来: 减小文件大小提高压缩质量更好地服务您的观众 我们将列出九个领先的视频压缩软件精选,您今天可以免费使用它们来增强您的视频。 9 个顶级免费视频压缩软件…

7 字符和字符串的“+”操作

7.1 字符的“”操作 char类型的数据参与加法运算。如下: char a A; int b 10 ; int c a b ; System.out.println(c); 结果如下: 接收结果使用的是int数据类型,按照相加时哪个数据类型大,结果就是哪个数据类型的规则&#xff…

CMake 使用教程 (四)

1.0 日志 在 CMake 中可以用用户显示一条消息,该命令的名字为 message: message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)(无) :重要消息STATUS :非重要消息WARNING&#…

51从零开始学Java之详解Java中的包装类

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家介绍了Java中的Object类,它属于我们开发时的常用类…

2023(WAIC)智能驾驶科技峰会丨拓数派大模型下的数据计算系统,助力汽车智能化产业数据增值

2023 智能驾驶科技峰会在上海圆满落幕,本次大会由世界人工智能大会(WAIC)组委会办公室指导,浦东新区人民政府支持,浦东新区科技和经济委员会、中国 (上海)自由贸易试验区管理委员会金桥管理局主…

【SAP-ABAP】RPR_ABAP_SOURCE_SCAN 搜索带特定字符串的程序

昨日问了懒神,才知道还有这功能,真好用 业务背景:需要查找系统中有哪些程序带了特定的字符串(一般类似于某些条件写死了) 程序:RPR_ABAP_SOURCE_SCAN 程序:RS_ABAP_SOURCE_SCAN SE38执行程序…

Blazor前后端框架Known功能介绍:系统安装激活及自定义

本章介绍系统安装与激活及其自定义功能。 概述 框架内置简单的系统安装功能。录入企业编码、名称、系统名称、产品密钥、管理员密码信息完成安装。可自定义高级安装功能,如安装数据库等您产品所需的安装信息。框架默认无需注册产品密钥,若产品需要安装…

【腾讯云IM】即时通讯的登录,登出,用户列表,私聊,图片发送

uniapp即时通讯 1,初始化(刚开始就紧跟着文档走)2,App.vue中项目引入腾讯云,(附上账号在其他地方登陆的监听)3,登录前必需3.1,获取登录id3.2,生成userSig&…

K8s 内存泄漏处理方法

问题描述: 1. 安装go环境 2. 下载地址: https://golang.google.cn/dl/[rootk8s-master home]# rm -rf /usr/local/go && tar -C /usr/local/ -zxvf go1.17.3.linux-amd64.tar.gz3. 永久配置go 环境[rootk8s-master home]# vim /etc/profile export GOPATH…

win10、mac如何使用desktop中的docker

1、安装相应系统的docker,安装完什么都不需要修改。 2、需要安装mysql的话首先使用命令行 3、需要把mysql等其他软件端口映射出来使用的命令 4、搞定;点击关闭和启动 可以安装很多软件哦,非常方便两条命令搞定,mysql、redis、mogo…

建筑物防雷工程的设计与施工

本文会介绍建筑物防雷工程的设计与施工的基本原理、方法和要求,以及一些典型的案例分析。建筑物防雷工程是为了保护建筑物及其内部设备、人员和财产免受雷电危害而采取的一系列技术措施。建筑物防雷工程应遵循《建筑物防雷设计规范》GB 50057-2010和《建筑物防雷工程…

ros2 机器人imu传感器 加速度计 陀螺仪精度和数据填充单位换算

起因,imu解算出了加速度 角速度,但原始数据是没有单位的,只是在一个精度范围的值,要使用这些数据,就需要把这些没有单位的数据换算成带单位的数据,下面解说一下换算原理。 imu读取数据代码参考上期的博客&…

什么是操作系统中的kernel

什么是操作系统中的kernel 一,图解,kernel在操作系统中的结构位置 二,文字描述解释 系统启动后,Kernel会常驻内存,负责系统的基础功能, 如进程调度,硬件管理.普通程序就是用户态程序, 在Kernel中的程序叫做内核态程序. 普通程序如果想申请…

经典图像识别卷积神经网络总结记录

这篇博文主要是延续前文系列的总结记录,这里主要是总结汇总日常主流的图像识别模型相关知识内容。 下面对上述列出的卷积神经网络模型进行逐个详细介绍、算法原理分析以及优缺点总结: (1)LeNet-5 算法原理: LeNet-5是最早应用于手写数字识别…