Redis系列(四):哨兵机制详解

首发博客地址

https://blog.zysicyj.top/

前面我们说过,redis采用了读写分离的方式实现高可靠。后面我们说了,为了防止主节点压力过大,优化成了主-从-从模式

思考一个问题,主节点此时挂了怎么办

alt

这里主从模式下涉及到的几个问题:

  1. 主库真的挂了吗?
  2. 我们应当选择哪个从库作为主库?
  3. 怎样让其他从库知道新的主库信息呢?
  4. 中断的数据如何恢复?

哨兵机制就完美的解决了以上问题。

什么是哨兵机制?

Redis引入哨兵(Sentinel)机制的主要目的是为了增强其高可用性和自动故障恢复能力。在分布式系统中,特别是用作数据存储的数据库系统中,保障高可用性是至关重要的,以确保系统在面对节点故障等情况时能够继续提供服务。

以下是引入Redis哨兵机制的原因:

  1. 故障检测和自动故障切换: 哨兵允许您配置多个Redis节点,并监视它们的运行状况。如果主节点(Master)出现故障,哨兵可以自动检测到并执行故障切换,将一个可用的从节点(Slave)晋升为新的主节点,从而保证服务的可用性。

  2. 自动配置更新: 当Redis节点的拓扑结构发生变化(比如添加或移除节点)时,哨兵能够自动地通知客户端和其他Redis节点进行配置更新,从而确保整个集群的正确配置。

  3. 监控和报警: 哨兵不仅监视节点的健康状态,还可以提供有关节点运行状况的信息,例如主从复制是否正常、延迟情况等。这可以帮助管理员及时发现问题并采取措施。

  4. 无需人工干预的恢复: 哨兵允许自动故障切换,这意味着当主节点出现问题时,系统可以自动将一个从节点提升为新的主节点,而无需管理员手动介入,从而缩短恢复时间。

Redis引入哨兵机制使得在分布式环境中更容易实现高可用性和故障恢复,而无需太多手动操作。哨兵机制可以确保Redis集群在节点故障时继续提供稳定的服务,对于那些对于高可用性要求较高的应用场景非常有用。

哨兵机制的基本流程

哨兵其实就是一个运行在特殊模式下的Redis进程,其随着主从实例同时运行。

那么哨兵负责哪些活呢?主要是以下三点:

  1. 监控
  2. 选主(选择主库)
  3. 通知
哨兵机制的三项任务与目标
哨兵机制的三项任务与目标

监控

Redis哨兵的监控流程涉及多个步骤,用于实时监控Redis集群中各个节点的状态并采取必要的措施来确保集群的可用性和稳定性。

  1. 节点发现和配置: 哨兵通过配置文件指定要监控的主节点和从节点。启动哨兵后,它会连接到指定的节点,并获取有关其他节点的信息,形成一个初始的监控拓扑。

  2. 心跳检测: 哨兵会定期向监控的节点发送PING命令来检测节点是否存活。这些节点可以是主节点、从节点或其他哨兵节点。如果哨兵在一定时间内没有收到响应,它会认为节点不可用。

  3. 节点状态变更: 当哨兵连续多次无法连接到一个节点时,它会将该节点标记为主观下线。当多个哨兵都将节点标记为主观下线时,这个节点会被认为是客观下线。

  4. 故障判断和选举: 当主节点被标记为客观下线时,哨兵会执行故障判断。它会从剩余的健康主节点中选举一个作为新的主节点,并将该信息广播给其他哨兵和客户端。故障判断的逻辑考虑了多个因素,包括优先级、最近一次复制偏移量等。

  5. 自动故障切换: 如果主节点被标记为客观下线,哨兵会通知从节点晋升为新的主节点。同时,哨兵会更新其他从节点的配置,使其复制新的主节点。这确保了即使主节点发生故障,集群仍然可以继续提供服务。

  6. 监控从节点: 哨兵还会监控从节点的状态,包括从节点是否与主节点保持同步,以及从节点的复制延迟情况。如果从节点无法同步或者复制延迟过高,哨兵会将其标记为不健康。

  7. 节点恢复: 如果一个节点从客观下线状态恢复,哨兵会将其标记为健康,并将其重新纳入集群中。从节点恢复后,它会重新同步主节点的数据。

  8. 配置更新: 如果集群的拓扑发生变化,例如添加或移除节点,哨兵会自动更新配置,以便客户端能够正确连接到集群。

  9. 事件通知: 哨兵通过发布订阅机制向订阅者(通常是客户端)发送有关集群状态变化的消息。这使得应用程序能够根据实时的集群状态做出相应的决策。

  10. 持续监控: 哨兵会持续地监控集群中的节点,定期执行心跳检测、状态更新和故障判断,以确保集群的稳定运行。

