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 等头…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...