9、Redis之哨兵

Redis之哨兵

1、什么是哨兵

​ 对于Master宕机后的冷处理方式是无法实现高可用的。Redis从2.6版本开始提供了高可用的解决方案–Sentinel哨兵机制。在集群中再引入一个节点,该节点充当Sentinel哨兵,用于监视Master的运行状态,并在Master宕机后自动指定一个Slave作为新的Master。整个过程无需人工操作,完全由哨兵自动完成。

​ 不过,此时的 Sentinel 哨兵又成为了一个单点故障点:若哨兵发生宕机,整个集群将瘫 痪。所以为了解决 Sentinel 的单点问题,又要为 Sentinel 创建一个集群,即 Sentinel 哨兵集 群。一个哨兵的宕机,将不会影响到 Redis 集群的运行。

​ 那么这些 Sentinel 哨兵是如何工作的呢?Sentinel 是如何知道其监视的 Master 状态的呢?每个Sentinel都会定时向Master发送心跳,如果Master在有效期内向它们都进行了响应,那么就认为Master是活着的。如果Sentinel中有quorum个哨兵没有收到响应,那么就认为Master已经宕机,当然会有一个Sentinel做Failover故障转移。即将原来的某一个Slave晋升为Master。

2、Redis高可用集群搭建

​ 在“不差钱”的情况下,可以让 Sentinel 占用独立的主机,即在 Redis 主机上只启动 Redis 进程,在 Sentinel 主机上只启动 Sentinel 进程。下面要搭建一个“一主二从三哨兵”的高可 用伪集群,即这些角色全部安装运行在一台主机上。“一主二从”使用前面的主从集群,下 面仅搭建一个 Sentinel 伪集群。

角色端口号角色端口号
master6380sentinel26380
slave6381sentinel26381
slave6382sentinel26382

​ 具体搭建就不记笔记了,网上有很多。

3、哨兵机制原理

3.1、三个定时任务

Sentinel 维护着三个定时任务以监测 Redis 节点及其它 Sentinel 节点的状态。

3.1.1、info任务

​ 每个 Sentinel 节点每 10 秒就会向 Redis 集群中的每个节点发送 info 命令,以获得最新的 Redis 拓扑结构。

3.1.2、心跳任务

​ 每个Sentinel节点每1秒就会向所有Redis节点及其它Sentinel节点发送一条ping命令, 以检测这些节点的存活状态。该任务是判断节点在线状态的重要依据。

3.1.3、发布/订阅任务

​ 每个 Sentinel 节点在启动时都会向所有 Redis 节点订阅_ sentinel _:hello 主题的信息, 当 Redis 节点中该主题的信息发生了变化,就会立即通知到所有订阅者。

​ 启动后,每个 Sentinel 节点每 2 秒就会向每个 Redis 节点发布一条_ sentinel _:hello 主 题的信息,该信息是当前 Sentinel 对每个 Redis 节点在线状态的判断结果及当前 Sentinel 节 点信息。

​ 当 Sentinel 节点接收到_ sentinel _:hello 主题信息后,就会读取并解析这些信息,然后 主要完成以下三项工作:

  • 如果发现有新的 Sentinel 节点加入,则记录下新加入 Sentinel 节点信息,并与其建立连 接。

  • 如果发现有 Sentinel Leader 选举的选票信息,则执行 Leader 选举过程。

  • 汇总其它 Sentinel 节点对当前 Redis 节点在线状态的判断结果,作为 Redis 节点客观下 线的判断依据。

3.2、Redis节点下线判断

​ 对于每个 Redis 节点在线状态的监控是由 Sentinel 完成的。

3.2.1、主观下线

​ 每个Sentinel节点每秒就会向每个Redis节点发送ping心跳检测,如果Sentinel在down-after-milliseconds时间内没有收到某个Redis节点的回复,则Sentinel节点就会对该Redis节点做出“下线状态”的判断。这个判断仅仅是当前Sentinel节点的“一家之言”,所以称为主观下线。

