我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis学习笔记(十六) Sentinel(哨兵)(下)

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis学习笔记(十六) Sentinel(哨兵)(下)

Redis学习笔记(十六) Sentinel(哨兵)(下)

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

 

检测主观下线状态

默认情况下,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对下线主服务器执行故障转移操作。

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

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

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

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

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

Sentinel设置局部头领Sentinel的规则是先到先得。

目标Sentinel在接收到SENTINEL is-master-down-by-addr命令之后,将向源Sentinel返回一条命令回复,回复中的leader_runid参数和leader_epoch分别记录了目标Sentinel的局部头领Sentinel的运行ID和配置纪元。

源Sentinel在接收到目标Sentinel返回的命令之后,会检查回复中leader_epoch参数的值和自己的配置纪元是否相同,如果相同,那么源Sentinel继续取出回复中的leader_runid参数,如果leader_runid参数的值和源Sentinel的运行ID一致,那么标识目标Sentinel将源Sentinel设置为局部头领Sentinel。

如果某个Sentinel被半数以上的Sentinel设置为局部领头Sentinel,那么这个Sentinel就称为头领Sentinel。

如果在给定时间限制内,没有一个Sentinel被选举为头领Sentinel,那么各个Sentinel将在一段时间之后再次进行选举,直到选出头领Sentinel。

 

故障转移

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

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

挑选过程:

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

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

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

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

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

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

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


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

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


 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis学习笔记(十六) Sentinel(哨兵)(下)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis学习笔记(十六) Sentinel(哨兵)(下)

消失了一段时间,我又回来啦。不多说,继续把哨兵看完。 检测主观下线状态默认情况下,Sentinel会以每秒一次的频率向所有与他创建了命令连接的实例(主从服务器以及其他Sentinel)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。实例对
Redis学习笔记(十六) Sentinel(哨兵)(下)
2019-07-27

Redis学习笔记(十五)Sentinel(哨兵)(中)

上一篇 我们模拟了单机器下哨兵模式的搭建,那么接下来我们看下哨兵模式的实现与工作。为什么又分成两篇呢?因为篇幅太长(偷懒),再一个这篇主要说的是Sentinel的初始化以及信息交换,下一篇着重说下状态检查、Sentinel头领选举与故障转移 。启动并初始化Se
Redis学习笔记(十五)Sentinel(哨兵)(中)
2020-07-22

Redis学习笔记(十四)Sentinel(哨兵)(上)

最近谈到Redis就会听到哨兵模式,工作期间同事也分享过关于哨兵模式的知识,但由于工作忙(给自己找个借口)没有没认真看,现在恶补下,老样子还是分上篇应用,下篇看实现过程,下面我们来看下哨兵到底是啥?哨兵模式(Sentinel)是Redis的高可用解决方案。由一
Redis学习笔记(十四)Sentinel(哨兵)(上)
2019-07-22

Redis学习笔记(十三) 复制(下)

上一篇写了Redis复制功能的简单应用,下面我们看下Redis复制功能的实现过程。下面基本上是理论部分,枯燥乏味,但希望大家能看看,毕竟知识不都是感兴趣的.耐得住寂寞,经得起诱惑,方能守得住繁华 ~.~旧版复制功能的实现Redis的复制功能分为同步和命令传播两
Redis学习笔记(十三) 复制(下)
2022-04-20

Redis学习笔记(十八) 集群(下)

复制和故障转移Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制 的主节点下线时,代替下线主节点继续处理命令请求。设置从节点:CLUSTER REPLICATE 可以让接收命令
Redis学习笔记(十八) 集群(下)
2017-08-15

Redis学习笔记(六) 对象

前面我们看了Redis用到的主要数据结构,如简单动态字符串(SDS)、双向链表、字典、压缩列表、整数集合等。但是Redis并没有直接使用这些数据结构来实现键值对,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象、列表对象、哈希对象、集合对象、有序
Redis学习笔记(六) 对象
2021-06-25

学习笔记-小甲鱼Python3学习第十六

列表、元组和字符串的共同点:-都可以通过索引得到每一个元素-默认索引值总是从0开始-可以通过分片的方法得到一个范围内的元素的集合-有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)关于序列的常见内置方法(BIF):list()把一
2023-01-31

Redis学习笔记(二十) 发布订阅(下)

当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系。Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,而键的值是一个链表,链表里面记
Redis学习笔记(二十) 发布订阅(下)
2022-03-29

Redis学习笔记(十) 客户端

Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。通过使用由I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程
Redis学习笔记(十) 客户端
2022-04-06

Redis学习笔记(十二) 复制(上)

偷个懒,晚上工作忙的太晚,整个复制功能的内容还没有写完,这里先说一下复制功能的简单应用。在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器
Redis学习笔记(十二) 复制(上)
2017-05-07

Redis学习笔记(二十一) 事务

文章开始啰嗦两句,写到这里共21篇关于redis的琐碎知识,没有过多的写编程过程中redis的应用,着重写的是redis命令、客户端、服务器以及生产环境搭建用到的主从、哨兵、集群实现原理,如果你真的能看的进去,相信对你在以后用到redis时会有一定的帮助。写到
Redis学习笔记(二十一) 事务
2017-07-23

Redis学习笔记(十一) 服务器

Redis服务器负责与多个客户端建立网络通信,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。 命令请求过程(以set命令为例) 1、客户端向服务器发送命令请求 SET KEY VALUE。 Redis
Redis学习笔记(十一) 服务器
2014-11-11

Redis学习笔记(十七) 集群(上)

Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移操作。一个Redis集群通常由多个节点组成,在刚开始的时候每个节点都是相互独立的,他们处于一个只包含自己的集群当中,我们通过使用CLUSTER MEET命令将节点
Redis学习笔记(十七) 集群(上)
2015-09-17

Python学习笔记整理(十六)类的设计

如何使用类来对有用的对象进行建模?一、Python和OOPPython和OOP实现可以概括为三个概念。继承    继承是基于Python中属性查找(在X.name表达式中)多态    在X.method方法中,method的意义取决于X的类
2023-01-31

Redis学习笔记(十九) 发布订阅(上)

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,它的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,
Redis学习笔记(十九) 发布订阅(上)
2016-04-03

Redis学习笔记:Windows下的安装

一、Redis下载    官网下载地址:http://redis.io/download    GitHub下载地址:https://github.com/MSOpenTech/redis/tags    备注:现在的Redis官网没有Windows版的下载链
Redis学习笔记:Windows下的安装
2021-10-14

Redis学习笔记:Redis在Windows下的安装

一、Redis下载    官网下载地址:http://redis.io/download    GitHub下载地址:https://github.com/MSOpenTech/redis/tags    备注:现在的Redis官网没有Windows版的下载链
Redis学习笔记:Redis在Windows下的安装
2019-02-14

编程热搜

目录