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

Redis7——基础篇(六)

 前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。

基础篇:

  1. Redis(一)
  2. Redis(二)
  3. Redis(三)
  4. Redis(四)
  5. Redis(五)

接上期内容:上期完成了Redis主从模式的学习。下面开始学习Redis的哨兵模式(重点),话不多说,直接发车。


一、定义

Q:既然已经有了主从模式,为什么还要推出哨兵模式呢?

A:在主从模式的架构里,当 Master 节点发生宕机故障时,从节点并不会自动晋升为新的Master。要是 Master 节点在短时间内无法恢复正常运行,系统就会陷入一个棘手的状况。此时,系统仅仅保留了读操作的功能,却丧失了写操作的能力。这种读写能力的失衡,显然无法满足实际业务对系统高可用性和数据完整性的要求。

而哨兵模式正是为了解决上述主从模式的痛点而诞生。它通过一组Sentinel节点来监控主从架构中的Redis实例,当主节点出现故障时,自动将一个从节点晋升为主节点,并让其他从节点重新指向新的主节点,从而实现自动故障转移,保证系统的高可用性。俗称:无人值守运维。


二、功能

  1. 主从监控:哨兵节点不断地检查主节点和从节点是否正常运行,通过定期发送 PING 命令来判断节点的健康状态。
  2. 消息通知:当某个 Redis 实例出现问题时,哨兵可以通过 API 向管理员或其他应用程序发送通知,以便及时处理。
  3. 自动故障转移:这是哨兵模式的核心功能。当主节点不可用时,哨兵会在从节点中选举一个新的主节点,并调整其他从节点的配置,使其指向新的主节点。
  4. 配置中心:客户端可以通过连接哨兵来获取主节点信息。

三、实操

(一)、架构说明

3个哨兵,1个Master,2个Slave。哨兵自动监控和维护集群,不存放数据,只是吹哨人,Master负责存,Slave负责读。

由于机器硬件问题,同时启动6台虚拟机,电脑吃不消,所以将哨兵的集群放在6379上。

(二)、实操步骤

1、拷贝原生配置

拷贝redis压缩目录下的sentinel.conf到/myredis下。


2、修改参数配置

2.1、参数说明

常用参数:

bind:服务监听地址,用于客户端连接,默认本机

daemonize:是否以后台daemon方式运行

protected-mode:安全保护模式
port:端口
logfile:日志文件路径
pidfilepid:文件路径
dir:工作目录

sentinel monitor <master-name> <ip> <redis-port> <quorum>:设置要监控的master服务器,quorum代表确认客观下线的最少的哨兵数量

sentinel auth-pass <master-name> <password>:连接Master的密码

其他参数:

sentinel down-after-milliseconds <master-name> <milliseconds>:指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线


sentinel parallel-syncs <master-name> <nums>:表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据


sentinel failover-timeout <master-name> <milliseconds>:故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败


sentinel notification-script <master-name> <script-path> :配置当某一事件发生时所需要执行的脚本


sentinel client-reconfig-script <master-name> <script-path>:客户端重新配置主节点参数脚本


2.2、修改配置

由于sentinel集群是在6379上,所以需要配置3份sentinel.conf文件。

vim 打开sentinel26379.conf 文件,删除里面所有内容,拷贝下面内容(改为自己虚拟机的IP地址):

bind 0.0.0.0
daemonize yes
protected-mode no
port 26379
logfile /myredis/logs/sentinel26379.log"
pidfile /var/run/redis-sentinel26379.pid
dir /myredis
sentinel monitor mymaster 192.168.112.129 6379 2
sentinel auth-pass mymaster root

23680、23681也一样,但是只要改端口号即可(改为自己虚拟机的IP地址):


3、测试主从模式

如果不知道,主从模式怎么搭建,请前往Redis(五)

启动Master,两台slave,并查看主从关系。

Master:

启动80、81slave:

确定主从关系:

测试主从是否正常工作:


4、配置哨兵集群

在6379那台机器上启动sentinel集群。

哨兵集群已成功启动。