主观下线与客观下线

在Redis的哨兵监控机制中,有两个关键概念:主观下线(Subjective Down)和客观下线(Objective Down)。这些概念帮助哨兵判断节点的可用性和故障状态。

  1. 主观下线(Subjective Down): 主观下线是指单个哨兵节点认为一个特定的Redis节点(主节点、从节点或其他哨兵)不可用。主观下线是一种主观的判断,是基于单个哨兵节点的观察结果得出的。当一个哨兵无法连接到某个Redis节点,它会将该节点标记为主观下线。多个哨兵节点可能会对同一个节点发出主观下线标记。

  2. 客观下线(Objective Down): 客观下线是指在整个哨兵集合中达成一致,认为某个特定的Redis节点不可用。客观下线是一种更客观的判断,需要多个哨兵节点共同达成一致。当多个哨兵节点都主观下线同一个Redis节点时,这个节点会被认为是客观下线。

举例说明:

  • 假设有三个哨兵节点:Sentinel A、Sentinel B 和 Sentinel C,以及一个主节点 Master 和一个从节点 Slave。如果 Sentinel A 无法连接到 Master 节点,它会将 Master 标记为主观下线。同样地,如果 Sentinel B 也无法连接到 Master 节点,它也会将 Master 标记为主观下线。但这还不足以让 Master 被认为是客观下线。

  • 当 Sentinel A 和 Sentinel B 都主观下线了 Master 节点,并且他们相互通信时发现了这个情况,他们就会在达成一致意见后将 Master 节点标记为客观下线。这时,整个哨兵集合达成一致,认为 Master 节点已下线。

客观下线是一个更严格的判断,需要多个哨兵节点一致认为某个节点不可用,才会触发后续的故障判断和自动故障切换等动作。这种机制确保了在一个哨兵节点认为某节点下线时,不会立即触发故障切换,以避免误判造成不必要的切换。只有多个哨兵节点一致认为节点下线,才会触发后续的故障处理流程。

客观下线的判断
客观下线的判断

如何选定新主库

在Redis Sentinel模式中,当主节点(Master)发生故障导致下线后,哨兵会通过选举过程选择一个新的主节点(Master)来取代原来的主节点。选定新主库的过程如下:

  1. 主观下线和客观下线判断: 当哨兵节点主观下线(单个哨兵认为不可用)一个主节点时,如果多数哨兵都主观下线了同一个主节点,那么这个主节点会被标记为客观下线(多数派共识)。

  2. 选举新主节点: 当一个主节点被标记为客观下线后,哨兵节点会开始选举一个新的主节点。选举过程如下:

    • 哨兵会在所有没有下线的从节点(Slaves)中选择一个作为新主节点。 哨兵会选择一个延迟最小、复制偏移量最大的从节点作为新主节点。这确保了新主节点是最接近原主节点的从节点。
    • 如果没有合适的从节点,哨兵会选择一个具备最高优先级的从节点,将其升级为主节点。如果优先级相同,那么哨兵会选择一个复制偏移量最大的从节点。
  3. 故障转移和切换: 一旦新主节点被选定,哨兵会发起故障转移操作。旧主节点会变成新主节点的一个从节点。其他从节点会重新配置,指向新的主节点。这个过程会保证尽量不丢失数据,并且保证整个集群的高可用性。

选定新主库的过程是一个由哨兵节点协同工作的流程,确保了在主节点故障的情况下,尽可能地选择一个合适的从节点作为新的主节点,实现集群的高可用性和数据完整性。

新主库的选择
新主库的选择

如何配置哨兵

  1. 哨兵配置文件: 在Redis 6.x版本中,哨兵的配置文件名称默认为redis-sentinel.conf

  2. 配置变化: Redis 6.x版本引入了一些新的哨兵配置选项,以适应新的功能和改进。以下是一些常见的配置选项:

    sentinel monitor mymaster 127.0.0.1 6379 2   # 监控名为 "mymaster" 的主节点,2表示至少需要2个哨兵同意主观下线才会执行故障转移
    sentinel down-after-milliseconds mymaster 5000   # 主观下线判定为5秒无响应
    sentinel parallel-syncs mymaster 1   # 执行故障转移时同时同步的从节点数量
    sentinel failover-timeout mymaster 10000   # 故障转移超时时间为10秒
    sentinel auth-pass mymaster mypassword   # 主节点的访问密码
    
  3. 启动哨兵节点: 在Redis 6.x版本中,启动哨兵节点的命令为:

    redis-server /path/to/redis-sentinel.conf --sentinel
  4. 查看哨兵状态: 使用以下命令查看Redis 6.x版本哨兵节点的状态:

    redis-cli -p 26379
    sentinel master mymaster   # 查看主节点的信息
    sentinel slaves mymaster   # 查看从节点的信息
    sentinel sentinels mymaster   # 查看其他哨兵节点的信息

