Redis高可用——哨兵Sentinel
本文转载于https://blog.csdn.net/weixin_42653522/article/details/119897953?spm=1001.2014.3001.5501,对其进行了精简。
文章目录
前言
转载内容
一、概述
Sentinel是 Redis的高可用性解决方案:由一个或多个 Sentinel 实例组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
如上图为一个 Sentinel系统实例:
- server1 为当前的主服务器
- server2、server3、server4 为主服务器的三个从服务器
- 三个从服务器正在复制主服务器,而 Sentinel 系统则在监视所有服务器
假设这时,主服务器 server1 进入下线状态,那么三个从服务器对主服务器的复制操作将被终止,并且 Sentinel 系统会察觉到 server1 已下线。
故障转移:当主服务器server1的下线时长超过用户设定的下线时长上限时,Sentinel系统会对 server1 执行故障转移操作:
- 首先,Sentinel 系统会挑选server1属下的其中一个从服务器,并将这个被选中的从服务器升级为新的主服务器
- 之后,Sentinel系统会向server1属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕。
- 另外,Sentinel 还会继续监视已下线的server1,并在它重新上线时,将它设置为新的主服务器的从服务器。
二、启动及初始化Sentinel
当一个 Sentinel实例启动时,需要执行以下步骤:
- 初始化服务器
- 将普通Redis服务器使用的代码替换成Sentinel专用代码
- 初始化Sentinel状态
- 根据给定的配置文件,初始化Sentinel的监视主服务器列表
- 创建连向主服务器的网络连接(网络连接又包括:命令连接、订阅连接)
三、哨兵检测原理
3.1 和各个服务器交流
- 通过发布订阅的方法与服务器交流,判断服务器状态。
3.2 检测专管下线状态
在默认情况下,Sentinel 会以每秒一次的频率向所有与它创建了命令连接的实例包括主服务器、从服务器、其他Sentinel在内发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。
3.3 检测客观下线状态
当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他Sentinel进行询问,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或者客观下线)。当Sentinel从其他Sentinel那里接收到足够数量的已下线判断之后,Sentinel就会将从服务器判定为客观下线,并对主服务器执行故障转移操作。当一个主服务器被判断为客观下线后,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作。
3.4 选举领头Sentinel
所有在线的Sentinel都有被选为领头Sentinel的资格,如果有某个Sentinel被半数以上的Sentinel设置成了局部领头Sentinel,那么这个Sentinel称为领头Sentinel,每次进行选举后,不论选举是否成功,所有Sentinel的配置纪元的值都会自增一次,实际上,配置纪元只是一个计数器。如果在给定时限里,没有一个Sentinel被选举为领头Sentinel,那么各个Sentinel将在一段时间之后再次进行选举,直到选出领头Sentinel为止。
3.5 故障转移
在选举产生出领头Sentinel之后,领头Sentinel将对已下线的主服务器执行故障转移操作,该操作包含以下三个步骤:
1)在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器。
2)让已下线主服务器属下的所有从服务器改为复制新的主服务器。
3)将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,它就会成为新的主服务器的从服务器。
四、注意点
哨兵会定时执行下面3个操作:
- Sentinel以每10秒一次的频率向被监视的主从服务器发送INFO命令,当主服务器处于下线状态,或者Sentinel正在对主服务器进行转移时,Sentinel向从服务器发送INFO命令的频率会改为每秒一次。
- Sentinel每2秒向主数据库和从数据库的_sentinel_:hello 频道发送自己的信息
- Sentinel每秒会向主数据库、从数据库和其他哨兵节点发送PING命令