5、模拟故障场景

我们自己手动关闭6379服务器,模拟master挂了。

5.1、思考问题

Q1:Master主机挂了,两台从机是否正常?

A:从机数据正常。


Q2:是否从两台slave中选出新的Master?

A:会。如Q1所示,6380和6381在Master宕机后,哨兵会进行选举和故障转移,导致从机在获取数据时,出现Server closed或者broken pipe错误,但是会立马恢复了。

此时6380已经成为了new Master,6381也变成了6380的slave。


Q3:之前的Master恢复后,谁会是新的Master?双Master会不会冲突?

A:新Master当然是哨兵选举出来的(本次是6380,下次不知道是谁),不会出现双Master的场景,以前的Master重新恢复后,会变成new Master的slave。

启动6379,查看主从关系:

查看Master6380:

完美收官。


6、对比配置文件

后续又重新玩了一遍,所以新Master由6380变成了6381。

查看sentinel26379.conf文件。

老Master6379.conf:

new Master 6381.conf:

结论:文件的内容,在运行期间会被sentinel动态进行更改。

当Master宕机后,哨兵选举出new Master之后,sentinel会对oldMaster_redis.conf、slave_redis.conf、sentinel.conf文件的内容进行更改,即oldMaster_redis.conf中会多一行slaveof的配置,newMaster_redis.conf中会移除之前的配置,而三个sentinel.conf的监控目标也会随之调换。


四、哨兵模式运行流程和选举流程

(一)、主观下线

所谓主观下线(Subjectively Down, 简称 SDOWN)指的是单个Sentinel实例对服务器做出的下线判断,即单个sentinel认为某个服务下线(有可能是接收不到订阅,或者二者之间的网络不通等等原因)。主观下线就是说如果服务器在[sentinel down-after-milliseconds]给定的毫秒数之内没有回应PING命令或者返回一个错误消息, 那么这个Sentinel会主观的(单方面的)认为这个master不可以用了。

sentinel.conf文件中:

sentinel down-after-milliseconds <master-name> <milliseconds>

表示Master被当前sentinel实例认定为失效的间隔时间,这个配置其实就是进行主观下线的一个依据,Master在多长时间内一直没有给sentinel返回有效信息,则认定该Master主观下线。也就是说如果多久没联系上redis-servevr,认为这个redis-server进入到失效(SDOWN)状态。


(二)、客观下线

当一个Sentinel节点将主节点标记为 “主观下线” 后,它会通过Sentinel之间的gossip协议(流言协议)将这个信息传播给其他 Sentinel 节点。当有足够数量(quorum)的Sentinel节点都认为主节点处于 “主观下线” 状态时,这个主节点就会被标记为 “客观下线”(Objectively Down)。

quorum这个参数是进行客观下线的一个依据

意思是至少有quorum个sentinel认为这个master有故障才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因导致无法连接master,而此时master并没有出现故障,所以这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用。 

sentinel.conf文件中:


(三)、选举leader

当主节点被判断客观下线以后,各个哨兵节点会进行协商,先选举出一个领导者哨兵节点(兵王)也即被选举出的兵王进行failover(故障迁移)。

Q:领导者哨兵节点如何选举出来的?

A:监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得,即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。这里涉及到一个算法问题,不做过多阐述,有兴趣可以私底下学习。


(四)、故障转移

故障转移分为三个步骤。可以趣称为“新主登基”、“群臣俯首”、“旧主拜服”。

(一)、“新主登基”

新主登基指:某个slave节点被选为Master。

从slave节点中选出new Master的规则:优先级-->偏移量-->Run ID

1、优先级

redis.conf文件中,优先级slave-priority或者replica-priority最高的从节点(数字越小优先级越高 ),默认100。


2、偏移量

指复制偏移位置offset最大的从节点,通俗一点就是谁从原Master哪儿复制的key多,谁就当新的Master。


3、Run ID

Run ID是Redis 实例启动时生成的一个随机的 40 位十六进制字符串,全局唯一。哨兵会选择 Run ID字典序最小的从节点作为新的主节点