3.2.2、客观下线

​ 当Sentinel主观下线的节点是master时,该Sentinel节点会向每个其他Sentinel节点发送sentinel is-master-down-by-addr 命令,以询问其对master在线状态的判断结果。这些Sentinel节点在收到命令后会向这个发问Sentienl响应0(在线)或1(下线)。当Sentinel收到超过quorum个下线判断后,就会对master做出客观下线判断。

3.3、Sentinel Leader选举

​ 当Sentinel节点对master做出客观下线判断后,会由Sentinel Leader来完成后续的故障转移,即Sentinel集群中的节点也是非对等节点,是存在Leader与Follower的。

​ Sentinel 集群的 Leader 选举是通过 Raft 算法实现的。简单介绍一下大致思路。

​ 每个选举参与者都具有当选 Leader 的资格,当其完成了“客观下线”判断后,就会立 即“毛遂自荐”推选自己做 Leader,然后将自己的提案发送给所有参与者。其它参与者在收 到提案后,只要自己手中的选票没有投出去,其就会立即通过该提案并将同意结果反馈给提 案者,后续再过来的提案会由于该参与者没有了选票而被拒绝。当提案者收到了同意反馈数 量大于等于 max(quorum,sentinelNum/2+1)时,该提案者当选 Leader。

说明:

  • 在网络没有问题的前提下,基本就是谁先做出了“客观下线”判断,谁就会首先发起 Sentinel Leader 的选举,谁就会得到大多数参与者的支持,谁就会当选 Leader。

  • Sentinel Leader 选举会在次故障转移发生之前进行。

  • 故障转移结束后 Sentinel 不再维护这种 Leader-Follower 关系,即 Leader 不再存在。 (这里的主要原因是完成Sentinel Leader选举是很块很快的,而且master下线的概率也很低,所以为了节约计算机资源,Leader用完就没了,什么时候需要就什么时候重新选举)

3.4、master选择算法

​ 在进行故障转移时,Sentinel Leader 需要从所有 Redis 的 Slave 节点中选择出新的 Master。 其选择算法为:

  1. 过滤掉所有主观下线的,或心跳没有响应 Sentinel 的,或 replica-priority 值为 0 的 Redis 节点
  2. 在剩余 Redis 节点中选择出 replica-priority 最小的的节点列表。如果只有一个节点,则 直接返回,否则,继续
  3. 从优先级相同的节点列表中选择复制偏移量最大的节点。如果只有一个节点,则直接返 回,否则,继续
  4. 从复制偏移值量相同的节点列表中选择动态 ID 最小的节点返回

3.5、故障转移过程

​ Sentinel Leader 负责整个故障转移过程,经历了如上步骤:

  1. Sentinel Leader 根据 master 选择算法选择出一个 slave 节点作为新的 master
  2. Sentinel Leader 向新 master 节点发送 slaveof no one 指令,使其晋升为 master
  3. Sentinel Leader 向新 master 发送 info replication 指令,获取到 master 的动态 ID
  4. Sentinel Leader 向其余 Redis 节点发送消息,以告知它们新 master 的动态 ID
  5. Sentinel Leader 向其余 Redis 节点发送 slaveof 指令,使它们成为新 master 的 slave
  6. Sentinel Leader 从所有 slave 节点中每次选择出 parallel-syncs 个 slave 从新 master 同步数 据,直至所有 slave 全部同步完毕
  7. 故障转移完毕

3.6、节点上线

3.6.1、原Redis节点上线

​ 无论是原下线的 master 节点还是原下线的 slave 节点,只要是原 Redis 集群中的节点上 线,只需启动 Redis 即可。因为每个 Sentinel 中都保存有原来其监控的所有 Redis 节点列表, Sentinel 会定时查看这些 Redis 节点是否恢复。如果查看到其已经恢复,则会命其从当前 master 进行数据同步。

