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 等头…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
