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

十三、Redis哨兵模式--Sentinel

上一篇介绍了`Redis`中的主从复制。我们知道`Redis`主从中一般只有主节点对外提供写操作,如果主节点发生故障,为了保证`Redis`的可用性,这时就要在可用的`slave`节点中,挑选一个作为主节点。这种切换操作如果是人为的操作,那么存在一定的延时性,且耗费较大的人力。为了解决这个问题,`Redis`提供了一种模式--那就是**哨兵模式**。

Redis哨兵模式是一个分布式系统,监控主从架构中的节点。通过自动故障转移,保证集群的**高可用。**哨兵也是一台Redis服务器,只是不提供任何服务,推荐配置为单数(避免投票时出现相同票)。

1、主要结构

1.1、单哨兵模式

image.png

1.2、多哨兵模式

image.png

2、主要功能

2.1、监控

Sentinel会不间断的监控主节点和从节点是否正常。

2.2、通知

当Sentinel检测到某个节点出现异常时,会通知其他哨兵。

2.3、自动故障转移

当主服务器出现故障时,Sentinel会进行一次自动故障转移,它会从失效的主服务器的从服务器中选择出一个可用的从服务器作为新的主服务器,并通知失效的主服务器的从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新的主服务器地址,使得集群可以使用主服务器替换失效的服务器。

3、Sentinel工作原理分析

3.1、哨兵文件详解

配置1:sentinel monitor master-name ip port quorum
这个配置文件表示的是,哨兵定期监控名字叫做master-nameIP为ip,端口为port的主节点。quorum表示的哨兵判断主节点是否发生故障的票数。也就是说如果我将quorum设置为2,那么就代表至少要有两个哨兵认为主节点故障了,才算这个主节点是客观下线的。一般设置为sentinel节点数的一半加一。
配置2:sentinel down-after-millseconds master-name times
每个哨兵节点会定期发送ping命令来判断Redis节点和其余的哨兵节点是否可达的,如果超过了配置的times时间没有收到pong回复,就主观判断节点是不可达的。times单位为毫秒。
配置3:sentinel parallel-syncs master-name nums
当哨兵节点认为主节点故障时,哨兵投票选出的leader会进行故障转移,选出新的主节点,原来的从节点们会向新的主节点复制。这个配置就是来控制在故障转移之后,每次可以向新的主节点发起复制的节点个数,最多为nums个,因为如果不加控制会对主节点的网络和磁盘IO资源带来较大的压力。
配置4:sentinel failover-timeout master-name times
这个代表哨兵进行故障转移时,如果超过了配置的times时间就表示故障转移失败。
配置5:sentinel auth-pass master-name password
如果主节点设置了密码,则需要这个配置,否则哨兵无法对主节点进行监控。

3.2、为什么用到哨兵

哨兵主要是为了解决在主从复制架构中出现宕机的情况。主要分为两种情况:

3.2.1、从Redis宕机

这个相对来说简单些,在Redis中从库重新启动后会自动加入到主从架构中,自动完成数据同步。在Redis 2.8之后,主从断线后,数据恢复采用增量复制。

3.2.2、主Redis宕机

这个相对来说复杂点,需要以下两步才能完成

  1. 在从数据库中执行slaveof no noe命令,断开主从关系并且提升为主库继续服务。
  2. 将主库重新启动后,执行slaveof 新的master-ip port命令将其设置从库,这时数据就能更新回来,以从库的方式继续提供服务。

由于这个手动操作的过程其实是比较麻烦的并且容易出错,所以Redis提供了**哨兵模式(Sentinel)**来解决这个问题。

3.2.3、主观下线

主观下线就是单个Sentinel认为某个服务下线。Sentinel会以每秒一次的频率向所有与其建立了命令连接的实例(master,从服务,其他Sentinel)发送ping命令,通过判断ping命令回复是有效回复还是无效回复判断实例是否在线(对该Sentinel来说是主观下线)。
Sentinel配置文件中的down-after-millseconds设置了判断主观下线的时间长度,如果实例在down-afetr-millseconds毫秒内,没有收到有效回复(pong),那么Sentinel会认为(主观)该实例已经下线,修改状态为SRI_S_DOWN。如果多个Sentinel监视一个服务,有可能存在多个Sentinel的down-after-mullseconds配置不同。

3.2.4、客观下线

当主观下线的节点是主节点时,此时该哨兵节点会通过指令Sentinel is-master-down-by-addr寻求其他Sentinel节点对主节点的判断,如果其他Sentinel节点也认为主节点客观下线,且认为主观下线的票数超过了quorum(选举个数),此时哨兵节点则认为该主节点确实有问题,认为其事客观下线。
image.png

