当前位置: 首页 > news >正文

Redis 的主从复制、哨兵模式、集群脑裂

主从复制

主从复制是 Redis 高可用服务最基础的保证,将一台 Redis 主服务器,同步数据到多台 Redis 从服务器上,即一主多从的模式,且主从服务器之间采用的是「读写分离」的方式。

主服务器可以进行读写操作,当发生写操作时,自动将写操作同步给从服务器,而从服务器一般是只读,并接收主服务器同步过来的写操作命令,然后执行这条命令。

在这里插入图片描述

我们可以使用 replicaof(Redis 5.0 之前使用 slaveof)命令形成主服务器和从服务器的关系。

// 服务器B执行这条命令
replicaof <服务器A的IP地址> <服务器A的Redis端口号>

主从复制共有三种模式:全量复制、基于长连接的命令传播、增量复制。

主从服务器第一次同步的时候,就是采用全量复制,此时主服务器会两个耗时的地方,分别是生成 RDB 文件和传输 RDB 文件。

  1. 建立链接、协商同步。给全量复制做准备
  2. 主服务器同步数据给从服务器。主服务器会执行 bgsave 命令来生成 RDB 文件,然后把文件发送给从服务器。从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件
  3. 主服务器发送新的写操作命令给从服务器。为了保证主从服务器的数据一致性,主服务器将 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 后,就可以进行主从故障转移的过程了。

  1. 在已下线的主节点(旧主节点)下属的所有「从节点」里,挑选出一个从节点,并将其转换为主节点(根据节点的优先级、复制进度、ID 号,尽可能让数据最全的节点成为新主节点)
  2. 让已下线的主节点下属的所有「从节点」修改复制目标,修改为复制「新主节点」
  3. 将新主节点的 IP 地址和信息,通过「发布/订阅机制」通知给客户端
  4. 继续监视旧主节点,等这个旧主节点重新上线时,将它设置为新主节点的从节点

集群脑裂

在 Redis 主从架构中,假设主节点网络突然发生了问题,它与所有的从节点都失联了,但是和客户端的网络还是正常的。客户端并不知道 Redis 内部已经出现了问题,继续向主节点写数据,因为主从节点之间的网络问题,这些数据始终无法同步给从节点。

这时,哨兵也发现主节点失联,它就认为主节点挂了(但实际上主节点还是正常运行,只是网络出问题了),于是哨兵就会在「从节点」中选举出一个新主节点,这时集群就有两个主节点了 —— 脑裂出现了(相当于出现了两个大脑)。

过了一会,主节点网络突然好了,重新上线时,因为哨兵之前已经选举出了一个新主节点,就会把旧主节点降级为从节点,然后从节点会向新主节点请求数据同步。

因为第一次同步是全量同步,从节点会清空本地的数据,再做全量同步。所以,之前客户端写入的数据就会丢失。

简单来说,由于网络问题,集群节点之间失去联系,主从数据不同步,哨兵重新平衡选举后产生两个主服务。等网络恢复后,旧主节点会降级为从节点,再与新主节点进行同步复制时,由于从节点会清空自己的缓冲区,导致之前客户端写入的数据丢失。

解决方案

当主节点发现从节点下线或者通信超时的总数量达到阈值时,禁止写数据,直接返回错误给客户端。

在 Redis 配置文件中,有两个参数可以设置。

  • min-slaves-to-write x,主节点必须要有至少 x 个从节点连接,如果小于这个数,主节点就会禁止写数据
  • min-slaves-max-lag x,主从数据复制和同步的延迟不能超过 x 秒,如果超过,主节点就会禁止写数据

可以把这两个配置项搭配起来使用,分别给它们设置一定的阈值,假设为 N 和 T。即主库连接的从库中至少有 N 个从库,且和主库进行数据复制时的 ACK 消息延迟不能超过 T 秒,否则主库就不会再接收客户端的写请求了。

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

相关文章:

Redis 的主从复制、哨兵模式、集群脑裂

