Redis 学习笔记(篇十):Sentinel
Sentinel(哨兵)是 Redis 的高可用解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
服务器与 Sentinel 系统的关系如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

当 serverl 的下线时长超过用户设定的下线时长上限时,Sentinel 系统就会对 serverl 执行故障转移操作:
- 首先, Sentinel 系统会挑选 serverl 属下的其中一个从服务器,并将这个被选中的从服务器升级为新的主服务器。
- 之后, sentinel 系统会向 serverl 属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕。故障转移过程如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

- 另外, sentinel 还会继续监视已下线的 serverl,并在它重新上线时,将它设置为新的主服务器的从服务器。如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

启动并初始化 Sentinel
启动 Sentinel 的命令如下:
redis-sentinel /path/to/your/sentinel.conf 或
redis-server /path/to/your/sentinel.conf --sentinel
当一个 Sentinel 启动时,他需要执行以下步骤:
初始化服务器。
因为 Sentinel 本质上只是一个运行在特殊模式下的 Redis 服务器,所以需要初始化一个普通的 Redis 服务器。将普通 Redis 服务器使用的代码替换成 Sentinel 专用代码。
将一部分普通 Redis 服务器使用的代码替换成 Sentinel 专用代码。比如,端口、命令表等。初始化 Sentinel 状态。
根据给定的配置文件,初始化 Sentinel 的监视主服务器列表。
创建连向主服务器的网络连接。
Sentinel 会创建两个连向主服务器的异步网络连接(Sentinel 将成为主服务器的客户端,可以向主服务器发送命令,并从命令回复中获取相关信息。),如下:
- 命令连接:这个连接专门向主服务器发送命令,并接受命令回复。
- 订阅连接:这个连接专门用于订阅主服务器的 __sentinel__:hello 频道
获取主服务器的信息
Sentinel 默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送 INFO 命令,并通过分析 INFO 命令的回复来获取当前主服务器和从服务器的的信息。如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

Sentinel 通过解析主服务器返回的信息,可以获取以下两方面的信息:
- 关于主服务器本身的信息。
- 主服务器属下所有从服务器的信息,比如:ip、port。
获取从服务器的信息
当 Sentinel 发现主服务器有新的从服务器时,Sentinel 除了会为这个新的从服务器创建相应的实例结构之外,Sentinel 还会创建连接到从服务器的命令和订阅连接。如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

创建连接之后,Sentinel 会默认每十秒一次的频率通过命令连接向从服务器发送 INFO 命令,并获得如下信息:从服务器的运行 ID、主服务器的 IP:port、主从服务器的连接状态、从服务器的优先级、从服务器的复制偏移量等。
向主服务器和从服务器发送和接收信息
在默认情况下, Sentinel 会以每两秒一次的频率,通过命令连接向所有被监视的主从服务器发送如下格式的命令:
PUBLISH \_\_sentinel__:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port><m_epoch>"
这条命令向服务器的 __sentinel__:hello 频道发送了一条消息,信息内容的参数如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

当 Sentinel 与一个主服务器或者从服务器建立订阅连接后, Sentinel 就会通过订阅连接,向服务器发送一下命令:
SUBSCRIBE __sentinel__:hello
表示 Sentinel 对 __sentinel__:hello 频道的订阅会一直持续到 Sentinel 与服务器的连接断开为止。
也就是说: 对于每个与 Sentinel 连接的服务器, Sentinel 既通过命令连接向服务器的 __sentinel__:hello 频道发送消息,又通过订阅连接从服务器的 __sentinel__:hello 频道接收消息,如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

检测主观下线状态
在默认情况下,Sentinel 会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel)发送 PING 命令,并通过实例返回的 PING 命令回复来判断该实例是否在线。如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

实例对 PING 命令的回复可以分为以下两种情况:
- 有效回复:实例返回 +PONG、-LOADING、-MASTERDOWN 三种回复中的一种。
- 无效回复:其他回复。
如果一个实例在 down-after-milliseconds 毫秒(配置文件中的值)内,连续向 Sentinel 返回无效回复,那么该 Sentinel 便认为这个实例已经进入主观下线状态。
注意:对于监视同一个服务器的多个 Sentinel 来说,这些 Sentinel 所设置的 down-after-milliseconds 的值也可能不同。因此,当一个 Sentinel 将主服务器判断为主观下线时,其他 Sentinel 可能仍然会认为主服务器处于在线状态。
检测客观下线状态
当 Sentinel 将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他 Sentinel 进行询问,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或者客观下线)。当 Sentinel 从其他 Sentinel 那里接收到足够数量的已下线判断之后, Sentinel 就会将从服务器判定为客观下线,并对主服务器执行故障转移操作。
客观下线状态的判断条件如下:
当认为主服务器已经进入下线专题的 Sentinel 的数量,超过 Sentinel 配置中设置的 quorum 参数的值,那么该 Sentinel 就会认为主服务器已经进入客观下线状态。
注意:不同 Sentinel 判断客观下线的条件可能不同:对于监视同一个主服务器的多个 Sentinel 来说,他们讲主服务器判断为客观下线的条件可能也不同,当一个 Sentinel 将主服务器判断为客观下线时,其他 Sentinel 可能并不是那么认为的。
选举领头 Sentinel
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个 Sentinel 会进行协商,选举出一个领头 Sentinel,并由领头 Sentinel 对下线主服务器执行故障转移操作。
故障转移
在选举产生出领头 Sentinel 之后,领头 Sentinel 将对已下线的主服务器执行故障转移操作,该操作包含以下三个步骤:
- 在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器。
- 让已下线主服务器属下的所有从服务器改为复制新的主服务器。
- 将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,它就会成为新的主服务器的从服务器。
选出新的主服务器
故障转移的第一步就是在已下线的主服务器属下的所有从服务器中,挑选出一个状态良好、数据完整的从服务器,然后向这个从服务器发送 SLAVEOF no one 命令,将这个从服务器转换为主服务器。如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

