Redis 的主从复制、哨兵模式、集群脑裂
主从复制
主从复制是 Redis 高可用服务最基础的保证,将一台 Redis 主服务器,同步数据到多台 Redis 从服务器上,即一主多从的模式,且主从服务器之间采用的是「读写分离」的方式。
主服务器可以进行读写操作,当发生写操作时,自动将写操作同步给从服务器,而从服务器一般是只读,并接收主服务器同步过来的写操作命令,然后执行这条命令。

我们可以使用 replicaof(Redis 5.0 之前使用 slaveof)命令形成主服务器和从服务器的关系。
// 服务器B执行这条命令
replicaof <服务器A的IP地址> <服务器A的Redis端口号>
主从复制共有三种模式:全量复制、基于长连接的命令传播、增量复制。
主从服务器第一次同步的时候,就是采用全量复制,此时主服务器会两个耗时的地方,分别是生成 RDB 文件和传输 RDB 文件。
- 建立链接、协商同步。给全量复制做准备
- 主服务器同步数据给从服务器。主服务器会执行 bgsave 命令来生成 RDB 文件,然后把文件发送给从服务器。从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件
- 主服务器发送新的写操作命令给从服务器。为了保证主从服务器的数据一致性,主服务器将 bgsave 期间收到的写操作命令,写入到 replication buffer 缓冲区里。在主服务器生成的 RDB 文件发送完,从服务器完成 RDB 文件的载入后,会回复一个确认消息给主服务器。接着,主服务器将 replication buffer 缓冲区里所记录的写操作命令发送给从服务器,从服务器执行命令,这时主从服务器的数据就一致了
为了避免过多的从服务器和主服务器进行全量复制,可以把一部分从服务器升级为「经理角色」,让它也有自己的从服务器,分摊主服务器的压力。
在「从服务器」上执行下面这条命令,使其作为目标服务器的从服务器。如果目标服务器本身也是「从服务器」,那么该目标服务器就会成为「经理角色」,不仅可以接收主服务器同步的数据,也会把数据同步给自己旗下的从服务器,从而减轻主服务器的负担。
replicaof <目标服务器的IP> 6379
第一次同步完成后,主从服务器会维护着一个长连接,主服务器在接收到写操作命令后,会通过这个连接将写命令传播给从服务器,来保证主从服务器的数据一致性。
如果遇到网络异常中断,导致无法进行命令传播时,就利用 repl_backlog_size 缓冲区进行增量复制,实现主从服务器的数据一致性。
哨兵模式
在使用 Redis 主从服务时,当 Redis 的主从服务器出现故障宕机,需要进行手动恢复。
为了解决这个问题,Redis 增加了哨兵模式(Redis Sentinel),哨兵模式做到了可以监控主从服务器,并且提供主从节点故障转移的功能。

如果主节点或者从节点没有在规定的时间内响应哨兵的 PING 命令,哨兵就会将它们标记为「主观下线」。这个「规定的时间」是由配置项 down-after-milliseconds 参数设定的,单位是毫秒。
同时针对「主节点」,设计「主观下线」和「客观下线」两个状态,客观下线只适用于主节点。因为有可能「主节点」其实并没有故障,只是因为主节点的系统压力比较大或者网络拥塞,导致主节点没有在规定时间内响应哨兵的 PING 命令。
所以,为了减少误判,哨兵在部署时会用多个节点部署成哨兵集群(最少需要三台机器来部署哨兵集群),通过多个哨兵节点一起判断,就可以避免因为单个哨兵自身网络状况不好,导致误判主节点下线的情况。同时,多个哨兵的网络同时不稳定的概率较小,由它们一起做决策,误判率也能降低。
当一个哨兵判断主节点「主观下线」后,就会向其他哨兵发起命令,其他哨兵收到这个命令后,就会根据自身和主节点的网络状况,做出赞成投票或者拒绝投票的响应。