4、选举流程图


(二)、“群臣俯首”

群臣俯首指:当new Master选举出来后,剩余的slave节点脱离宕机的Master,重新连接的新的Master(可以从sentinel.log文件查看)。具体分为二步:

1、Sentinel leader会对选举出的new Master执行slaveof no one操作,将其提升为Master节点。

2、Sentinel leader向其它slave发送命令,让剩余的slave成为新的Master节点的slave。


(三)、“旧主拜服”

旧主拜服指:已经宕机的Master故障恢复,重启成功了,从新加入。但是身份由以前的Master变成slave。


(四)、故障转移小总结

上述的failover操作均由sentinel自己独自完成,完全无需人工干预。


五、使用注意事项

  1. 哨兵节点的数量应为多个,哨兵本身应该集群,保证高可用。
  2. 哨兵节点的数量应该是奇数。
  3. 各个哨兵节点的配置应一致。
  4. 如果哨兵节点部署在Docker等容器里面,尤其要注意端口的正确映射。
  5. 哨兵集群+主从复制,并不能保证数据零丢失。

六、总结

Redis哨兵模式通过监控、通知和自动故障转移机制,为 Redis集群提供了高可用性保障。合理配置和应用 Redis哨兵模式,可以有效地提升系统的稳定性和性能。在实际应用中,需要根据具体的业务需求和场景,灵活调整配置参数,以充分发挥 Redis 哨兵模式的优势。


ps:努力到底,让持续学习成为贯穿一生的坚守。学习笔记持续更新中。。。。

相关文章:

Redis7——基础篇(六)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…...

Windows网络安全基础

随着互联网的发展和普及&#xff0c;Windows网络安全问题愈发严重。在本文中&#xff0c;我们将会介绍Windows网络安全的基本概念&#xff0c;包括网络攻击类型、网络安全威胁、网络安全防御措施等等&#xff0c;帮助初学者更好地了解Windows网络安全。 一、网络攻击类型 网络…...

spring boot知识点4

1.如何监视所有spring boot微服务 安装actuator插件&#xff0c;然后通过接口查询 /actuator/health 2.spring boot项目性能如何优化 a.优化启动时间&#xff0c;去除重复的依赖 b.JVM优化&#xff08;java虚拟机优化&#xff09;&#xff0c;限制堆的最小最大值 c.数据库…...

【大模型系列篇】DeepSeek-R1如何通过强化学习有效提升大型语言模型的推理能力?

如何通过强化学习&#xff08;RL&#xff09;有效提升大型语言模型&#xff08;LLM&#xff09;的推理能力&#xff1f; 《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》由DeepSeek-AI团队撰写&#xff0c;主要介绍了他们开发的第一代…...

主表增一个子表批量新增

1、在新增接口里&#xff0c;先随机生成编码&#xff0c;生成RedisLock&#xff0c;逻辑校验&#xff0c;Dto转bean&#xff0c;新增主表&#xff0c;获取主表的ID&#xff0c;新增子表&#xff0c;最后释放锁 2、在修改接口里&#xff0c;获取主表ID&#xff0c;先修改主表&am…...

Llama 3.1 本地电脑部署 Linux系统 【轻松简易】

本文分享在自己的本地电脑部署 llama3.1&#xff0c;而且轻松简易&#xff0c;快速上手。 这里借助Ollama工具&#xff0c;在Linux系统中进行大模型部署~ Llama3.1&#xff0c;有三个版本&#xff1a;8B、70B、405B Llama 3.1 405B 是第一个公开可用的模型&#xff0c;在常识…...

langchain系列 - FewShotPromptTemplate 少量示例

导读 环境&#xff1a;OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3 背景&#xff1a;前期忙碌的开发阶段结束&#xff0c;需要沉淀自己的应用知识&#xff0c;过一遍LangChain 时间&#xff1a;20250220 说明&#xff1a;技术梳理&#xff0c;针对FewShotP…...

详细介绍下软件生命周期的各个阶段以及常见的软件生命周期模型

