Redis核心技术与实战【学习笔记】 - 24.Redis 脑裂

news2024/11/18 20:29:06

简述

所谓脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响就是客户端不知道该往哪个主节点写入数据,结果就是不同的客户端会往不同的主机诶点上写入数据。而且,严重的话,脑裂会导致数据丢失。

在使用主从集群时,曾遇到过这样一个问题:主从集群有 1 个主库、5 个从库和 3 个哨兵实例,在使用过程中,发现客户端发送的一些数据丢失了,这直接影响了业务层的数据可靠性。
通过一系列的问题排查,我们才知道,这其实是主从集群中的脑裂问题导致的。


1.为什么会发生脑裂?

第一步:确认是不是数据同步出现了问题

在主从集群中发生数据丢失,最常见的原因是主库的数据还没有同步到从路,结果主库发生了故障,等从库升级为主库后,未同步的数据就丢失了。

如下图所示,新写入的 a:1、b:3 ,就是因为主库故障前未同步到从库而丢失了。
在这里插入图片描述
在这种情况的数据丢失,我们可以通过比对主从库上的复制进度差值来进行判断,也就是计算 master_repl_offset 和 slave_repl_offset 的差值。如果从库上的 slave_repl_offset 小于原主库的 master_repl_offset ,那么,我们就可以认为数据丢失是由于数据同步未完成就宕机导致的。

我们在部署主从集群时,也监测了主库上的 master_repl_offset ,及从库上的 slave_repl_offset 。但是,发现数据丢失后,我们检查了新主库升级前的 slave_repl_offset ,以及原主库的 master_repl_offset,它们是一致的,也就是说,这个升级为新主库的从库,在升级时已经和原主库的数据保持一致了。那么,为什么会出现客户端发送的数据丢失呢?

分析到这里,第一个设想被推翻了。这是,又想到所有的数据操作都是客户端发送的,那么是不是可以从客户端操作日志中发现问题呢?

第二步:排查客户端的操作日志,发现脑裂现象

在排查客户端的操作日志时,发现,在主从库切换的一段时间内,有一个客户端仍然在和原主库通信,并没有和升级的新主库进行交互。这就相当于主从集群中同时有了两个主库。根据这个迹象,我们就想到了在分布式主从集群发生故障时会出现的一个问题:脑裂。

但是,不同客户端给两个逐鹿发送数据写操作,按道理来说,只会导致新数据会分布在不同的主库上,并不会造成数据丢失。那么,为什么数据仍然丢失了呢?

到这里,我们的排查思路有一次终端了。不过,在分析问题时,“从原理出发”是追本溯源的好方法。脑裂是发生在主从切换过程中,所以把研究方向投向了主从切换的执行过程。

第三步:发现是原主库虚假故障导致的脑裂

我们是采用哨兵机制进行主从切换的,当主从切换发生时,一定是有超过预设数量(quorum)的哨兵实例和主库的心跳多超时了,才会把主库判断为客观下乡,然后,哨兵开始执行切换操作。哨兵切换完成后,客户端会和新主库进行通信,发送请求操作。

但是在切换过程中,既然客户端仍然是和原主库通信,这就表明,原主库并没有真的发生故障(例如主库进程挂掉)。猜测主库是由于某些原因无法处理请求,也没有响应哨兵的心跳,才被哨兵错误地判断为客观下线的。结果,在被判断下线后,原主库又重新开始处理请求了,而此时,哨兵还没有完成主从切换,客户端仍然可以和原主库通信,客户端发送的写请求就会在原主库上写入数据了。

为了验证原主库只是假故障,我们也查看了原主库所在服务器的资源使用监控记录。

的确,我们看到原主库所在的一段时间的 CPU 利用率突然特别高,这是我们在机器上部署的一个数据采集程序导致的。因为这个程序基本上把机器的 CPU 都用满了,导致 Redis 主库无法响应心跳了,这个期间,哨兵就把主库判断为客观下乡,开始主从切换了。不过,这个数据采集程序很快恢复正常,CPU 的使用率也降下来了。此时,原主库又开始正常服务请求了。

正是因为原主库并没有真的故障,在客户端操作日志中就看到了和原主库的通信记录。等到从库被升级为新主库后,主从集群里就有了两个主库,到这里,脑裂的原因就摸清楚了。

在这里插入图片描述

2.为什么脑裂会导致数据丢失?

主从库切换后,从库一旦升级为新主库,哨兵就会让原从库执行 slave of 命令,和新主库重新进行全量同步。而在全量同步执行的最后阶段,原主库需要清空本地的数据,加载新主库发送的 RDB 文件,这样一来,原主库在主从切换期间保存的新写数据就丢失了。
在这里插入图片描述
到这里,我们就完全弄明白了这个问题的发生过程和原因。

主从切换的过程中,如果原主库只是假故障,它会触发哨兵启动主从切换,一旦等它从假故障中恢复后,又开始处理请求,这样一来,就会和新主库同时存在,形成脑裂。等到哨兵让原主库和新主库做全量同步后,原主库在切换期间保存的数据就丢失了。

3.如何应对脑裂

