什么是Redis集群的脑裂问题?

news2024/12/23 22:13:05

目录

一、脑裂的发生

二、脑裂的危害

三、如何避免脑裂?

四、能彻底解决脑裂吗?


所谓脑裂,就像他的名字一样,大脑裂开了,一般来说就是指一个分布式系统中有两个子集,然后每个子集都有一个自己的大脑(Leader/Master)。那么整个分布式系统中就会存在多个大脑了,而且每个人都认为自己是正常的,从而导致数据不一致或重复写入等问题。

一、脑裂的发生

Redis的脑裂问题可能发生在网络分区或者主节点出现问题的时候:

  • 网络分区:网络故障或分区导致了不同子集之间的通信中断。
    • Master节点,哨兵和Slave节点被分割为了两个网络,Master处在在一个网络中,Slave库和哨兵在另外一一个网络中,此时哨兵发现和Master连不上了,就会发起主从切换,选一个新的Master,这时候会出现两个主节点的情况。
  • 主节点问题:集群中的主节点之间出现问题,导致不同的子集认为它们是正常的主节点。
    • Master节点有问题,哨兵就开始选举新的主节点,但是在这个过程中,原来的那个Master节点又恢复了,这时候就可能会导致一部分Slave节点认为他是Master节点,而另一部分Slave新选出了一个Master。

二、脑裂的危害

脑裂问题可能导致以下问题:

  • 数据不一致:不同子集之间可能对同一数据进行不同的写入,导致数据不一致。
  • 重复写入:在脑裂解决后,不同子集可能尝试将相同的写入操作应用到主节点上,导致数据重复。
  • 数据丢失:新选出来的Master会向所有的实例发送slave of命令,让所有实例重新进行全量同步,而全量同步首先就会将实例上的数据先清空,所以在主从同步期间在原来那个Master上执行的命令将会被清空。

三、如何避免脑裂?

那么如何防止脑裂的发生呢?

Redis已经提供了两个配置项可以帮我们做这个事儿,分别是min-slaves-to-write和min-slaves-max-lag。

min-slaves-to-write:主库能进行数据同步的最少从库数量;

min-slaves-max-lag:主从间进行数据复制时,从库给主库发送ACK消息的最大延迟秒数。

这两个配置项必须同时满足,不然主节点拒绝写入。在期间满足min-slaves-to-write和min-slaves-max-lag的要求,那么主节点就会被禁止写入,脑裂造成的数据丢失情况自然也就解决了。

举个例子:

假设我们将min-slaves-to-write设置为1,把min-slaves-max-lag设置为10s。

如果Master节点因为某些原因挂了12s,导致哨兵判断主库客观下线,开始进行主从切换。

同时,因为原Master宕机了12s,没有一个(min-slaves-to-write)从库能和原主库在10s(min-slaves-max-lag)内进行数据复制,这样一来,就因为不满足配置要求,原Master也就再也无法接收客户端请求了。

这样一来,主从切换完成后,也只有新主库能接收请求,这样就没有脑裂的发生。

四、能彻底解决脑裂吗?

还是刚刚那个场景,假设我们把 min-slaves-to-write 设置为 1,把 min-slaves-max-lag 设置为 10s,并且 down-after-milliseconds 时间为8s,也就是说,如果8秒连不上主节点,哨兵就会进行主从切换。

但是,如果主从切换的过程需要5s时间的话,就会有问题。

Master 节点宕机8s时,哨兵判断主节点客观下线,开始进行主从切换,但是这个过程一共需要5s。那如果主从切换过程中,主节点有恢复运行,即第9秒Master恢复了,而min-slaves-max-lag设置为10s那么主节点还是可写的。

那么就会导致9s~12s这期间如果有客户端写入原Master节点,那么这段时间的数据会等新的Master选出来之后,执行了slaveof之后导致丢失。

Redis脑裂可以采用min-slaves-to-write和min-slaves-max-lag合理配置尽量规避,但无法彻底解决。

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

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

相关文章

【Excal】And函数

奖金评定说明 业绩低于6000,奖金为100 业绩大于等于6000且小于10000,奖金为200 业绩大于等于10000,奖金为500 然后按回车健 下拉填充

BurpSuite2024.7.3专业版

前言 Burp Suite是一个无需安装软件,下载完成后,直接从命令行启用即可。开箱即可使用支持LInux/Windows/Mac 01更新介绍 2024.7.13版本界面大改动此版本引入了重大的性能升级、对拦截功能的重大增强,以及在审计项目表中新增了扫描插入点列。…

【Nature】在科研中应用ChatGPT:如何与数据对话

随着人工智能技术的迅猛发展,大型语言模型(LLMs)正逐渐成为科研领域的一种创新工具。这些模型通过自然语言处理技术,使得研究人员能够以直观的方式与数据进行交互,从而简化了数据分析和解释的过程。在《自然》杂志2024…

103.二叉树的锯齿形层序遍历

