消失了一段时间,我又回来啦。不多说,继续把哨兵看完。

检测主观下线状态

默认情况下,Sentinel会以每秒一次的频率向所有与他创建了命令连接的实例(主从服务器以及其他Sentinel)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。

实例对PING命令的回复可以分为两种情况:

有效回复:实例返回+PONG、-LOADING、-MASTERDOWN三种回复的其中一种。

无效回复:实例返回除+PONG、-LOADING、-MASTERDOWN三种回复之外的回复或者规定时间内没有收到任何回复。

指定Sentinel判断实例进入主观回复的时间长度是由Sentinel配置文件中的down-after-milliseconds选项指定的。

如果没有收到master服务器的回复,Sentinel就会将master标记为主观下线,并在master所对应的实例结构的flags属性中打开SRI_S_DOWN标识。

检查客观下线状态

当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的已经下线,它会向同样监视这一主服务器的其他Sentinel进行询问,看他们是否也认为主服务器已经进入下线状态,当Sentinel从其他Sentinel那里接收到足够数量的已下线判断后,Sentinel就会将主服务器判定为科幻下线,并对主服务器执行故障转移操作。

使用 SENTINEL is-master-down-by-addr < ip >< port >< current_epoch >< runid >

当目标Sentinel收到源Sentinel发来的SENTINEL命令后,解析命令中的参数并根据主服务器的ip端口号检查主服务器是否下线,然后回复源Sentinel ,< down_state >< leader_runid >< leader_epoch >

根据其他Sentinel发回的SENTINEL命令回复,统计其他SENTINEL同一主服务器已下线的数量,当这一数量达到配置指定的判断客观下线所需要的数量时,Sentinel会将主服务器实例结构flags属性的SRI_O_DOWN标识打开,标识主服务器已经进入客观下线状态。

选举头领Sentinel

当一个主服务器被判断为客观下线时,监听这个下线主服务器的各个Sentinel会进行协商,选举出一个头领Sentinel,并由头领Sentinel对下线主服务器执行故障转移操作。

1、所有在线的Sentinel都会有被选为头领Sentinel的资格,换句话说,监视同一个主服务器的多个在线Sentinel中的任何一个都有成为领头Sentinel。

2、每次进行头领Sentinel选举之后,不论选举是否成功,所有Sentinel的配置纪元的值都会自增一次,配置纪元实际上就是一个计数器。

3、在一个配置纪元所有Sentinel都有一次将某个Sentinel设置为局部头领Sentinel的机会,并且局部领头一旦设置,在这个配置纪元中就不能再次更改。

4、每个发现主服务器进入客观下线的Sentinel都会要求其他Sentinel将自己设置为局部头领Sentinel。

5、当源Sentinel向目标Seninel发送SENTINEL is-master-down-by-addr命令,并且命令中runid不是*而是源Sentinel的运行ID时,这表示源Sentinel要求目标Sentinel将自己设置为局部头领Sentinel。

6、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,那么各个Sentinel将在一段时间之后再次进行选举,直到选出头领Sentinel。

故障转移

在选举出头领Sentinel之后,头领Sentinel将对这个下线的服务器执行故障转移操作。

1、在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器。

挑选过程:

(1)删除列表中的所有处于下线或者断线状态的从服务器。

(2)删除列表中所有最近5秒内没有服务过头领Sentinel的INFO命令的从服务器。

(3)删除与已下线主服务器连接断开超过down-after-milliseconds * 10 毫秒的从服务器。

(4)按照优先级进行排序,如果优先级最高的有多台,则按照偏移量最大的排序,如果还有多台,则按照运行ID排序取运行ID最小的从服务器。

2、让已下线主服务器属下的所有从服务器改为复制新的主服务器。

发送命令SLAVEOF < 新主服务器的IP ><新主服务器的PORT>

3、将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,他就会成为新的主服务器的从服务器。


每天学一点,总会有收获。

说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。