刚刚说了,主从集群中的数据丢失事件,归根接地是因为发生了脑裂。所以,必须找到脑裂问题的策略。

既然问题是出现在原主库发生假故障后仍然能接收请求上,我们就开始在主从集群机制的配置项中查找是否有限制主库接收请求的设置。

Redis 提供了两个配置项来限制主库的请求处理,分别是 min-slaves-to-writemax-slaves-max-lag

  • min-slaves-to-write:设置主库能进行数据同步的最少数据量
    * max-slaves-max-lag:设置了主从库间进行数据复制时,从库给主库发送 ACK 消息的最大演出(以秒为单位)

可以把 min-slaves-to-writemax-slaves-max-lag 搭配起来使用,分别给它们设置一定的阈值,假设为 N 和 T。这两个配置项组合后的要求是,主库连接的从库中至少有 N 个从库,和主库进行数据复制时的 ACK 消息延迟不能超过 T 秒,否则,主路就不会在接收客户端的请求了

即使,原主库是假故障,它在假故障期间也无法响应哨兵心跳,也不能和从库进行同步,自然也就无法和从库进行 ACK 确认了。这样一来, min-slaves-to-writemax-slaves-max-lag 的组合要求就无法得到满足,原主库就会被限制接收客户端的请求,客户端也就不能在原主库中写入数据了。

等到新主库上线时,就只有新主库能接收和处理客户端的请求,此时,新写的数据会被直接写到新主库中。而原主库会被哨兵降为从库,即使它的数据被清空了,也不会有新数据丢失。

再来举个例子。
假设我们将 min-slaves-to-write 设置为 1,把 max-slaves-max-lag 设置为 12 s,把哨兵的 down-after-milliseconds 设置为 10s,主库因为某些原因卡主了 15s,导致哨兵判断客观下线,开始进行主从切换。同时,因为原主库卡主了 15s,没有一个从库能和原主库在 12s 内进行数据复制,原主库也无法收到客户端的请求了。这样一来,主从切换完成后,只有新主库可以接受请求,不会发生脑裂。

小结

脑裂是指在主从集群中,同时有2个主库都能接收写请求。在 Redis 切换过程中,如果发生了脑裂,客户端数据就会写入到原主库,原主库被降为从库,这些新写入的数据就丢失了。

脑裂发生的原因主要是原主库发生了假故障,总结下假故障的原因:

  1. 和主库部署在同一台服务器上的其他程序临时占用了大量资源(例如 CPU 资源),导致主库资源使用受限,短时间内无法响应心跳。其他程序不再使用资源时,主库又恢复正常。
  2. 主库自身遇到了阻塞的情况,例如,处理 bigkey 或是发送内存 swap(可以复习下《11.响应延迟的波动问题及解决方案》总结的导致实例阻塞的原因),短时间内无法响应心跳,导致阻塞解除后,又恢复正常的请求处理了。

为了应对脑裂,你可以在主从集群部署时,通过合理地配置参数 min-slaves-to-writemax-slaves-max-lag ,来预防脑裂的发生。

给你的建议是,假设从库有 N 个,可以将 min-slaves-to-write 设置为 K/2 + 1(如果 K 为 1 ,就设为1),将 max-slaves-max-lag 设置为十几秒(例如 10~20 秒),在这个配置下,如果有一半以上的从库和主库进行 ACK 消息延迟超过十几秒,就会进制主库接收客户端写请求。

这样一来,就可以避免脑裂带来的数据丢失问题,而且,也不会因为只有少数几个从库因为网络阻塞连不上主库,就进制主库接收请求了。

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

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

相关文章

尝新果未熟,探新途未尽。寒冬凝锐气,雷鸣蓄神力——小康师兄的2023年度总结

文章目录 一、前言二、工作总结2.1 我期望的,而公司想要的2.2 公司利益VS员工利益2.3 这个问题问得很有问题 三、生活总结3.1 一胎3.2 二胎 四、其他总结4.1 博客4.2 无人自助台球馆4.3 我要出书了 五、OKR 一、前言 又是一年除夕夜,万家灯火同团圆。 老…

15.3 Redis入门(❤❤❤❤)

15.3 Redis入门❤❤❤❤ 1. redis简介与配置1.1 简介1.2 Windows安装1.3 Linux安装1.4 守护进程方式启动1.5 客户端启动与使用1.6 指定生成日志 2. 使用2.1 客户端redis使用命令2.2 redis存储的数据类型1. String字符串类型2. Hash键值类型3. List列表类型4. Set与Zset集合类型…

力扣刷题之旅:进阶篇(四)—— 滑动窗口问题

力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。 --点击进入刷题地址 引言: 在编程的世界里,滑动窗口问题是一种…

python 自我检测题--part 1

1. Which way among them is used to create an event loop ? Window.mainloop() 2. Suppose we have a set a {10,9,8,7}, and we execute a.remove(14) what will happen ? Key error is raised. The remove() method removes the specified element from the set. Th…

Python算法题集_两两交换链表中的节点