哨兵是如何互相发现的?

我们查看配置可以看到,我们并没有配置从节点的哨兵,我们只配置了主节点地址。

那么哨兵之间是如何互相发现通信的呢?

在Redis Sentinel(哨兵)集群中,哨兵节点之间通过发布订阅机制来互相发现和通信。这种方式使得哨兵节点能够监控主节点和从节点的状态,并进行故障检测和故障转移。

以下是哨兵集群如何通过发布订阅机制互相发现的工作流程:

  1. 初始连接: 在启动时,每个哨兵节点会尝试连接到指定的主节点。这些哨兵节点通过配置文件中的sentinel monitor命令指定要监控的主节点信息。

  2. Sentinel命令发布: 当一个哨兵节点成功连接到主节点后,它会开始定期向主节点发送PING命令,以确保主节点处于活跃状态。如果哨兵节点检测到主节点不可用,它会将一个+switch-master命令发布到频道中,通知其他哨兵节点。

  3. 发布订阅机制: Redis的发布订阅机制允许一个节点(发布者)向一个或多个节点(订阅者)广播消息。在哨兵集群中,每个哨兵节点都订阅了一个名为__sentinel__:hello的频道,用于接收其他哨兵节点发送的信息。alt

  4. 发现其他哨兵节点: 当一个哨兵节点成功连接到主节点后,它会向__sentinel__:hello频道发布一个"Hello"消息,其中包含它自己的信息(如IP地址和端口号)。其他哨兵节点通过订阅这个频道,可以获取所有其他哨兵节点的信息。

  5. 收集哨兵信息: 每个哨兵节点通过订阅__sentinel__:hello频道,收集到其他哨兵节点的信息。这使得每个哨兵节点都知道了集群中其他哨兵节点的存在。

  6. 故障检测和转移: 当一个哨兵节点检测到主节点不可用时,它会通过发布+switch-master命令来通知其他哨兵节点。这个命令包含了新的主节点信息,以及在执行故障转移时需要的其他信息。其他哨兵节点收到这个命令后,会进行判断并可能发起故障转移。

通过以上机制,哨兵节点可以相互发现和通信,共同监控主节点和从节点的状态,并在主节点下线时协同执行故障转移操作。这种发布订阅机制确保了哨兵集群中节点之间的实时信息传递和协作。

alt

由哪个哨兵执行主从切换?

客观下线具体判断流程

  1. 故障检测: 哨兵节点定期向集群中的所有主节点和从节点发送PING命令来检测节点的可用性。如果一个哨兵节点连续一定次数没有收到节点的回复,就会将该节点标记为可能进入客观下线状态。

  2. Quorum判断: 在判断一个节点是否客观下线时,需要考虑Quorum的概念。Quorum是指一个最小的投票数,当达到或超过这个投票数时,哨兵认为节点可能进入客观下线状态。Quorum的值通常设置为哨兵节点数量的一半加一。

  3. 投票过程: 当哨兵节点开始怀疑某个节点可能客观下线时,它会向其他哨兵节点发送一个SENTINEL is-master-down-by-addr命令,询问其他哨兵节点是否也认为该节点客观下线。其他哨兵节点会对此做出回应,根据回应的数量来判断是否达到Quorum。

  4. 达到Quorum: 如果收到的回应数量达到或超过Quorum,那么哨兵节点就会认为该节点进入客观下线状态。这表示集群中有足够多的哨兵都认为该节点可能下线,进而触发后续的主从切换流程。

  5. 执行后续操作: 一旦一个节点被认为客观下线,哨兵节点将开始执行故障转移操作,选择新的主节点并开始同步数据。这将最终导致一个新的主节点被选出,从而实现高可用性。 alt

选举Leader流程