​ 不过,如果是原 master 上线,在新 master 晋升后 Sentinel Leader 会立即先将原 master 节点更新为 slave,然后才会定时查看其是否恢复。

3.6.2、新Redis节点上线

​ 如果需要在 Redis 集群中添加一个新的节点,其未曾出现在 Redis 集群中,则上线操作 只能手工完成。即添加者在添加之前必须知道当前 master 是谁,然后在新节点启动后运行 slaveof 命令加入集群。

3.6.3、Sentinel节点上线

​ 如果要添加的是 Sentinel 节点,无论其是否曾经出现在 Sentinel 集群中,都需要手工完 成。即添加者在添加之前必须知道当前 master 是谁,然后在配置文件中修改 sentinel monitor 属性,指定要监控的 master。然后启动 Sentinel 即可。

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

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

相关文章

Gemma的简单理解;Vertex AI的简单理解,与chatGpt区别

目录 Gemma的简单理解 Vertex AI的简单理解 Gemma Vertex AI Gemma Vertex AI和chatcpt区别 一、定义与功能 二、技术特点 三、应用场景 四、获取与部署 Gemma的简单理解 定义与功能: Gemma是谷歌开源的一款大语言模型,它采用了Gemini架构,并提供了20亿(2B)和7…

Apache AGE的MATCH子句

MATCH子句允许您在数据库中指定查询将搜索的模式。这是检索数据以在查询中使用的主要方法。 通常在MATCH子句之后会跟随一个WHERE子句,以添加用户定义的限制条件到匹配的模式中,以操纵返回的数据集。谓词是模式描述的一部分,不应被视为仅在匹…

3D问界—在MAYA中使用Python脚本进行批量轴居中

问题提出:MAYA中如何使用Python脚本 今天不是一篇纯理论,主要讲一下MAYA中如何使用Python脚本,并解决一个实际问题,文章会放上我自己的代码,若感兴趣欢迎尝试,当然,若有问题可以见文章末尾渠道&…

分布式IO系统2通道串口通信模块M602x

现场总线耦合器本身包含一个电源模块,它有 2 个串口通道,通过 Modbus RTU(Master)协议连接外部串行设备,实现耦合器与外部串行设备通信,现以连接设备的示例带大家了解我们钡铼的2 通道串口通信模块 M602x。…

【BUG】已解决:Uncaught SyntaxError: Unexpected token ‘<‘

已解决:Could not install packages due to an EnvironmentError: [Errno 13] Permission denied 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主理人 …

深入解析Apache Hive架构

目录 引言Hive简介 什么是HiveHive的特性Hive的优势 Hive架构概述 Hive的核心组件Hive的工作原理 Hive的核心组件详解 HiveQLMetaStoreDriverCompilerOptimizerExecutorStorage Hive的工作流程 查询处理流程数据加载和存储流程 Hive的使用场景Hive的优缺点总结 引言 随着大数…

【INTEL(ALTERA)】使用 F-Tile DisplayPort FPGA IP 设计示例时为何模拟失败?

目录 说明 解决方法 说明 由于 Quartus Prime Pro Edition 软件版本 24.1 存在一个问题,F-Tile DisplayPort FPGA IP 设计示例的模拟将运行超过 24 小时,然后失败,并显示消息“Simulation Hanged”。 解决方法 要解决此问题,…

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined问题解决

一、系统环境变量中添加tomcatjdk的环境变量声明 1、右击此电脑->属性->高级系统设置 可复制粘贴下面的变量名 CATALINA_HOME 点击path->编辑->新建 可将下面值粘入 %CATALINA_HOME%\bin 2、配置jdk的系统变量 系统变量->新建->如图 可将下面变量名粘入 J…

Python兴趣编程百例:使用Python实现一个Json与Excel互转小工具

在日常数据处理中,JSON 和 Excel 是两种常见的数据格式。为了方便在这两种格式之间进行转换,我们决定使用 Python 的 pandas 库来实现 JSON 与 Excel 的互相转换工具,并用 PyQt 实现一个图形界面。本项目将包含详细的设计思路、类设计说明、实现步骤和完整代码。 1.设计思路…