当这个哨兵的赞同票数达到配置文件中的 quorum 配置项设定的值后,主节点就会被该哨兵标记为「客观下线」。
哨兵判断完主节点客观下线后,就要开始在多个「从节点」中,选出一个从节点来做新主节点。这时候,还需要在哨兵集群中选出一个 leader,让 leader 来执行主从切换。
选举 leader 的过程其实也是一个投票的过程,在投票开始前,是哪个哨兵节点判断主节点为「客观下线」,这个哨兵节点就是候选者,所谓的候选者,就是想当 leader 的哨兵。
候选者会向其他哨兵发送命令,表明希望成为 leader 来执行主从切换,并让其他哨兵对它进行投票。每个哨兵只有一次投票机会,如果用完就不能再参与投票了,可以投给自己或投给别人,但是只有候选者才能把票投给自己。
举例来说,假设哨兵节点有 3 个,quorum 设置为 2,那么任何一个想成为 leader 的哨兵只要拿到 2 张赞成票,就可以选举成功了。如果没有满足条件,就需要重新进行选举。
选举出哨兵 leader 后,就可以进行主从故障转移的过程了。
- 在已下线的主节点(旧主节点)下属的所有「从节点」里,挑选出一个从节点,并将其转换为主节点(根据节点的优先级、复制进度、ID 号,尽可能让数据最全的节点成为新主节点)
- 让已下线的主节点下属的所有「从节点」修改复制目标,修改为复制「新主节点」
- 将新主节点的 IP 地址和信息,通过「发布/订阅机制」通知给客户端
- 继续监视旧主节点,等这个旧主节点重新上线时,将它设置为新主节点的从节点
集群脑裂
在 Redis 主从架构中,假设主节点网络突然发生了问题,它与所有的从节点都失联了,但是和客户端的网络还是正常的。客户端并不知道 Redis 内部已经出现了问题,继续向主节点写数据,因为主从节点之间的网络问题,这些数据始终无法同步给从节点。
这时,哨兵也发现主节点失联,它就认为主节点挂了(但实际上主节点还是正常运行,只是网络出问题了),于是哨兵就会在「从节点」中选举出一个新主节点,这时集群就有两个主节点了 —— 脑裂出现了(相当于出现了两个大脑)。
过了一会,主节点网络突然好了,重新上线时,因为哨兵之前已经选举出了一个新主节点,就会把旧主节点降级为从节点,然后从节点会向新主节点请求数据同步。
因为第一次同步是全量同步,从节点会清空本地的数据,再做全量同步。所以,之前客户端写入的数据就会丢失。
简单来说,由于网络问题,集群节点之间失去联系,主从数据不同步,哨兵重新平衡选举后产生两个主服务。等网络恢复后,旧主节点会降级为从节点,再与新主节点进行同步复制时,由于从节点会清空自己的缓冲区,导致之前客户端写入的数据丢失。
解决方案
当主节点发现从节点下线或者通信超时的总数量达到阈值时,禁止写数据,直接返回错误给客户端。
在 Redis 配置文件中,有两个参数可以设置。
- min-slaves-to-write x,主节点必须要有至少 x 个从节点连接,如果小于这个数,主节点就会禁止写数据
- min-slaves-max-lag x,主从数据复制和同步的延迟不能超过 x 秒,如果超过,主节点就会禁止写数据
可以把这两个配置项搭配起来使用,分别给它们设置一定的阈值,假设为 N 和 T。即主库连接的从库中至少有 N 个从库,且和主库进行数据复制时的 ACK 消息延迟不能超过 T 秒,否则主库就不会再接收客户端的写请求了。
等到选举出新主库时,只有新主库能接收和处理客户端请求,此时新写的数据会直接写到新主库中。而原主库会被哨兵降为从库,即使它的数据被清空了,也不会有数据丢失的问题。
相关文章:
Redis 的主从复制、哨兵模式、集群脑裂
主从复制 主从复制是 Redis 高可用服务最基础的保证,将一台 Redis 主服务器,同步数据到多台 Redis 从服务器上,即一主多从的模式,且主从服务器之间采用的是「读写分离」的方式。 主服务器可以进行读写操作,当发生写操…...
Pycharm通过SSH配置centos上Spark环境
直接在shell进行pyspark进行编程,程序没有办法写得太长,而且我们希望能够实现一个及时给出结果的编程环境,可以使用pycharm连接centos上的spark,进行本地编程,同步到centos系统中运行程序,并把结果返回pych…...
leetcode做题笔记98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 思路一:递归 …...
C# 中Lambda中的的匿名函数
/// <summary>/// 根据设备号,获取故障列表/// </summary>/// <param name"scanCode">主键</param>/// <returns></returns>[HttpGet]public async Task<IActionResult> GetItemPageList(string scanCode){//v…...
铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Ubuntu20 安装 libreoffice
1 更新apt-get sudo apt-get update2 安装jdk 查看jdk安装情况 Command java not found, but can be installed with:sudo apt install default-jre # version 2:1.11-72, or sudo apt install openjdk-11-jre-headless # version 11.0.138-0ubuntu1~20.04 sud…...
HTTP协议(JavaEE初阶系列15)
目录 前言: 1.HTTP协议 1.1HTTP协议是什么 1.2HTTP协议的报文格式 1.2.1抓包工具的使用 1.2.2HTTP请求 1.2.3HTTP响应 2.HTTP请求 2.1首行的组成 2.2.1URL的组成 2.2认识“方法”(method) 2.2.1GET方法 2.2.2POST方法 2.2.3GET…...
机器学习基础10-审查回归算法(基于波士顿房价的数据集)
上一节介绍了如何审查分类算法,并介绍了六种不同的分类算法,还 用同一个数据集按照相同的方式对它们做了审查,本章将用相同的方式对回归算法进行审查。 在本节将学到: 如何审查机器学习的回归算法。如何审查四种线性分类算法。如…...
基于 CentOS 7 构建 LVS-DR 群集。配置nginx负载均衡。
1、基于 CentOS 7 构建 LVS-DR 群集。 [root132 ~]# nmcli c show NAME UUID TYPE DEVICE ens33 c89f4a1a-d61b-4f24-a260-6232c8be18dc ethernet ens33 [root132 ~]# nmcli c m ens33 ipv4.addresses 192.168.231.200/24 [r…...
【云原生】Docker的数据管理(数据卷、容器互联)
目录 一、数据卷(容器与宿主机之间数据共享) 二、数据卷容器(容器与容器之间数据共享) 三、 容器互联(使用centos镜像) 总结 用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据…...
使用vlc在线播放rtsp视频url
1. 2. 3. 工具链接: https://download.csdn.net/download/qq_43560721/88249440...
copy is all you need前向绘图 和疑惑标记
疑惑的起因 简化前向图 GPT4解释 这段代码实现了一个神经网络模型,包含了BERT、GPT-2和MLP等模块。主要功能是给定一个文本序列和一个查询序列,预测查询序列中的起始和结束位置,使其对应文本序列中的一个短语。具体实现细节如下:…...
【附安装包】Vred2023安装教程
软件下载 软件:Vred版本:2023语言:简体中文大小:2.39G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.0GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.baidu.com…...
ASP.NET Core 中的 Dependency injection
依赖注入(Dependency Injection,简称DI)是为了实现各个类之间的依赖的控制反转(Inversion of Control,简称IoC )。 ASP.NET Core 中的Controller 和 Service 或者其他类都支持依赖注入。 依赖注入术语中&a…...
优化物料编码规则,提升物料管理效率
导 读 ( 文/ 2358 ) 物料是生产过程的必需品。对物料进行身份的唯一标识,可以更好的管理物料库存、库位,更方便的对物料进行追溯。通过编码规则的设计,可以对物料按照不同的属性、类别或特征进行分类,从而更好地进行库存分析、计划…...
Jetbrains IDE新UI设置前进/后退导航键
背景 2023年6月,Jetbrains在新发布的IDE(Idea、PyCharm等)中开放了新UI选项,我们勾选后重启IDE,便可以使用这一魔性的UI界面了。 但是前进/后退这对常用的导航键却找不到了,以前的设置方式(Vi…...
借助frp的xtcp+danted代理打通两边局域网p2p方式访问
最终效果 实现C内网所有设备借助c1内网代理访问B内网所有服务器 配置公网服务端A frps 配置frps.ini [common] # 绑定frp穿透使用的端口 bind_port 7000 # 使用token认证 authentication_method token token xxxx./frps -c frps.ini启动 配置service自启(可选) /etc/…...
2023年高教社杯数学建模思路 - 案例:FPTree-频繁模式树算法
文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法,…...
批量根据excel数据绘制饼状图
要使用Python批量根据Excel数据绘制饼状图,可以使用pandas和matplotlib库来实现。以下是一个基本的代码示例: import pandas as pd import matplotlib.pyplot as plt # 读取Excel文件 data pd.read_excel(data.xlsx) # 提取需要用于绘制饼状图的数据列…...
C++头文件和std命名空间
C 是在C语言的基础上开发的,早期的 C 还不完善,不支持命名空间,没有自己的编译器,而是将 C 代码翻译成C代码,再通过C编译器完成编译。 这个时候的 C 仍然在使用C语言的库,stdio.h、stdlib.h、string.h 等头…...
李慕婉-仙逆-造相Z-Turbo效果展示:精美动漫角色生成案例
李慕婉-仙逆-造相Z-Turbo效果展示:精美动漫角色生成案例 1. 惊艳效果预览:从文字到动漫角色的魔法 输入一段简单的文字描述,就能生成栩栩如生的动漫角色形象——这就是李慕婉-仙逆-造相Z-Turbo模型带来的神奇体验。作为专为《仙逆》角色李慕…...
L1-012 计算指数、L1-013 计算阶乘和、 L1-014 简单题、 L1-015 跟奥巴马一起画方块、 L1-016 查验身份证
L1-012 计算指数、L1-013 计算阶乘和、L1-014 简单题、 L1-015 跟奥巴马一起画方块、 L1-016 查验身份证L1-012 计算指数题目描述输入格式输出格式输入样例输出样例解题思路C 代码双引号 " " 的作用拼接过程示例L1-013 计算阶乘和题目描述输入格式输出格式输入样例输…...
手把手教你搭建mPLUG图片问答工具:全本地运行,无需联网
手把手教你搭建mPLUG图片问答工具:全本地运行,无需联网 1. 项目介绍与核心价值 想象一下,你有一张照片但不确定里面有什么,或者需要快速了解图片中的细节信息。传统方法可能需要你手动描述、上网搜索,或者将图片上传…...
告别抢票焦虑:用Python自动化脚本轻松获取大麦网演唱会门票
告别抢票焦虑:用Python自动化脚本轻松获取大麦网演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为心仪的演唱会门票秒光而烦恼吗?DamaiHelper大麦网抢票脚…...
内存暴涨却查无踪迹?Python对象生命周期管理的7个致命盲区,现在不看明天宕机!
第一章:Python智能体内存管理的核心原理Python智能体(如基于LangChain、LlamaIndex构建的Agent)在运行过程中并非仅依赖语言模型推理,其内存管理机制直接决定状态持久性、上下文感知能力与多轮交互一致性。核心在于Python对象生命…...
Ubuntu系统身份标识重塑:主机名与用户名的安全变更指南
1. 为什么要修改Ubuntu的主机名和用户名? 很多朋友第一次接触Ubuntu系统时,安装过程中随手设置的主机名和用户名,可能没想到后续会带来这么多麻烦。我遇到过不少这样的情况:公司服务器的主机名还是默认的"ubuntu"&#…...
RVC模型效果深度评测:针对不同性别、年龄、语言的声音转换鲁棒性
RVC模型效果深度评测:针对不同性别、年龄、语言的声音转换鲁棒性 最近声音克隆和转换技术越来越火,特别是RVC模型,很多人都说它效果不错。但说实话,大部分评测都集中在“像不像原声”这个点上,对于更复杂、更实际的情…...
零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程
零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程 在全球化内容消费的今天,语言障碍成为许多人获取知识的隐形门槛。想象一下,当你发现一个精彩的英文技术讲座视频,却因为语言问题无法充分理解;或是需要将中…...
如何快速使用网站历史查看器:新手完整入门教程
如何快速使用网站历史查看器:新手完整入门教程 【免费下载链接】wayback-machine-webextension A web browser extension for Chrome, Firefox, Edge, and Safari 14. 项目地址: https://gitcode.com/gh_mirrors/wa/wayback-machine-webextension 你是否曾经…...
Stateflow进阶:巧用‘历史节点’与‘内部转移’,实现带记忆功能的嵌入式状态机
Stateflow进阶:巧用‘历史节点’与‘内部转移’,实现带记忆功能的嵌入式状态机 在嵌入式系统开发中,状态机设计往往面临一个关键挑战:如何在系统重启或断电后恢复之前的工作状态?传统解决方案通常依赖外部存储或默认状…...
