Redis集群-哨兵模式

Sentinel(哨岗、哨兵)是Redis的主从架构的高可用性解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)监视任意多个Redis主节点,以及这些主节点下的所有从节点,当主节点进入下线状态时,自动将该主节点的从节点晋升为主节点,然后由新的主节点继续处理命令请求,从而达到高可用的目的。

在学习Redis的哨兵模式的时候,有几个问题必须要搞清楚:1.主节点是不是真的发生了故障,有没有可能发生误判?如何降低误判?2.主节点挂机,有多个从节点,选择哪一个从节点呢?3.谁负责将从节点变更为主节点?4.主节点信息变更后,如何在集群内保持数据的一致性?5.客户端如何感知到主节点信息的变更?6.故障转移的整体流程是如何进行的?7.哨兵本质上也是一个Redis实例,如果哨兵自己故障了,会如何?

1.主节点故障还是误判?

哨兵对监控主节点会定期的向主节点发送PING命令获取主节点的状态,如果迟迟获取不到该主节点信息就会认为该主节点可能发生了故障【主观下线】,进而通过 sentinel:hello通道向其他哨兵节点发送信息。其他哨兵节点从该通道获取到信息之后,就会向主节点发送PING命令,进行再次验证,如果多个哨兵节点都无法联系到该主节点,该主节点被认定是发生了故障【客观下线】。当然不论是主节点还是从节点,哨兵都会对其进行监控,一旦发现主观下线就标记为SDOWN,主观下线则标记为ODOWN。
主观下线:单个Sentinel 实例对主节点做出的下线判断;
客观下线:多个 Sentinel 实例在对同一个主节点做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的主节点下线判断。 (一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的节点已下线。)

要判断一个主节点是否真的发生了故障,就必须要依靠集群内一定数量的一致认同,这个阈值是由配置文件quorum设定。而如果想要降低除了从网络方面着手(保持网络的畅通),另一个就是增加这个阈值,那么误判的几率就会更小了。但是如果调大客观下线的阈值,有可能会造成故障发现的延迟,从而导致故障时间变长。

2.从节点的选择

当主节点发生了客观下线之后,需要将从节点中选举一个成为新的主节点。如果被选择的从节点本身时故障的,那么进行故障转移是没有实际意义的;如果被选中的从节点数据的同步太小,那么晋升之后就会丢多较多的数据;除此之外,每一个从节点所在的服务器资源可用情况也可能不大一样,如果选择到一些可用资源较差的节点,那么故障转移后Redis的处理能力就会受到较大的影响。基于此,哨兵在选择从节点的时候,必须满足该节点是非故障[非下线]的,优先考虑从节点配置的优先级【slave-priority】;最后考虑复制的进度【slave_repl_offset数据偏移量最大】。

3.从节点变更为主节点

当哨兵发现主节点已经客观下线的时候,哨兵会向其他哨兵节点发起投票,让自己成为这次故障转移的负责人,这个过程也叫作Leader选举。

纪元:每次发生Leader选举,不论是否成功都会自增的计数器,防止选举信息因网络拥塞导致的重放问题;
候选者:所有哨兵节点都可以参与选举;
局部Leader:已获得其他哨兵节点的候选者【哨兵】;
纪元内单票:在单个纪元内,所有的候选者只有一张票,并且只能进行一次投票,先到先得;
竞选过程:1.哨兵节点【也称源节点】发现主节点客观下线,立刻在一个随机的时间内向其他哨兵节点【也称目标节点】发送请求成为Leader;2.目标节点获取到该请求后,查看该主节点转台,如果下线则且没有在当前这个纪元进行投票,则立刻回复源节点的的runid【局部Leader】和当前纪元,如果已投票则直接回复已投票的哨兵节点的runid已经纪元;3.源节点接收到目标节点的恢复,判断runid与纪元是否与自己的runid和纪元一致,如果一致则说明已获得该节点的票数,如果不是则说明未获得该节点的票数;4.当源节点获得到max(quorum, num(sentinel)/2+1)的票数后,则成为当前纪元的Leader。如果在给定的时间内没有一个节点成为Leader,则会开启下一轮的选举,知道选出Leader。

Redis集群-哨兵模式

当Leader被选举出来后,会选择最适当的从节点[非下线、优先级最后、数据同步进度最大]作为新的主节点,向其发送slave on one命令成为主节点,并发送slaveof

4.集群内数据的一致性交互

哨兵中的所有信息并不是由Leader处理完成后在统一更新,而是由每个哨兵在向各个主从内的各个节点信息发送PING命令后获取到的信息来实时更新,以及通过固定的几个频道获取到新的信息从而达到数据的一致。

5.客户端如何感知主节点信息的变更?

对于信息的变更无论是从客户端的角度还是服务的角度,无非就是两种,一种是客户端主动向集群进行轮训,获取到最新的集群信息,另外一种就是等待集群通知客户端集群信息发生变更,这个方式也称之为被动方式。
主动方式:轮训意味着,客户端必须要按照一定的时间间隔不停的向集群发起()信息查询。与集群信息不一致的时间取决于轮训的间隔时间,如果间隔时间设置太小也会导致客户端的频繁轮训,白白消耗资源。
被动方式:由集群内部发出一个集群信息变更事件,客户端在获取到该事件【回调/轮训】后,立刻向集群发起信息的同步,然后再与新主节点建立连接。这种方式的优点是感知比较快。
所以无论是哪种方式都是需要客户端自己做适配

