十三、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秒一次改为每秒一次。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支持播放h265的插件

插件源码地址:GitCode - 开发者的代码家园https://gitcode.com/mirrors/nanguantong/flv-h265.js/overview 1. 下载代码 运行以下命令 npm i npm run build npm run build 后生成 flv.min.js 文件,引入使用 2. 调用 js 文件: let flvj…

uniapp开发小程序使用vue的v-html解析富文本图片过大过宽显示超过屏幕解决办法

如果没有设置的话,就会导致图片溢出,过宽显示或者错位显示,显示效果非常的丑陋: 修改后显示的效果: 网上比较low的解决办法:网上各种解决方法核心思想就是在数据层把数据模板上的img数据加上style样式&…

简要介绍三大脚本语言 Shell、Python 和 Lua

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 脚本语言是一种用于自动化操作系统任务和应用程序功能的编程语言。它们通常用于编写小到中等规模的程序,以提高任务执行的速度和效率。在众多脚本语言中,Shell、Python 和 Lua 是…

重发布和路由策略实验(课堂练习)

需求: 将1.1.1.0/24网段(不在OSPF中)重发布到网络中,不允许出现次优路径,实现全网可达。 需求分析: 1、在R1上重发布1.1.1.0/24网段,但是需要过滤192.168.12.0/24和192.168.13.0/24 2、在R2和R3…

网络编程学习笔记1

文章目录 一、socket1、创建socket2、网络通信流程3、accept()函数4、signal()函数5、recv()函数6、connect()函数 二、I/O多路复用1.select模型2.poll模型3.epoll模型 注 一、socket 1、创建socket int socket(int domain,int type,int protocol); //返回值:一个…

Servlet讲解

Servlet生命周期 我们只需要继承Servlet接口,查看方法即可看出Servlet的生命周期 import java.io.IOException;import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest…

对数据进行标准化和归一化

数据的形式:保存在CSV中,第一列为姓名,第二列之后为特征。 标准化 输入文件的路径,设置保存转化后的文件路径 import pandas as pd from sklearn.preprocessing import StandardScaler# 读取CSV文件 data pd.read_csv(rC:\User…

GPT 大型语言模型可视化教程

网址: LLM Visualization 简介 欢迎来到 GPT 大型语言模型演练!在这里,我们将探索只有 85,000 个参数的 nano-gpt 模型。 它的目标很简单:取一个由六个字母组成的序列: C B A B B C 并按字母顺序排列,即…

Jboss 反序列化 CVE-2017-12149

一、漏洞简介 JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。在/invoker/readonly路径下,攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测,导致攻击者可以执行任意代码。 而jbo…

TCP(TCP客户端、服务器如何通信)

一、TCP介绍 TCP的特点: 面向连接的协议:TCP是一种可靠的、面向连接的协议,在通信之前需要建立连接,以确保数据的可靠传输。这意味着在传输数据之前,发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…

Linux实验 系统管理(三)

实验目的: 了解Linux系统下的进程;掌握一类守护进程——计划任务的管理;掌握进程管理的常用命令;掌握进程的前台与后台管理;了解Linux系统的运行级别;掌握系统服务管理的常用命令。 实验内容: …

040——移植数据库sqlite3到i.mx6ull

目录 一、下载 二、移植数据库 三、测试sqlite3 一、下载 SQLite Download Page 暂时先下载最新版的试试,我们以前其实在ubuntu上直接使用过 嵌入式数据库sqlite3_常见的嵌入式数据库-CSDN博客 当时我把常用的操作和怎么使用记录下来了 现在把他移植到开发板…

下水道井盖多分类检测定位

下水道井盖识别,多分类,使用yolov5训练,采用一部分开源数据集和自建数据集。python pytorch opencv 深度学习#人工智能#深度学习#目标检测

【Python项目】基于大数据的【电影市场预测分析】

技术简介:使用Python技术、B/S架构、MYSQL数据库等实现。 系统简介:系统都需要简单的安全登陆检查,在登陆成功之后要进行在映电影的分析、票房分析、电影数据等功能相关性的数据统计,为了使用方便这些统计型的数据使用图表来进行表…

【基于element ui的color选择器】基于element ui的color选择器

技术版本如下&#xff1a; vue 2.6.14 less 3.13.1 element-ui 2.15.6 less-loader 5.0.0需求&#xff1a; 支持RGB、HEX编码、支持吸管吸取颜色、颜色选择器、颜色模板、透明度、色板、线性渐变颜色 效果图&#xff1a; 1.引入选择器的color-all文件 <template><…

web前端之纯CSS实现简单酷炫的照片墙效果、排除元素的伪类、scale

MENU 效果htmlstylescale:not() 效果 html <div class"container"><div class"box"><img src"../../image/1_.jpg"></div><div class"box"><img src"../../image/2_.jpg"></div>…

【python量化交易】qteasy使用教程06——创建自定义因子选股交易策略

创建自定义因子选股策略 使用qteasy创建自定义因子选股交易策略开始前的准备工作本节的目标Alpha选股策略的选股思想计算选股指标用FactorSorter定义Alpha选股策略交易策略的回测结果用GeneralStg定义一个Alpha选股策略回测结果&#xff1a;本节回顾 使用qteasy创建自定义因子选…

Electron、QT、WPF三强争霸,该支持谁呢?

Electron、QT、WPF都是跨平台的桌面应用开发框架&#xff0c;都是非常流行的&#xff0c;作为开发者该选用哪个呢&#xff1f;本文从多个角度分析一下。 一、定义 Electron、Qt 和 WPF 都是用于创建桌面应用程序的框架或工具&#xff0c;它们各自有着不同的特点和优势。 Elec…

Linux-笔记 开发板Uboot命令使用

将之前自学的知识整理了一下笔记&#xff0c;以便回忆 信息查询命令 1、help/?&#xff1a;查看所支持命令 > ? md md - memory displayUsage: md [.b, .w, .l] address [# of objects]2、bdinfo&#xff1a;查询板子信息 > bdinfo arch_number 0x00000000 boot_p…