Redis学习笔记(十六) Sentinel(哨兵)(下)的更多相关文章

  1. Redis学习笔记(六、哨兵)

    目录: 基本概念 环境部署 哨兵原理 哨兵命令 基本概念: 1.什么是哨兵 我们先从字面意思来了解哨兵,哨兵是对执行警戒任务的士兵的统称:在redis中哨兵也是一样,他监控着redis服务器的状态. ...

  2. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  3. (C/C++学习笔记) 十六. 预处理

    十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...

  4. Redis学习笔记(六) 对象

    前面我们看了Redis用到的主要数据结构,如简单动态字符串(SDS).双向链表.字典.压缩列表.整数集合等. 但是Redis并没有直接使用这些数据结构来实现键值对,而是基于这些数据结构创建了一个对象系 ...

  5. Redis 学习笔记(六)Redis 如何实现消息队列

    一.消息队列 消息队列(Messeage Queue,MQ)是在分布式系统架构中常用的一种中间件技术,从字面表述看,是一个存储消息的队列,所以它一般用于给 MQ 中间的两个组件提供通信服务. 1.1 ...

  6. Redis学习笔记(一)Windows下redis的安装和启动

    在Windows上安装redis 下载地址:https://github.com/microsoftarchive/redis/releases 选择图中红框标出来的下载,解压到磁盘上,文件夹命名为r ...

  7. MySQL学习笔记十六:锁机制

    1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...

  8. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  9. yii2源码学习笔记(十六)

    Module类的最后代码 /** * Registers sub-modules in the current module. * 注册子模块到当前模块 * Each sub-module shoul ...

  10. PHP学习笔记十六【方法】

    <?php //给一个函数传递基本数据类型 $a=90; $b=90.8; $c=true; $d="hello world"; function test1($a,$b,$ ...

随机推荐

  1. 【Jmeter学习】【第一节】【Jmeter的安装】

    转载至https://www.cnblogs.com/qinlangsky/p/11941230.html 写的非常详细

  2. 「雕爷学编程」Arduino动手做(19)—震动报警模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  3. LTC6804读写配置寄存器

    一.写配置寄存器步骤及函数封装 写配置寄存器 1.把CSB拉低至低电平: 2.发送WRCFG命令(0x00 0x01)及其PEC(0x3D 0x6E): 3.发送配置寄存器的CFGR0字节,然后继续发 ...

  4. 剑指Offer01之二维数组中查找目标数

    剑指Offer之二维数组中查找目标数 题目描述 ​ 在一个二维数组中(每个一维数组的长度相等),每一行都是从左到右递增的顺序排序,每一列都是从上到下递增的顺序排序,输入这样一个二维数组和一个整数,判断 ...

  5. Fabric进阶(二)—— 在已有组织中增加节点

    fabric网络在创建时就已经确定了初始的节点数量,而在实际应用场景中可能会需要在某个组织中动态增加节点.这里以balance-transfer v1.0为例(2 Org,4 Peer),介绍如何在o ...

  6. HDU-6393 Traffic Network in Numazu

    题意:给你一个n边n点的无向连通图,两个操作,操作一改变某个边的权值,操作二查询某两个点之间的路径长度. 题解:随便删掉环上一条边搞一棵树出来,因为两点间距离是两点各自到根的距离之和减去2*lca两点 ...

  7. [Firefox附加组件]0004.上下文菜单项

    在我们平常浏览网页是经常要对网页类容进行一些操作处理,如复制,翻译,搜索,打印打印等,今天我们就学习下如何在Firefox中我们如何通过附加组件实现这些操作. 开发步骤 1.终端窗口运行以下命令创建项 ...

  8. [PHP学习教程 - 网络]004.模拟发送HTTP请求[GET/POST](HTTP Simulator)

    引言:经常在开发期间,客户端与服务端的调试都是借助于真实的容器返回.尤其是在处理到POST时,通常刚刚入门的兄弟姐妹就一定要借助容器.今天,我们就来处理一下模拟HTTP. 本文列举了常见的四种请求方式 ...

  9. nginx配置https及Android客户端访问自签名证书

    前一篇随笔通过keytool生成keystore并为tomcat配置https,这篇随笔记录如何给nginx配置https.如果nginx已配置https,则tomcat就不需要再配置https了.通 ...

  10. 2019-ICLR-DARTS: Differentiable Architecture Search-论文阅读

    DARTS 2019-ICLR-DARTS Differentiable Architecture Search Hanxiao Liu.Karen Simonyan.Yiming Yang GitH ...