6.故障转移(failover)的整体流程

7.哨兵宕机了,还能不能进行故障转移

要完成故障转移与哨兵集群有关的主要有两点:1.完成对主节点的客观下线;2.进行Leader选举负责完成故障转移。如果这两个点关键点都可以完成,那么故障转移就仍然可以继续完成。实际上要完成对主节点的客观下线,只需要有quorum个哨兵完成对主节点的下线投票,而并非由多少个哨兵决定,所以只要保证哨兵集群中至少有quorum个哨兵就可以完成对主节点的客观下线。另外一个问题,要完成故障转移就必须要完成Leader的选举,而Leader选举的票数为max(quorum, num(sentinel)/2+1),即是说要完成Leader的选举就必须保证能正常工作的哨兵必须是集群中的过半数才行。综上所述,假设现在有7个哨兵组成一个集群,quorum配置为3,如果有4个哨兵发生了故障,则可以完成对主节点的客观下线的判定,但是无法完成故障转移,因为Leader无法被选举出来。
实际上生产环境中会更多的将quorum配置为集群的过半数,如果哨兵集群一般也会控制在3至5个节点。如果需要监控多个主节点,则会考虑使用单独的哨兵进行监控。

Original: https://www.cnblogs.com/zhenjungan/p/16519307.html
Author: zhenjungan
Title: Redis集群-哨兵模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581874/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 魔域来了H5游戏详细图文架设教程

    前言 想体验热血传奇的战场吗?想体验满级VIP的尊贵吗?想体验榜一大佬的无敌寂寞吗?各种极品炫酷时装、坐骑、翅膀、宠物通通给你,就在魔域来了H5! 本文讲解魔域来了架设教程,想研究…

    Linux 2023年6月7日
    0117
  • Linux 0.11源码阅读笔记-高速缓冲

    高速缓冲 概念 高速缓冲区是内存中的一块内存,它充当块设备和内核中其他程序之间的桥梁。如果内核程序需要访问块设备中的数据,则需要通过高速缓冲区进行间接操作。 [En] The hi…

    Linux 2023年5月27日
    078
  • Linux防火墙——iptables简介

    一、防火墙相关概念 这里描述了一些相关的概念。 [En] Some related concepts are described here. 从逻辑上讲,防火墙可以分为主机防火墙和…

    Linux 2023年5月27日
    0103
  • 你还有什么问题吗?

    在面试过程中,一般都会有一个固定环节,那就是在临近结束时,面试官会问求职者: 你还有什么问题吗? 其实,这是一个很好的了解公司,了解未来团队的机会,但很多求职者却不知道问什么,或者…

    Linux 2023年6月7日
    0110
  • VMware ESXi 7.0 U2 SLIC 2.6 & Unlocker 集成 Intel NUC 网卡、USB 网卡和 NVMe 驱动

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    088
  • 真·Android Zxing 扫码中文乱码解决

    Zxing3.2.1 之前遇到过Android Zxing扫码乱码的问题,网上搜了下解决了下。 今天又遇到了问题。 依然会乱码。 研究总结如下: Zxing 可以在Hints中添加…

    Linux 2023年6月13日
    081
  • linux 普通分区与lvm分区

    安装linux系统时 有时候会提示lvm分区与标准分区 首先普及一下lvm分区:lvm是 logical volume manager (逻辑卷管理),linux环境下对磁盘分区的…

    Linux 2023年5月27日
    0105
  • Java实现链表

    3、链表 MyLinkedList 有一个头指针,一个尾指针,还有链表长度size 内有两个类,一个是实现了Iterator接口的迭代器类,另一个是Node类,其中Node数据结构…

    Linux 2023年6月14日
    094
  • Java秒杀系统二:Service层

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0102
  • gitlab备份迁移与升级

    bash;gutter:false; 升级计划: https://docs.gitlab.com/ee/update/index.html#upgrade-paths</p&…

    Linux 2023年6月7日
    073
  • vscode shellArgs.windows参数如何设置使得powershell终端字符集编码为UTF-8?

    网上的大部分是这个答案: “terminal.integrated.shellArgs.windows”: [“-NoExit”, “/c”, “chcp 65001”] 如果你觉…

    Linux 2023年6月13日
    098
  • GCC编译C:C++的四个过程

    从源码到可执行程序,经历四个过程: 预处理、编译、汇编和链接,前三步由使用编译器来完成、链接由链接来完成。 编译器将编译工作主要分为预处理,编译和汇编三部 连接器的工作是把各个独立…

    Linux 2023年6月13日
    068
  • JavaScript 的闭包(closure)

    关于JavaScript 的闭包(closure)的笔记 以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」 https://www.cnblogs.c…

    Linux 2023年6月6日
    0121
  • docker使用

    1 docker介绍,跟传统虚拟机的比较 2 docker架构图 3 docker安装 3.1 windows安装 3.2 乌班图 3.3 centos上安装(必须7.0以上) 3…

    Linux 2023年6月14日
    081
  • [20211215]提示precompute_subquery补充.txt

    [20211215]提示precompute_subquery补充.txt –//前几天测试precompute_subquery,我仔细想一下好像以前看书或者别人的b…

    Linux 2023年6月13日
    073
  • 使用github action发布hexo博客到云服务器

    > node -v v16.15.0 > npm -v 8.5.5 安装Hexo CLI &#x5728;&#x4F60;&#x7684;&am…

    Linux 2023年6月7日
    0108
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球