修改从服务器的复制目标
当新的主服务器出现之后,领头 Sentinel 下一步要做的就是,让已下线的主服务器属下的所有从服务器去复制新的主服务器(向从服务器发送 SLAVEOF 命令)。如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

此时各个服务器以及领头 Sentinel 如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

将旧的主服务器变为从服务器
故障转移操作最后要做的就是,当将已下线的主服务器从新上线时设置为新的主服务器的从服务器。如下图所示(出自《Redis设计与实现第二版》第十六章:Sentinel):

Redis 学习笔记(篇十):Sentinel的更多相关文章
- Redis学习笔记(十五)Sentinel(哨兵)(中)
上一篇 我们模拟了单机器下哨兵模式的搭建,那么接下来我们看下哨兵模式的实现与工作. 为什么又分成两篇呢?因为篇幅太长(偷懒),再一个这篇主要说的是Sentinel的初始化以及信息交换,下一篇着重说下状 ...
- Redis学习笔记(十六) Sentinel(哨兵)(下)
消失了一段时间,我又回来啦.不多说,继续把哨兵看完. 检测主观下线状态 默认情况下,Sentinel会以每秒一次的频率向所有与他创建了命令连接的实例(主从服务器以及其他Sentinel)发送PING命 ...
- Redis学习笔记(十四)Sentinel(哨兵)(上)
最近谈到Redis就会听到哨兵模式,工作期间同事也分享过关于哨兵模式的知识,但由于工作忙(给自己找个借口)没有没认真看,现在恶补下,老样子还是分上篇应用,下篇看实现过程,下面我们来看下哨兵到底是啥? ...
- Redis学习笔记(十) 客户端
Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复. 通过使用由I/ ...
- Redis学习笔记(十二) 复制(上)
偷个懒,晚上工作忙的太晚,整个复制功能的内容还没有写完,这里先说一下复制功能的简单应用. 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器, ...
- Redis学习笔记(十八) 集群(下)
复制和故障转移 Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制 的主节点下线时,代替下线主节点继续处理命令请求. ...
- Redis学习笔记(十)——过期时间、访问限制与缓存
http://irfen.me/redis-learn-10-time-expire-limit-cache/ 过期时间 之前应该提到过 redis 的特性之一是可以设置键的超时时间.命令是expir ...
- Redis 学习笔记(十二)Redis 复制功能详解 ----- (error) READONLY You can't write against a read only slave
Redis 复制(Replication)1. 复制介绍分布式数据库为了获取更大的存储容量和更高的并发访问量,会将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上.Redis为了解决 ...
- 【测试笔记】Redis学习笔记(十二)性能测试
http://blog.csdn.net/yangcs2009/article/details/50781530 Redis测试服务器一 redis_version:2.8.4 www@iZ23s8a ...
- Redis学习笔记(十二) 高级命令:服务器管理命令
原文链接:http://doc.redisfans.com/server/index.html save 执行一个同步操作,将redis实例的所有数据以rdb的形式保存到硬盘,一般来说,生产环境很少执 ...
随机推荐
- 可以粘贴Word文档中图片的编辑器
Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...
- 富文本编辑器粘贴word
很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...
- (RERERERERERERERERERERE) BZOJ 2746: [HEOI2012]旅行问题
二次联通门 : BZOJ 2746: [HEOI2012]旅行问题 神TM STL的vector push_back进一个数后取出时就变成了一个很小的负数.. 调不出来了, 不调了 #include ...
- python 批量创建文件及文件夹(文件夹里再创文件)
python 批量创建文件及文件夹(文件夹里再创文件)思路:文件建到哪>文件名字叫啥>创建文件夹>去新建的文件下>新建文件>给文件里边写东西>写个反馈给控制台> ...
- python写爬虫遇到需要解码js一些记录
js在线格式化网站 https://beautifier.io/ Python 执行 JS 代码 NodeJS 安装方式 先解决 JS 环境,这里推荐安装 Node.js ,安装方便,执行效率也高. ...
- codeforces392B
CF392B Tower of Hanoi 题意翻译 河内塔是一个众所周知的数学难题.它由三根杆和一些可以滑动到任何杆上的不同尺寸的圆盘组成.难题从一个整齐的杆中开始,按照尺寸从小到大的顺序排列,最小 ...
- windows下使用curl命令&&常用curl命令
什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...
- Spring事务知识点
事务的传播属性 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.// 最常用,@Transactional注解默认 PROPAGA ...
- Winform 工程反编译后窗体如何显示
Winform反编译后,如果想要让它象正常的工程一样,可以在窗体编辑器中,编辑,需要做一些工作. 1. 转换.resources 为 .resx 利用resgen工具.这个工具是vs自带的. 在启动 ...
- gensim word2vec实践
语料下载地址 # -*- coding: utf-8 -*- import jieba import jieba.analyse # suggest_freq调节单个词语的词频,使其能(或不能)被分出 ...