1.题目描述 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1: 输入:root [3,9,20,nul…

Unity-可分组折叠的Editor

Unity-可分组折叠的Editor 🥗功能介绍🍭用法 🥗功能介绍 在序列化的字段上标记特性:[FoldoutGroup(“xxx”)],inspector上就会被分组折叠显示。 (没有被指定的字段自动放到Default组中) 传送门&#x1f30…

如何用Java SpringBoot和Vue搭建高效的OA办公管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

深度学习--复制机制:CopyNet 模型在序列到序列模型中的应用以及代码实现

CopyNet 是一种特别设计的序列到序列(Seq2Seq)模型,旨在更好地处理那些在输出序列中需要直接复制输入序列中的部分或全部内容的任务。它在机器翻译、摘要生成、文本复述等任务中有广泛的应用,尤其是在输入和输出有显著重叠的场景。…

Spring--三级缓存机制

一、什么是三级缓存 就是在Bean生成流程中保存Bean对象三种形态的三个Map集合&#xff0c;如下&#xff1a; // 一级缓存Map 存放完整的Bean&#xff08;流程跑完的&#xff09; private final Map<String, Object> singletonObjects new ConcurrentHashMap(256);// 二…

51单片机——LED灯控制

1、LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯、屏幕 2、LED原理图 电阻在原理图上标注为1k&#xff0c;表示这是1千欧的电阻&#xff0c;实际在电路板上的表示是102 102解…

HarmonyOs应用权限申请,system_grant和user_grant区别。本文附头像上传申请user-grant权限代码示例

HarmonyOs应用权限申请&#xff0c;system_grant和user_grant区别。本文附头像上传申请user-grant权限代码示例 system_grant&#xff08;系统授权&#xff09; system_grant指的是系统授权类型&#xff0c;在该类型的权限许可下&#xff0c;应用被允许访问的数据不会涉及到用户…

【大数据算法】一文掌握大数据算法之:排序链表搜索的亚线性算法。

排序链表搜索的亚线性算法 1、引言2、平面图直径问题的亚线性算法2.1 定义2.2 核心原理2.2.1 跳表2.2.2 跳跃搜索2.2.3 分块搜索 2.3 应用场景2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;这茶味道怎么样&#xff1f; 小鱼&#xff1a;嗯&am…

计算机毕业设计选题推荐-保险业务管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[CUDA编程] --- cuda线程模型

1 核函数 先看一个cuda版本的hello world #include <stdio.h>__global__ void helloworld() {printf("hello world\n"); }int main() {helloworld()<<<1, 1>>>();cudaDeviceSynchronize();return 0; }这里helloworld()<<<1, 1>…

旅行达人必备!有道翻译和这三款神器,轻松走遍世界

在如今的全球化和科技迅猛发展的时代&#xff0c;翻译工具在我们的日常生活中发挥着越来越重要的作用。在各种格式数据的翻译当中&#xff0c;我们就可以发现各种类型的翻译工具纷纷崭露头角。今天就分享三款除了有道翻译外的好用翻译工具&#xff0c;希望可以解决大家翻译的需…

虚幻5|暴击攻击和释放技能,造成伤害

玩家数据的Actor组件制作&#xff1a;虚幻5|制作玩家血量&#xff0c;体力-CSDN博客 造成伤害时&#xff0c;显示暴击及暴击字体颜色和未暴击的字体颜色&#xff0c;还有释放技能连击 一.编辑暴击数据 1.打开之前创建的玩家数据Actor组件 创建一个浮点变量&#xff0c;命名…

从法律风险的角度来看,项目经理遇到不清楚或不明确问题时的处理

大家好&#xff0c;我是不会魔法的兔子&#xff0c;在北京从事律师工作&#xff0c;日常分享项目管理风险预防方面的内容。 序言 在项目开展过程中&#xff0c;有时候会遇到一些不清楚或不明确的状况&#xff0c;但碍于项目进度的紧迫性&#xff0c;不得不硬着头皮做决策&…

喜羊羊教你(如何应对突发的技术故障和危机?)

开发团队如何应对突发的技术故障和危机&#xff1f; 在数字化时代&#xff0c;软件服务的稳定性至关重要。、8月19日下午&#xff0c;网易云音乐疑似出现服务器故障&#xff0c;网页端出现502 Bad Gateway 报错&#xff0c;且App也无法正常使用。 怀疑了自己的电脑、自己的手…

OpenStack 常见模块(二)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

MFC工控项目实例之七点击下拉菜单弹出对话框

承接专栏《MFC工控项目实例之六CFile添加菜单栏》 1、在SEAL_PRESSUREDlg.h文件中添加代码 class CSEAL_PRESSUREDlg : public CDialog { ...afx_msg void OnTypeManage(); ... } 2、在SEAL_PRESSUREDlg.cpp文件中添加代码 BEGIN_MESSAGE_MAP(CSEAL_PRESSUREDlg, CDialog)//…

如何使用ssm实现基于Java的学生信息管理系统的设计与实现

TOC ssm165基于Java的学生信息管理系统的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&a…