Flutter热更新技术探索

一,需求背景: APP 发布到市场后,难免会遇到严重的 BUG 阻碍用户使用,因此有在不发布新版本 APP 的情况下使用热更新技术立即修复 BUG 需求。原生 APP(例如:Android & IOS)的热更新需求已经…

c++写一个查询工作站服务器中每个用户的空间使用量

工作中有一个小需求&#xff0c;需要统计用户空间使用量 统计空间的主函数&#xff1a; #include <iostream> #include <fstream> #include <sstream> #include <map> #include <string> #include <cstdlib> #include <sys/types.h&g…

LabVIEW 与 PLC 通讯方式

在工业自动化中&#xff0c;LabVIEW 与 PLC&#xff08;可编程逻辑控制器&#xff09;的通信至关重要&#xff0c;常见的通信方式包括 OPC、Modbus、EtherNet/IP、Profibus/Profinet 和 Serial&#xff08;RS232/RS485&#xff09;。这些通信协议各有特点和应用场景&#xff0c…

从零手写实现 nginx-31-load balance 负载均衡介绍

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

@google/model-viewer 导入 改纹理 (http-serve)

导入模型 改纹理 效果图 <template><div><h1>鞋模型</h1><model-viewerstyle"width: 300px; height: 300px"id"my-replace-people"src"/imgApi/Astronaut.glb"auto-rotatecamera-controls></model-viewer>&…

C++STL---priority_queue知识总结及模拟实现

前言 和stack与queue一样&#xff0c;priority_queue也是一种容器适配器。 他的本质其实是堆&#xff0c;作优先级队列的底层需要能够通过随机迭代器访问&#xff0c;所以他的底层是可以由vector和queue实例化&#xff0c;默认情况下priority_queue默认是用vector作为底层实例…

智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理

近日&#xff0c;位于四川德阳的三星堆博物馆迎来了参观热潮。据新闻报道&#xff0c;三星堆博物馆的日均参观量达1.5万人次。随着暑假旅游高峰期的到来&#xff0c;博物馆作为重要的文化场所&#xff0c;也迎来了大量游客。博物馆作为文化和历史的重要载体&#xff0c;其安全保…

关于vue实现导出excel表,以及导出的excel后的图片超过单元格的问题

实现导出带图标片的excel的方法&#xff0c; 首先&#xff1a; import table2excel from js-table2excel // 导出表格 按钮点击后触发事件 const onBatchExport () > {const column [//数据表单{title: "ID", //表头名称titlekey: "id", //数据ty…

通用图形处理器设计GPGPU基础与架构(四)

一、前言 本文将介绍GPGPU中线程束的调度方案、记分牌方案和线程块的分配与调度方案。 二、线程束调度 在计算机中有很多资源&#xff0c;既可以是虚拟的计算资源&#xff0c;如线程、进程或数据流&#xff0c;也可以是硬件资源&#xff0c;如处理器、网络连接或 ALU 单元。调…

Visual Studio2022中使用.Net 8 在 Windows 下使用 Worker Service 创建守护进程

Visual Studio2022中使用.Net 8 在 Windows 下创建 Worker Service 1 什么是 .NET Core Worker Service1.1 确认Visual Studio中安装了 ASP.NET和Web开发2 创建 WorkerService项目2.1 新建一个WorkerService项目2.2 项目结构说明3 将应用转换成 Windows 服务3.1 安装Microsoft.…

前端书籍翻页效果

目录 前端书籍翻页效果前言代码示例创建模板页面css样式编写js代码 结论 前端书籍翻页效果 前端实现翻书效果&#xff0c;附带vue源码 源码下载地址 前言 实际业务开发中&#xff0c;有时候会遇到需要在前端页面内实现翻书效果的需求&#xff0c;本篇文章就为大家介绍如何使…