Python算法题集_两两交换链表中的节点 题24:两两交换链表中的节点1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【四节点法】2) 改进版一【列表操作】3) 改进版二【三指针法】4) 改进版三【递归大法】 4. 最优算法 本文为Python算法…

幻兽帕鲁服务器怎么更新?进入游戏显示:加入的比赛正在运行不兼容的版本,请尝试升级游戏版本(阿里云)

幻兽帕鲁服务器怎么更新?进入游戏显示:加入的比赛正在运行不兼容的版本,请尝试升级游戏版本。这是因为游戏客户端或者服务器上的游戏服务端,没有更新版本。导致两个版本不一致,所以无法进入游戏。 最近幻兽帕鲁 官方客…

Git 消除对某个文件的追踪

参考: (尚未验证他的该方法) https://www.golinuxcloud.com/git-remove-file-from-tracking/https://www.golinuxcloud.com/git-remove-file-from-tracking/

第9讲 详解第 2 套真题

第9讲 详解第 2 套真题 基本编程题【15 分】简单应用题【25 分】综合应用题【20 分】问题 1【10 分】:问题 2【10 分】:各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! 基本编程题【15 分】 考生文件夹下存在一个文件 PY101.py,请写代码替换横线,不…

蓝桥杯官网练习题(翻转)

问题描述 小蓝用黑白棋的 n 个棋子排成了一行,他在脑海里想象出了一个长度为 n 的 01 串 T,他发现如果把黑棋当做 1,白棋当做 0,这一行棋子也是一个长度为 n 的 01 串 S。 小蓝决定,如果在 S 中发现一个棋子…

AB测试最小样本量

1.AB实验过程 常见的AB实验过程,分流-->实验-->数据分析-->决策:分流:用户被随机均匀的分为不同的组实验:同一组内的用户在实验期间使用相同的策略,不同组的用户使用相同或不同的策略。数据收集:…

【技巧】PCB布局技巧:带条纹的电容

这些都是无极性电容,所以这个条纹不是极性标记。一位读者得回答正确,它代表电容卷绕时,卷绕在外层的那一极。我发现现在很少有工程师知道电容一端的条纹代表什么,也不知道条纹端和不带条纹端互换带来的不同效果。即使你从来不使用…

fast.ai 深度学习笔记(二)

深度学习 2:第 1 部分第 4 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-4-2048a26d58aa 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,这…

Adaptec RAID 控制器arcconf 管理命令的常见的查询操作

ARCCONF命令行工具可以在服务器正常运行过程中对Adaptec RAID卡进行带内在线查询配置操作,无需重启服务器,十分方便快捷,本文讲解常见的查询操作。 一、查询流程 二、常见指令 1、查询已安装的RAID卡清单 [rootlocalhost ~]# ./arcconf-lin…

STM32 FSMC (Flexible static memory controller) 灵活静态内存控制器介绍

文章目录 1. 介绍FSMC2. FSMC特点3. Block示意图4. AHB接口4.1 Supported memories and transactionsGeneral transaction rulesConfiguration registers 5. 外部设备地址映射5.1 NOR/PSRAM地址映射将NOR Flash/PSRAM的支持进行封装 5.2 NAND/PC Card地址映射 1. 介绍FSMC 说到…

阿里云服务器4核8g的购买价格

阿里云服务器4核8g配置多少钱一年?1个月费用多少?云服务器u1实例3折优惠价955.58元一年,计算型c7云服务器4核8G价格2944.79元一年。4核8G服务器按月购买比较贵,经济型e实例4核8G配置1个月216元,通用算力型u1服务器336.…

vs用msys2编译安装 gmp

1 下载 1.1下载MSYS2工具 MSYS2 1.2 下载gmp The GNU MP Bignum Library 2 使用windows的msys2命令窗口,有三个msys2命名窗口 mingw64 3 4 命令 pacman -Syu 重启: pacman -Su 安装: pacman -S mingw-w64-x86_64-gcc pacman -S mingw-w64-x86_64-make…

2024.2.10 DMS(数据库管理系统)初体验

数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管…

问题:超声波纵波斜入射时,当入射角大于第一临界角小于第二临界角时,在第二介质内只有折射横波。 #微信#经验分享#其他

问题:超声波纵波斜入射时,当入射角大于第一临界角小于第二临界角时,在第二介质内只有折射横波。 参考答案如图所示

大学答案在哪搜?分享3个软件和公众号,来对比看看吧! #其他#其他#知识分享

在快节奏的大学生活中,合理利用这些日常学习工具,能够让你事半功倍,提高学习效率。 1.知乎 一个问答网站 虽然不是专门的搜题软件,但是其中有很多高手和专家,可以在问题中提问,获得专业回答。 2.试题猪 …

《CSS 简易速速上手小册》第3章:CSS 响应式设计(2024 最新版)

文章目录 3.1 媒体查询基础:网页的智能眼镜3.1.1 基础知识3.1.2 重点案例:适应三种设备的响应式布局3.1.3 拓展案例 1:改变字体大小3.1.4 拓展案例 2:暗模式适配 3.2 响应式图片和视频:让内容自由呼吸3.2.1 基础知识3.…