主从复制 主从复制是 Redis 高可用服务最基础的保证&#xff0c;将一台 Redis 主服务器&#xff0c;同步数据到多台 Redis 从服务器上&#xff0c;即一主多从的模式&#xff0c;且主从服务器之间采用的是「读写分离」的方式。 主服务器可以进行读写操作&#xff0c;当发生写操…...

Pycharm通过SSH配置centos上Spark环境

直接在shell进行pyspark进行编程&#xff0c;程序没有办法写得太长&#xff0c;而且我们希望能够实现一个及时给出结果的编程环境&#xff0c;可以使用pycharm连接centos上的spark&#xff0c;进行本地编程&#xff0c;同步到centos系统中运行程序&#xff0c;并把结果返回pych…...

leetcode做题笔记98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 思路一&#xff1a;递归 …...

C# 中Lambda中的的匿名函数

/// <summary>/// 根据设备号&#xff0c;获取故障列表/// </summary>/// <param name"scanCode">主键</param>/// <returns></returns>[HttpGet]public async Task<IActionResult> GetItemPageList(string scanCode){//v…...

铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&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)

目录 前言&#xff1a; 1.HTTP协议 1.1HTTP协议是什么 1.2HTTP协议的报文格式 1.2.1抓包工具的使用 1.2.2HTTP请求 1.2.3HTTP响应 2.HTTP请求 2.1首行的组成 2.2.1URL的组成 2.2认识“方法”&#xff08;method&#xff09; 2.2.1GET方法 2.2.2POST方法 2.2.3GET…...

机器学习基础10-审查回归算法(基于波士顿房价的数据集)

上一节介绍了如何审查分类算法&#xff0c;并介绍了六种不同的分类算法&#xff0c;还 用同一个数据集按照相同的方式对它们做了审查&#xff0c;本章将用相同的方式对回归算法进行审查。 在本节将学到&#xff1a; 如何审查机器学习的回归算法。如何审查四种线性分类算法。如…...

基于 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的数据管理(数据卷、容器互联)

目录 一、数据卷&#xff08;容器与宿主机之间数据共享&#xff09; 二、数据卷容器&#xff08;容器与容器之间数据共享&#xff09; 三、 容器互联&#xff08;使用centos镜像&#xff09; 总结 用户在使用Docker的过程中&#xff0c;往往需要能查看容器内应用产生的数据…...

使用vlc在线播放rtsp视频url

1. 2. 3. 工具链接&#xff1a; https://download.csdn.net/download/qq_43560721/88249440...

copy is all you need前向绘图 和疑惑标记

疑惑的起因 简化前向图 GPT4解释 这段代码实现了一个神经网络模型&#xff0c;包含了BERT、GPT-2和MLP等模块。主要功能是给定一个文本序列和一个查询序列&#xff0c;预测查询序列中的起始和结束位置&#xff0c;使其对应文本序列中的一个短语。具体实现细节如下&#xff1a…...

【附安装包】Vred2023安装教程

软件下载 软件&#xff1a;Vred版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;2.39G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.com…...

ASP.NET Core 中的 Dependency injection

依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是为了实现各个类之间的依赖的控制反转&#xff08;Inversion of Control&#xff0c;简称IoC &#xff09;。 ASP.NET Core 中的Controller 和 Service 或者其他类都支持依赖注入。 依赖注入术语中&a…...

优化物料编码规则,提升物料管理效率

导 读 ( 文/ 2358 ) 物料是生产过程的必需品。对物料进行身份的唯一标识&#xff0c;可以更好的管理物料库存、库位&#xff0c;更方便的对物料进行追溯。通过编码规则的设计&#xff0c;可以对物料按照不同的属性、类别或特征进行分类&#xff0c;从而更好地进行库存分析、计划…...

Jetbrains IDE新UI设置前进/后退导航键

背景 2023年6月&#xff0c;Jetbrains在新发布的IDE&#xff08;Idea、PyCharm等&#xff09;中开放了新UI选项&#xff0c;我们勾选后重启IDE&#xff0c;便可以使用这一魔性的UI界面了。 但是前进/后退这对常用的导航键却找不到了&#xff0c;以前的设置方式&#xff08;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树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…...