4、哨兵的三个定时任务监控

4.1、任务1

每个哨兵每10秒会向主节点和从节点发送info命令获取最新的拓扑结构图,哨兵配置时,只需要配置对主节点的监控即可,通过向主节点发送info命令,获取从节点的信息,并当有新的从节点假如时,可以马上感知到。
image.png

4.2、任务2

每个哨兵节点每隔2秒会向Redis数据节点的指定频道发送该哨兵节点对于主节点的判断,以及当前哨兵节点的信息,同时每个哨兵节点也会订阅该频道,来了解其他哨兵节点的信息及对主节点的判断,其实就是通过消息的publishsubscribe来完成的。
image.png

4.3、任务3

每隔1秒,每个哨兵会向主节点、从节点及其余哨兵节点发送一次ping命令做一次心跳检测,这个也是哨兵用来判断节点是否正常的重要依据。
image.png

5、Sentinel的leader选举流程

如果主节点被认为是客观下线之后就会选取一个哨兵节点来完成后面的故障转移工作,选举出一个leader的过程如下:

  1. 每个在线的哨兵节点都可以成为leader,当它确认(比如上图的哨兵3)主节点下线时,会向其他哨兵发送is-master-down-by-addr命令,征求其他哨兵的判断,并且将自己设置为leader,由leader来处理故障转移。
  2. 当其他哨兵收到此消息时,可以同意或者拒绝它成为领导者。
  3. 如果哨兵3发现自己在选举中的票数大于num(Sentinel)/2+1时,将成为领导者,如果没有超过,则继续选举。

image.png

6、自动故障转移机制

在从节点中选择新的主节点。
Sentinel状态数据结构中保存了主服务的所有从服务信息。Sentinel中的leader按照如下规则在从服务中选择一个作为新的主服务。

  1. 过滤掉主观下线的节点
  2. 选择slave-priority最高的节点,如果有则返回,没有就继续选择。
  3. 选择复制偏移量最大的节点,因为复制偏移量越大,说明数据越完整,如果有则返回,没有继续选择。
  4. 选择run_id最小的节点

image.png
通过slaveof no one,让选出来的从节点成为主节点;并通过slaveof命令让其他从节点复制新的主节点。将下线的主节点设置成新主节点的从节点,当其回复正常时,复制新的主节点,变成新主节点的从节点。

7、Sentinel工作原理总结

  • 每个Sentinel以每秒一次的频率向他所知master、slave以及其他Sentinel发送一次ping命令。
  • 如果一个实例距离最后一次回复ping命令的时间超过down-after-millseconds指定的值,则这个实例会被Sentinel标记为主观下线。
  • 如果一个master被标记为主观下线,则正在监控这个master的其他Sentinel要以每秒一次的频率确认master是否进入主观下线
  • 如果有足够数量的Sentinel(大于等于quorum指定的值)认为master确实处于主观下线状态,那么master会被标记为客观下线
  • 在一般情况下,每个Sentinel要以每10秒一次的频率向已知的master、slave发送info命令。
  • 当master被标记为客观下线后,Sentinel向下线的master的所有slave发送info命令的频率会从10秒一次改为每秒一次。

相关文章:

十三、Redis哨兵模式--Sentinel

上一篇介绍了Redis中的主从复制。我们知道Redis主从中一般只有主节点对外提供写操作,如果主节点发生故障,为了保证Redis的可用性,这时就要在可用的slave节点中,挑选一个作为主节点。这种切换操作如果是人为的操作,那么…...

[力扣题解]1005. K 次取反后最大化的数组和