Redis Sentinel(哨兵)是用于监控和管理Redis主从复制以及自动故障切换的工具。当主节点失效时,哨兵会协调选择一个从节点作为新的主节点,这涉及到选举Leader的过程。详细流程如下:

  1. 监控主节点: 哨兵持续监控Redis主节点的状态,包括主节点是否在线,主从复制是否正常,以及哨兵和其他节点的通信情况。

  2. 检测主节点失效: 当哨兵检测到主节点失效(例如,无法响应PING命令),它会将主节点标记为“主观下线”。

  3. 广播主观下线状态: 一旦主观下线状态被确认,哨兵会广播该信息给其他哨兵和节点,告知主节点已经“主观下线”。

  4. 投票: 当其他哨兵收到关于主观下线状态的广播时,它们会进行投票来决定是否需要进行领导者选举。

  5. 选举Leader: 如果多个哨兵都认为主节点失效,它们将进入领导者选举过程。选举过程使用了Raft算法的变体。

  6. 提议投票: 在选举过程中,哨兵会提议自己作为领导者,然后请求其他哨兵投票支持。

  7. 投票表决: 哨兵在收到提议后会表决是否支持该提议。通常,哨兵会投票给具有最高配置版本号的提议者。

  8. Quorum判断: 在选举过程中,哨兵需要收集足够数量的投票,达到Quorum(大多数)的支持才能选举成功。

  9. 选出新领导者: 如果某个哨兵获得足够多的投票,超过了Quorum,那么它将被选为新的领导者。

  10. 通知其他节点: 新选出的Leader会向其他哨兵和节点广播其成为领导者的消息,确保集群中的所有节点都知道领导者的变更。

  11. 故障切换: 一旦新的Leader选举完成,哨兵会协调进行故障切换,将一个从节点提升为新的主节点,使整个集群继续正常运行。

  12. 恢复正常状态: 一旦故障切换完成,新的主节点将开始处理客户端请求,集群会恢复到正常运行状态。

需要注意的是,Redis Sentinel的选举Leader过程受到Paxos算法和Raft算法等分布式一致性算法的影响,以保证在主节点失效时能够选择合适的节点作为新的主节点,从而保持数据的一致性和高可用性。

alt

TIP

  1. 如果哨兵集群只有 2 个实例,此时,一个哨兵要想成为 Leader,必须获得 2 票,而不是 1 票。所以,如果有个哨兵挂掉了,那么,此时的集群是无法进行主从库切换的。因此,通常我们至少会配置 3 个哨兵实例。

  2. 要保证所有哨兵实例的配置是一致的,尤其是主观下线的判断值 down-after-milliseconds。

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp6.0 配合shell 脚本 定时任务

1. 执行命令&#xff0c;生成自定义命令 php think make:command Custom<?php declare (strict_types 1);namespace app\command;use app\facade\AdmUser; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\i…

操作系统-笔记-第四章-文件管理

目录 四、第四章——文件管理 1、文件管理——基础概念 &#xff08;1&#xff09;文件结构 &#xff08;2&#xff09;操作系统提供的接口 &#xff08;3&#xff09;总结 2、文件的逻辑结构 &#xff08;1&#xff09;有结构文件&#xff08;类似SQL表文件&#xff09…

无涯教程-PHP - preg_match()函数

preg_match() - 语法 int preg_match (string pattern, string string [, array pattern_array], [, int $flags [, int $offset]]]); preg_match()函数在字符串中搜索pattern&#xff0c;如果存在pattern&#xff0c;则返回true&#xff0c;否则返回false。 如果提供了可选…

Pandas学习(完成文件写入、追加写入、读取操作)

问题引入 现在有这么一个需求 我要对我的很多设备进行快照处理&#xff0c;打完快照之后需要记录我的设备IP和快照时间 当我们解决了需求的其他内容&#xff0c;只剩记录信息的时候&#xff0c;可以怎么做呢 这时候就可以引入我们的pandas模块啦&#xff0c;它对数据进行一系列…

Java【HTTP】什么是 Cookie 和 Session? 如何理解这两种机制的区别和作用?

文章目录 前言一、Cookie1, 什么是 Cookie2, Cookie 从哪里来3, Cookie 到哪里去4, Cookie 有什么用 二、Session1, 什么是 Session2, 理解 Session 三、Cookie 和 Session 的区别总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; …

开源在线图片设计器,支持PSD解析、AI抠图等,基于Puppeteer生成图片

Github 开源地址: palxiao/poster-design 项目速览 git clone https://github.com/palxiao/poster-design.git cd poster-design npm run prepared # 快捷安装依赖指令 npm run serve # 本地运行将同时运行前端界面与图片生成服务(3000与7001端口)&#xff0c;合成图片时…

【C语言学习】指针变量

一、运算符& 1.&运算符可以获得变量的地址&#xff0c;它的操作数必须是变量 int i; printf("%x",&i);2.地址的大小是否与int相同取决于编译器 int i; printf("%p",&i);//%p以32进制输出i的地址二、指针变量 指针变量是保存地址的变量…