批量根据excel数据绘制饼状图

要使用Python批量根据Excel数据绘制饼状图&#xff0c;可以使用pandas和matplotlib库来实现。以下是一个基本的代码示例&#xff1a; import pandas as pd import matplotlib.pyplot as plt # 读取Excel文件 data pd.read_excel(data.xlsx) # 提取需要用于绘制饼状图的数据列…...

C++头文件和std命名空间

C 是在C语言的基础上开发的&#xff0c;早期的 C 还不完善&#xff0c;不支持命名空间&#xff0c;没有自己的编译器&#xff0c;而是将 C 代码翻译成C代码&#xff0c;再通过C编译器完成编译。 这个时候的 C 仍然在使用C语言的库&#xff0c;stdio.h、stdlib.h、string.h 等头…...

李慕婉-仙逆-造相Z-Turbo效果展示:精美动漫角色生成案例

李慕婉-仙逆-造相Z-Turbo效果展示&#xff1a;精美动漫角色生成案例 1. 惊艳效果预览&#xff1a;从文字到动漫角色的魔法 输入一段简单的文字描述&#xff0c;就能生成栩栩如生的动漫角色形象——这就是李慕婉-仙逆-造相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图片问答工具&#xff1a;全本地运行&#xff0c;无需联网 1. 项目介绍与核心价值 想象一下&#xff0c;你有一张照片但不确定里面有什么&#xff0c;或者需要快速了解图片中的细节信息。传统方法可能需要你手动描述、上网搜索&#xff0c;或者将图片上传…...

告别抢票焦虑:用Python自动化脚本轻松获取大麦网演唱会门票

告别抢票焦虑&#xff1a;用Python自动化脚本轻松获取大麦网演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为心仪的演唱会门票秒光而烦恼吗&#xff1f;DamaiHelper大麦网抢票脚…...

内存暴涨却查无踪迹?Python对象生命周期管理的7个致命盲区,现在不看明天宕机!

第一章&#xff1a;Python智能体内存管理的核心原理Python智能体&#xff08;如基于LangChain、LlamaIndex构建的Agent&#xff09;在运行过程中并非仅依赖语言模型推理&#xff0c;其内存管理机制直接决定状态持久性、上下文感知能力与多轮交互一致性。核心在于Python对象生命…...

Ubuntu系统身份标识重塑:主机名与用户名的安全变更指南

1. 为什么要修改Ubuntu的主机名和用户名&#xff1f; 很多朋友第一次接触Ubuntu系统时&#xff0c;安装过程中随手设置的主机名和用户名&#xff0c;可能没想到后续会带来这么多麻烦。我遇到过不少这样的情况&#xff1a;公司服务器的主机名还是默认的"ubuntu"&#…...

RVC模型效果深度评测:针对不同性别、年龄、语言的声音转换鲁棒性

RVC模型效果深度评测&#xff1a;针对不同性别、年龄、语言的声音转换鲁棒性 最近声音克隆和转换技术越来越火&#xff0c;特别是RVC模型&#xff0c;很多人都说它效果不错。但说实话&#xff0c;大部分评测都集中在“像不像原声”这个点上&#xff0c;对于更复杂、更实际的情…...

零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程

零代码实现YouTube视频翻译&#xff1a;Hugging Face大语言模型实战教程 在全球化内容消费的今天&#xff0c;语言障碍成为许多人获取知识的隐形门槛。想象一下&#xff0c;当你发现一个精彩的英文技术讲座视频&#xff0c;却因为语言问题无法充分理解&#xff1b;或是需要将中…...

如何快速使用网站历史查看器:新手完整入门教程

如何快速使用网站历史查看器&#xff1a;新手完整入门教程 【免费下载链接】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进阶&#xff1a;巧用‘历史节点’与‘内部转移’&#xff0c;实现带记忆功能的嵌入式状态机 在嵌入式系统开发中&#xff0c;状态机设计往往面临一个关键挑战&#xff1a;如何在系统重启或断电后恢复之前的工作状态&#xff1f;传统解决方案通常依赖外部存储或默认状…...