题目:1005. K 次取反后最大化的数组和 思路 贪心法; 用绝对值大小排序,自己写一个比较函数, static bool compare(int a, int b) {return abs(a) > abs(b); }注意这样写出来是降序排列; 代码 class Solution {…...

Web UI自动化测试--PO模式

没有PO实现的测试用例的问题: 重用性低:登录功能重复可维护性差:数据和代码混合可读性差:元素定位方法杂乱(id、xpath、css混杂)可读性差:不易识别操作的含义(特别是css和xpath语法)可维护性差:如果某个元素的属性改了,你要更改多次PO(Page Object Model)页面对象模型…...

Python进阶之-反射机制详解

✨前言: 什么是反射? Python中的“反射”是一个编程术语,它指的是程序在运行时能够检查和操作其自身状态的能力,特别是通过名称(通常是字符串)来访问对象的属性、方法和其他组成部分。这种机制允许代码动态…...

day05-面向对象内存原理和数组

day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域…...

从头理解transformer,注意力机制(下)

交叉注意力 交叉注意力里面q和KV生成的数据不一样 自注意力机制就是闷头自学 解码器里面的每一层都会拿着编码器结果进行参考,然后比较相互之间的差异。每做一次注意力计算都需要校准一次 编码器和解码器是可以并行进行训练的 训练过程 好久不见输入到编码器&…...

ORA-609频繁出现在alert.log,如何解决?

ORA-609就alertlog中比较常见的一个报错,虽然并没有太大的影响,但是频繁的出现在alert log也是很让人厌烦的事情,本文介绍如何排查解决ORA-609问题。 1.ORA-609官方定义 could not attach to incoming connection Cause Oracle process cou…...

JVM 类加载机制

JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…...

亲测-wordpress文章实时同步发布修改删除多个站点的WP2WP插件

一款将wordpress文章同步到其他WordPress网站的插件,通过这款插件,可以保持不同博客之间文章发布、修改、删除的同步。 安装步骤: 主站和分站都要上传这个插件 1.把插件上传到wp-content\plugins解压出来wp2wp文件夹,然后启用插…...

npm无法安装node-sass 的问题

安装 node-sass 的问题呈现:4.9.0版本无法下载 Downloading binary from https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-72_binding.node Cannot download "https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-…...

springboot 引入第三方bean

如何进行第三方bean的定义 参数进行自动装配...

安装Nginx

如果没有gcc环境,需要安装gcc yum install gcc-c安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel工作目录 mkdir /opt/nginx && cd /opt/nginx下载安装包 wget http://nginx.org/download/nginx-1.32.1.tar.gz解压安装包…...

爬虫工具you-get

you-get是一个简单易上手的爬虫小工具,可以从网络中爬取多媒体信息,包括图片、音频和视频。you-get的github项目地址为:https://github.com/soimort/you-get 一、安装 以下为相关依赖,需要分别安装: Python 3 (必须…...

hal_stm32_RTC函数

1设置当前时间: 调用 HAL_RTC_SetTime 来设置小时、分钟、秒和亚秒。 调用 HAL_RTC_SetDate 来设置年、月、日和星期。 HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); HAL_StatusTypeDef HAL_RTC_SetDat…...

【大数据·Hadoop】从词频统计由浅入深介绍MapReduce分布式计算的设计思想和原理

一、引入:词频统计问题 假如我们有一亿份文档,需要统计这一亿份文档的词频。我们会怎么做,有以下思路 使用单台PC执行:能不能存的下不说,串行计算,一份一份文档读,然后进行词频统计&#xff0…...

win10建立共享文件夹和ipad共享文件

win10端设置 查看自己的局域网IP 在任意地方新建一个文件夹 打开文件夹的属性,点到共享的地方 点击高级共享 然后点击应用,确认 再回到之前哪个地方,点击共享 把Everyone的权限改为读取/写入 最后点击共享就欧克了 失败的可能原因 ipad端设置 然后回出现一个要输入用户名和…...

手机在网状态多方面重要性

手机在网状态的重要性体现在多个方面,它是现代社会中人们保持联系、获取信息以及进行日常活动不可或缺的一部分。以下是一些关于手机在网状态重要性的详细解释: 通信联系: 手机是在现代社会中进行通信联系的主要工具。当手机处于在网状态时&…...

Multitouch for Mac:手势自定义,提升工作效率

Multitouch for Mac作为一款触控板手势增强软件,其核心功能在于手势的自定义和与Mac系统的深度整合。通过Multitouch,用户可以轻松设置各种手势,如三指轻点、四指左右滑动等,来执行常见的任务,如打开应用、切换窗口、滚…...

IDEA创建springboot项目时不能选择java 8或者java 11等等版本的问题,解决方案

文章目录 1. Project JDK 和 Java 的区别2. 没有 java 8 或 java 11 等版本2.1 方案一2.2 方案二2.3 方案三 1. Project JDK 和 Java 的区别 我们在利用 idea 创建 spring boot 项目时,会有以上两个选项,这两个选项有什么区别? 答&#xff…...

SpringCloudAlibaba:4.3云原生网关higress的JWT 认证

概述 简介 JWT是一种用于双方之间传递安全信息的简洁的、URL安全的声明规范。 定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息,特别适用于分布式站点的单点登录(SSO)场景 session认证的缺点 1.安…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

windows系统MySQL安装文档

概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

用 FFmpeg 实现 RTMP 推流直播

RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...

若依项目部署--传统架构--未完待续

若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架&…...