Redis中的Sentinel(六)

Sentinel

选举领头Sentinel.

当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头
Sentinel对下线主服务器执行故障转移操作。以下是Redis选举领头Sentinel的规则和方法:

  • 1.所有在线的Sentinel都由被选为领头Sentinel的资格,换句话说,监视同一个主服务器的多个在线Sentinel中的任意一个都有可能成为领头Sentinel。
  • 2.每次进行领头Sentinel选举之后,不论选举是否成功,所有Sentinel的配置纪元(configuration epoch)的值都会自增一次。配置纪元实际上就是一个计数器,并没有什么特别的。
  • 3.在一个配置纪元里面,所有的Sentinel都有一次将某个Sentinel设置为局部领头Sentinel的机会,并且局部领头一旦设置,在这个配置纪元里面就不能再更改。
  • 4.每个发现主服务器进入客观下线的Sentinel都会要求其他Sentinel将自己设置为局部领头Sentinel
  • 5.当一个Sentinel(源Sentinel)向另一个Sentinel(目标Sentinel)发送SENTINEL is-master-down-by-addr命令,并且命令中的runid不是*符号而是源Sentinel的运行ID时,这表示源Sentinel要求目标Sentinel将前者设置为后者的局部领头Sentinel
  • 6.Sentinel设置局部林构图Sentinel的规则是先到先得:最先向目标Sentinel发送设置要求的源Sentinel将成为目标Sentinel的局部领头Sentinel,而之后接收到的所有设置要求都会被目标Sentinel拒绝
  • 7.目标Sentinel在接收到SENTINEL is-master-down-by-addr命令之后,将向源Sentinel返回一条命令回复,回复中的leader_runid参数和leader_epoch参数分别记录了目标Sentinel的局部领头Sentinel的运行ID和配置纪元
  • 8.源Sentinel在接收到目标Sentinel返回的命令回复之后,会检查回复中的leader_epoch参数的值和自己的配置纪元是否相同,如果相同的话,那么源Sentinel继续取出回复中的leader_runid参数,如果leader_runid参数的值和源Sentinel的运行ID一直,那么表示目标Sentinel将源Sentinel设置成了局部领头Sentinel
  • 9.如果有某个Sentinel被半数以上的Sentinel设置成了局部领头Sentinel,那么这个Sentinel成为领头Sentinel。举个例子,在一个由
    10个Sentinel组成的Sentinel系统里面,只要有大于等于10/2+16个Sentinel将某个Sentinel设置为局部领头Sentinel,那么被设置的那个Sentinel就会成为领头Sentinel
  • 10.因为领头Sentinel的产生需要半数以上Sentinel的支持,并且每个Sentinel在每个配置纪元里面只能设置一次局部领头Sentinel,所以在一个配置纪元里面,只会出现一个领头Sentinel
  • 11.如果在给定时限内,没有一个Sentinel被选举出领头Sentinel,那么各个Sentinel将在一段时间之后再次进行选举,直到选出领头
    Sentinel为止

例子

  • 举个例子。
    假设现在有三个Sentinel正在监视同一个主服务器,并且这三个Sentinel之前已经通过SENTINEL is-master-down-by-addr命令确认主服务器进入了客观下线状态,如图所示,那么为了选出领头Sentinel,三个Sentinel将再次向其他Sentinel 发送SENTINEL is-master-down-by-addr
    命令。如图所示。和检测客观下线状态时发送的SENTINEL is-master-down-by-addr命令不同,Sentinel这次发送的命令会带有Sentinel自己的运行ID,例如
SENTINEL is-master-down-by-addr 127.0.0.1 6379 0 a5bd47a1e569ed14567eca650de57f9d83301638

如果接收到这个命令的Sentinel还没有设置局部领头Sentinel的话,他就会将运行ID为a5bd47a1e569ed14567eca650de57f9d83301638的sentinel设置为自己的局部领头Sentinel,并返回类似以下的命令回复

1.1
2.a5bd47a1e569ed14567eca650de57f9d83301638
3.0

然后接收到命令回复的Sentinel就可以根据这一回复,统计出有多少个Sentinel将自己设置成了局部领头Sentinel.根据命令请求发送的先后顺序不同,可能会有某个Sentinel的SENTINEL is-master-down-by-addr命令比起其他Sentinel发送的相同命令都更快到达,并最终胜出领头Sentinel的选举,然后这个领头Sentinel就可以开始对主服务器执行故障转移操作了
在这里插入图片描述
在这里插入图片描述

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-11 15:14:07       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-11 15:14:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-11 15:14:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-11 15:14:07       18 阅读

热门阅读

  1. 缓存、分布式缓存、缓存的风险

    2024-04-11 15:14:07       14 阅读
  2. Linux下的链接文件

    2024-04-11 15:14:07       14 阅读
  3. linux SSH 服务管理命令

    2024-04-11 15:14:07       10 阅读
  4. 清空nginx缓存并强制刷新

    2024-04-11 15:14:07       10 阅读
  5. Bash 编程精粹:从新手到高手的全面指南之变量

    2024-04-11 15:14:07       13 阅读
  6. [Linux][shell][权限] shell原理简介 + 权限细节笔记

    2024-04-11 15:14:07       12 阅读
  7. 知识碎片随手记-1

    2024-04-11 15:14:07       13 阅读
  8. c# 实现Quartz任务调度

    2024-04-11 15:14:07       15 阅读
  9. MySQL:统计总条数时去重

    2024-04-11 15:14:07       14 阅读
  10. python时间&内存计算

    2024-04-11 15:14:07       12 阅读
  11. 自动驾驶涉及相关的技术

    2024-04-11 15:14:07       14 阅读
  12. 死锁以及如何避免死锁

    2024-04-11 15:14:07       15 阅读
  13. 如何理解JVM

    2024-04-11 15:14:07       14 阅读
  14. Spring之事务底层源码解析

    2024-04-11 15:14:07       13 阅读
  15. CSS 选择器 – 类、名称、子选择器

    2024-04-11 15:14:07       14 阅读