redis 系列24 哨兵Sentinel (中)
四. 检测下线状态
对于Redis的Sentinel中关于下线有两个不同的概念:(1)主观下线(Subjectively Down, 简称 Sdown) 指的是单个 Sentinel 实例对服务器做出的下线判断,此时不会进行故障转移。(2) 客观下线(Objectively Down, 简称 Odown)指的是多个 Sentinel 实例在对同一个服务器做出 Sdown 判断,此时目标sentinel会对主服务器进行故障转移。本篇具体详细介绍。
4.1 检测主观下线状态
默认情况下,Sentinel会以每秒一次的频率向所有与它创建命令连接的实例(包括主、从、其他sentinel在内)发送ping命令,并通过实例返回的ping命令回复来判断实例是否在线。例如:有二个sentinel服务,共同监视一主二从的redis服务。(1) sentinel服务将向sentine2、主服务master、从服务slave1和slave2发送ping命令。(2) sentine2服务将向sentine1、主服务master、从服务slave1和slave2发送ping命令。实例对于ping命令的回复可以分为两种情况:
(1) 有效回复: 实例返回 +pong 、 -loading、 -masterdown三种回复的其中一种。
(2)无效回复: 实例返回上面三种回复之处的其它回复,或者在指定时限内没有返回任何回复。在Sentinel.conf配置文件中的down-after-milliseconds选项指定了Sentinel判断实例进入主观下线所需的时间长度。
4.1.1主观下线时长选项的作用范围
用户设置down-after-milliseconds选项的值,不仅会被sentinel用来判断主服务器的主观下线状态,还会被用于判断主服务器下的所有从服务器,以及同样监视主服务器的其他sentinel的主观下线状态。
-- 例如用户向sentinel设置以了下配置:
sentinel monitor master 127.0.0.1
sentinel down-after-milliseconds master
这里的master是主服务器的名称, 端口默认6379 ,2代表sentinel集群中有2个sentinel认为master 状态下线时,才能真正认为该master已经不可用了(也就是客观下线,下面会讲)。这50000毫秒不仅会成为sentinel判断master进入主观下线的标准,还会判断所有从库、其它sentinel进入主观下线的标准。
4.1.2 多个sentinel设置的主观下线时长可能不同
对于多个sentinel共同监视同一个主服务器时,这些sentinle在配置文件sentinle.conf中所设置的down-after-milliseconds值也可能不同,因此当一个sentinel将主服务器判断为主观下线时,其它sentinel可能仍然会认为主服务器处于在线状态。只有全部的sentine都判断进入了主观下线状态时,才会认为主master进入了主观下线状态。
4.2 检查客观下线状态
当sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真要下线,会向同样监视这一主服务器的其它sentinel进行询问,其它sentinel回复已下线之后,sentinel就会将主服务器从主观判定为客观下线,并对主服务器执行故障转移操作。客观下线条件只适用于主服务器。
客观判断是:sentinel向其它sentinel发送sentinel is-master-down-by-addr命令进行互相交流之后,得出主服务器下线判断。 只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。
4.2.1 is-master-down-by-addr命令用来判断是否客观下线
命令格式:sentinel is-master-down-by-addr ip port current runid
分别代表主观下线的主服务器ip址址,端口号, sentinel当前的配置纪元用于选举领头羊sentinel, runid可以是*或者sentinel的运行ID。
--例如一个sentinel向其它sentinel发送以下命令:
sentinel is-master-down-by-addr 127.0.0.1 *
最后一个参数:*代表命令仅仅用于检测主服务器客观下线状态。而sentinel的运行ID则用于选举领头羊。当接收的sentinel收到其它sentinel回复的命令时,会取出命令中包含的参数,来检查主服务器是否已下线,然后向源sentinel返回一条信息。该信息包括三个参数:
(1) down_state: 检查主服务器的结果,1代表已下线,2代表未下线。
(2) leader_runid: 如果是* 用于检测主服务器下线状态。如果是runid则是局部领头sentinel的运行ID,用于选举领头sentinel。
(3) leader_epoch: 目标sentinel的局部领头sentinel的配置纪元。
例如返回: 1 * 1 。说明其它sentinel也同意主服务器下线。接收sentinel将统计其他sentinel同意主服务器下线的数量,当这一数量达到配置指定的数量时,就会客观下线,进行故障转移。
例如: sentinel monitor master 127.0.0.1 6379 2 配置是指包括当前sentinel在内,只要总共有两个sentinel 服务认为主服务器已经进入下线状态,那么当前sentinel就将主服务器判断为客观下线。
五. 选举领头sentinel
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个sentinel会进行协商,选择出一个领头sentinel,并由领头sentinel对下线主服务器执行故障转移操作,关于Redis选举领头sentinel规则和方法就不在述说,请看"redis设计与实现"书籍。
六.故障转移
选举产生领头sentinel之后,领头sentinel将对已下线的主服务器执行故障转移,操作包括三个步骤:
(1) 在已下线的主服务器属下的所有从服务器中,挑选出一个从服务器,并将其转换为主服务器。挑选是经过了严格的一项一项的过滤(如过滤从库下线的,5秒内没有回复领头sentinel的info命令的,与以下线的主服务器连接断开超过down-after-milliseconds *10 毫秒的。这些通通都删除),之后选出最优的从服务器。向这个从服务器发送slaveof no one命令,将这个从服务器转换为主服务器。
(2) 让已下线主服务器属下的所有从服务器改为复制新的主服务器。领头sentinel向已下线的主服务和所有从服务器(除了新的主服务)发送slaveof 命令,让它们复制新的主服务器。
(3) 将已下线的主服务器设置为从服务器。当已下线的主服务器重新上线时,sentinel就会向它发送slaveof命令,让它成为从服务。
七 sentinel上下二篇原理总结:
对于sentinel的高可用,用了二篇来介绍了sentinel服务、主服务、从服务、其它sentinel服务的原理关系。知识点比较多,下面再总结下:
(1) sentinel只是一个运行在特殊模式下的redis服务器,它使用了和普通模式不同的命令表,以及区别与普通模式下使用的命令不同。
(2) sentinel会读入指定的配置文件(sentinel.conf),为每个要监视的主服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接,其中命令连接用于向主服务器发送命令请求,订阅连接则用于接收指定频道的消息。
(3) sentinel通过向主服务器发送info命令来获得主服务器属下所有从服务器的地址信息,并为这些从服务器创建相应的实例结构,以及连向这些从服务器的命令连接和订阅连接。
(4) 一般情况下,sentinel以每10秒一次的频率向被监视的主服务器和从服务器发送info命令,当主服务器处于下线状态,或者sentinel正在对主服务器进行故障转移操作时,sentinel向从服务器发送info命令的频率会改为1秒一次。
(5)对于监视同一个主服务器和从服务器的多个sentinel来说,它们会以每2秒一次的频率,通过向被监视的_sentinel_:hello频道发送消息来向其他sentinel宣告自己的存在。
(6)每个sentinel也会从_sentinel_:hello中频道中接收其他sentinel发来的信息,并根据这些信息为其他sentinel创建相应的实例结构,以及命令连接。
(7) sentinel只会与主服务器和从服务器创建命令连接和订阅连接,sentinel与sentinel之间则只创建命令连接。
(8) sentinel以每秒一次的频率向实例(包括主,从,其它sentinel)发送ping命令,并根据实例对ping命令的回复来判断实例是否在线,当一个实例在指定的时长中连续向sentinel发送无效回复时,sentinel会将这个实例判断为主观下线。
(9)当sentinel将一个主服务器判断为主观下线时,它会向同样的监视这个主服务器的其他sentinel进行询问,看它们是否同意这个主服务器已经进入主观下线状态。
(10)当sentinel收集到足够多的主观下线投票之后,它会将主服务器判断为客观下线,并发起一次针对主服务器的故障转移操作。
redis 系列24 哨兵Sentinel (中)的更多相关文章
- redis 系列25 哨兵Sentinel (高可用演示 下)
一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS 7.4.1708 IP地址 172.168.18.200 网关Gateway 1 ...
- redis 系列23 哨兵Sentinel (上)
一.概述 Sentinel(哨岗或哨兵)是Redis的高可用解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主 ...
- Redis 主从、哨兵Sentinel、Jedis
Redis 主从.哨兵Sentinel.Jedis 2017年02月15日 15:52:48 有且仅有 阅读数 6183 文章标签: redis主从sentineljedis 更多 分类专栏: 7/1 ...
- redis系列--深入哨兵集群
一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...
- redis系列:哨兵
1 简介 Sentinel(哨兵)是Redis 的高可用性解决方案:通过哨兵可以创建一个当主服务器出现故障时自动将从服务器升级为主服务器的一个分布式系统.解决了主从复制出现故障时需要人为干预的问题. ...
- Redis系列五 - 哨兵、持久化、主从
问:骚年,都说Redis很快,那你知道这是为什么吗? 答:英俊潇洒的面试官,您好.我们可以先看一下 关系型数据库 和 Redis 本质上的区别. Redis采用的是基于内存的,采用的是单进程单线程模型 ...
- 【目录】redis 系列篇
随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...
- Redis系列(2)之数据类型
Redis系列(2)之数据类型 <Redis系列(1)之安装>中介绍了Redis支持以下几种数据类型,那么本节主要介绍学习下这几种数据类型的基本操作 字符串类型,string 散列类型,h ...
- Redis系列4:高可用之Sentinel(哨兵模式)
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 1 背景 从第三篇 Redis系列3:高可用之主从架构 ,我们知道,为Re ...
随机推荐
- 蓝桥杯 黄金连分数(BigDecimal的使用)
标题: 黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜 ...
- Linux中目录以及路径问题
具体参考:https://www.cnblogs.com/OctoptusLian/p/8546580.html 在Linux中,存在着绝对路径和相对路径 绝对路径:路径的写法一定是由根目录 / 写起 ...
- B站资源索引
自从搭建了B站的监控之后,就收集了一堆up主,下面分类整理一下,排名不分先后,内容会持续更新……2019-4-10 19:04:08 一.酷玩&装机&开箱 1.AS极客 2.Virtu ...
- 关于最小生成树,拓扑排序、强连通分量、割点、2-SAT的一点笔记
关于最小生成树,拓扑排序.强连通分量.割点.2-SAT的一点笔记 前言:近期在复习这些东西,就xjb写一点吧.当然以前也写过,但这次偏重不太一样 MST 最小瓶颈路:u到v最大权值最小的路径.在最小生 ...
- Django网站制作根目录,巧用404,可访问根目录任意网页
原文链接:http://www.bianbingdang.com/article_detail/106.html 在制作网页过程中,网站需要格式各样的验证.比如百度站长.搜狗联盟的校验网站.不止如此, ...
- MYSQL必知必会学习笔记
8.1.1 百分号( %)通配符最常使用的通配符是百分号( %).在搜索串中, %表示任何字符出现任意次数.例如,为了找出所有以词jet起头的产品,可使用以下SELECT语句:SELECT prod_ ...
- VMware ESXi 6.5 安装
1.1下载esxi镜像 此处我使用的版本是:VMware-VMvisor-Installer-6.5.0-4564106.x86_64 1.2新建一个虚拟机,硬件兼容性处选择ESXI6.5 硬盘40g ...
- 详解Session和cookie
1.cookie 1.1. 为什么会有cookie? 由于HTTP是无状态的,服务端并不记得你之前的状态.这种设计是为了HTTP协议的方便,但是也存在一些问题.比如我们登录一个购物网站,我们需要用户登 ...
- js 原型链的介绍
对象的原型链:一个对象所拥有的属性不仅仅是它本身拥有的属性,他还会从其他对象中继承一些属性.当js在一个对象中找不到需要的属性时,它会到这个对象的父对象上去找,以此类催,这就构成了对象的原型链. 下面 ...
- Android中RadioGroup的初始化和简单的使用
一简介: RadioGroup作为一个单选按钮组,可以设置为性别选择男或则女,地址选择等等,作为一个android入门级选手,就简单的说一下RadioGroup组中RadioButton的布局和初始化 ...