软件生命周期&#xff08;Software Life Cycle&#xff09;是指软件从需求分析到最终退役的整个过程。通常&#xff0c;软件生命周期可以划分为以下几个主要阶段&#xff1a; 一、软件生命周期的主要阶段 需求分析&#xff08;Requirements Analysis&#xff09; 与客户沟通&am…...

重构谷粒商城07:Git一小时快速起飞指南

重构谷粒商城07&#xff1a;Git一小时快速起飞指南 前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff…...

设计模式教程:命令模式(Command Pattern)

1. 什么是命令模式&#xff1f; 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式。它将请求封装成一个对象&#xff0c;从而使你能够用不同的请求、队列和日志请求以及支持可撤销操作。 简单来说&#xff0c;命令模式通过把请求封装成对象的方式解耦了…...

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件

一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类&#xff0c;这就是QPdfWriter类。 &#xff08;1&#xff09;PDF文件生成 支持创建新的PDF文件或覆盖已有文件&#xff0c;通过构造函数直接绑定文件路径或QFile对象&#xff1b; 默认生成矢量图形PDF&#…...

Android开发-深入解析Android中的AIDL及其应用场景

深入解析 Android 中的 AIDL 及其应用场景 1. 前言2. AIDL 的核心概念3. AIDL 的实现步骤3.1. 定义 AIDL 接口文件3.2. 实现服务端&#xff08;Service&#xff09;3.3. 客户端绑定与调用 4. AIDL 的典型应用场景4.1. 多进程应用4.2. 与系统服务交互4.3. 高性能 IPC4.4. 跨应用…...

RT-Thread+STM32L475VET6实现红外遥控实验

文章目录 前言一、板载资源介绍二、具体步骤1. 确定红外接收头引脚编号2. 下载infrared软件包3. 配置infrared软件包4. 打开STM32CubeMX进行相关配置4.1 使用外部高速时钟&#xff0c;并修改时钟树4.2 打开定时器16(定时器根据自己需求调整)4.3 打开串口4.4 生成工程 5. 打开HW…...

【机器学习】衡量线性回归算法最好的指标:R Squared

衡量线性回归算法最好的指标&#xff1a;R Squared 一、摘要二、回归算法评价指标与R Squared指标介绍三、R Squared的编程实践 一、摘要 本文主要介绍了线性回归算法中用于衡量模型优劣的重要指标——R Squared&#xff08;R方&#xff09;。R方用于比较模型预测结果与实际结…...

设计模式-Java

一、创建型模式 1. 单例模式 定义 确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 实现方式 饿汉式&#xff08;线程安全&#xff0c;但可能浪费资源&#xff09; public class Singleton {// 静态变量&#xff0c;类加载时初始化private static final Singlet…...

代码讲解系列-CV(五)——语义分割基础

文章目录 一、图像分割标注1.1 Labelme标注1.2 SAM辅助1.3 json格式 二、数据解析2.1 Dataset2.2 train.py2.2.1 取参2.2.2 分割和数据集的读取 三、Unet网络搭建3.1 Unet3.2 Network 四、损失函数和指标4.1 DICE系数4.2 损失函数4.3 半精度训练 五、SAM六、作业 语义分割是图片…...

在mfc中使用自定义三维向量类和计算多个三维向量的平均值

先添加一个普通类, Vector3.h, // Vector3.h: interface for the Vector3 class. // //#if !defined(AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_) #define AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_#if _MSC_VER > 1000 #p…...

RDMA ibverbs_API功能说明

设备管理 获取当前活动网卡 返回当前rdma设备列表 struct ibv_device **ibv_get_device_list(int *num_devices);//使用 struct ibv_device **dev_list ibv_get_device_list(NULL);获取网卡名 返回网卡名字字符串&#xff1a;如"mlx5_0"&#xff0c;一般通过网卡…...

【C++语言】string 类

一、为什么要学习 string 类 C语言中&#xff0c;字符串是以 “\0” 结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些 str 系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合 OOP 的思想&#xff0c;而且底层空间需…...

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...