JavaWeb+JSP+SQL server学生学籍管理系统设计与实现(源代码+论文+开题报告+外文翻译+答辩PPT)

需求分析 本系统主要是针对各个高校的学生学籍进行管理&#xff0c;系统满足以下几点要求&#xff1a; 系统安全性。由于此系统中的操作都是由用户操作的&#xff0c;所以对于用户的权限设置比较严格。对于数据库&#xff0c;设置了不同用户的权限&#xff0c;不同权限进入不…

【并发编程】详解并发编程中Synchronized的特性(可见性、有序性、可重入性、禁止指令重排序)(๑•̀ㅂ•́)و✧

1、synchronized 禁止指令重排分析 我们先看如下代码&#xff1a; class MonitorExample {int a 0;public synchronized void writer() { //1a; //2} //3public synchronized void reader() { //4int i …

[虚幻引擎] UE使用虚拟纹理在模型上显示挖空效果

此教程是记录如在UE中使用虚拟纹理&#xff0c;实现模型挖洞的效果。 1. 新建项目&#xff0c;开启项目支持虚拟纹理并并重启。 2. 新建一个基础关卡 3. 拖动“运行时虚拟纹理体积” 进入场景&#xff0c;并把体积修改变大&#xff0c;以可以完全包括到地板。 4. 创建一个虚拟纹…

记一次从Redis弱口令到RCE

Fscan扫描网段发现了一些开启了6379的服务器&#xff0c;逐个尝试了下未授权&#xff0c;然后尝试了下爆破 hydra爆破redis hydra -P [字典目录] redis://xxx.xxx.xxx.xxx结果还真让爆出来一个 得到密码后&#xff0c;连接上去&#xff0c;这里用的是Another Redis Desktop M…

FastDFS与Nginx结合搭建文件服务器,并实现公网访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

【嵌入式】MKV31F512VLL12 微控制器 (MCU) 、Cyclone® IV E EP4CE10E22I8LN,FPGA-现场可编程门阵列芯片

1、MKV31F512VLL12 微控制器 (MCU) 是适用于BLDC、PMSM和ACIM电机控制应用的高性能解决方案。这些MCU采用运行频率为100MHz/120MHz、带数字信号处理 (DSP) 和浮点单元 (FPU) 的ARM Cortex-M4内核。KV3x MCU配备两个采样率高达1.2MS/s的16位ADC、多个控制定时器以及512KB闪存。 …

Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点

使用Element的组件Table表格&#xff0c;当使用树形数据再配合上多选框&#xff0c;如下&#xff1a; 会出现一种问题&#xff0c;点击左上方全选&#xff0c;只能够选中一级树节点&#xff0c;子节点无法被选中&#xff0c;如图所示&#xff1a; 想要实现点击全选就选中所有的…

【HarmonyOS】服务卡片 API6 JSUI跳转不同页面

【引言】 “JS卡片支持为组件设置action&#xff0c;包括router事件和message事件&#xff0c;其中router事件用于应用跳。若设置router事件&#xff0c;则action属性值为"router"&#xff1b;abilityName为卡片提供方应用的跳转目标Ability名&#xff1b;params中的…

stm32的命令规则

stm32型号的说明&#xff1a;以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a;

面试题-React(三):什么是JSX?它与常规JavaScript有什么不同?

在React的世界中&#xff0c;JSX是一项引人注目的技术&#xff0c;它允许开发者在JavaScript中嵌套类似HTML的标签&#xff0c;用于描述UI组件的结构。本篇博客将通过丰富的代码示例&#xff0c;深入探索JSX语法&#xff0c;解析其在React中的用法和优势。 一、JSX基础语法 在…

陕西广电 HG6341C FiberHome烽火 光猫获取超级密码 改桥接模式 提升网速

光猫默认的路由模式实测在100M宽带下只能跑到60M左右&#xff0c;只有改成桥接模式才能跑满&#xff0c;不损失性能。但是改桥接需要给运营商打电话&#xff0c;有的时候不想麻烦他们&#xff0c;这时获取超级密码进行更改就是一个不错的选择了 分析 之前写了一篇HGU B2 光猫的…

触摸屏与PLC之间 EtherNet/IP无线以太网通信

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;用触摸屏集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大耽误工期&#xff0c;这种情况下比较适合采用无线通信方式。 本方案以MCGS触摸屏和…

IO流笔记

文件基础知识 创建文件 package org.example; import org.junit.Test;import java.io.File; import java.io.IOException;public class FileCreate{public static void main(String[] args) {}Test//方式1&#xff1a;new File(Strin pathname)public void create01(){File fil…