redis的哨兵
sentinal 本质上是运行在特殊模式下的redis
一个典型的哨兵部署如下
image.png
我们使用哨兵结构进行部署的主要目的是为了高可用,当主机宕机时,可以自动切换,下图是一个典型的故障转移过程
image.png
一、哨兵模式的redis有何特殊?
-
Sentinel 状态中的服务器,会有一个masters字典
masters字典记录了所有被Sentinel监视的主服务器相关信息。字典的key是主服务名字,字典的value则是主服务器对应的实例结构(包括主服务器,从服务器,或者另外一个Sentinel)
这个字典初始化,就是sentinel的配置
image.png
此外还有slave字典和sentinel字典,但这个是后续更新信息的
二、sentinel获得主、从、其他哨兵服务器信息?
sentinel和服务器创建2个连接,一个是订阅,一个是命令。增加一个命令主要是为了防止,订阅频道时,消息丢失的情况
- Sentinel如何获得服务器的信息
1.获得主服务器信息
Sentinel每隔10s通过命令连接向主服务发info命令,info命令获得相关从服务器的信息,包括tp,端口等 - 2.获得从服务器信息,因为之前已经拿到了主服务器的info信息,里面包含的从的信息,sentinel再向从服务器建立2个连接,自然就获得了从服务器的信息,更新到自己的slave字典中
- 获得其他sentinel的信息
sentinel怎么知道其他的哨兵,是通过暴露自己的方式,让其他哨兵感知到的,sentinel会向主从服务器都向sentinel:hellp频道发布消息,消息内容会包含sentinel自身信息和监控的主机信息,那么其他的sentinel
通过订阅这个频道,可以知道其他sentinel的信息。从而使得监视同一个主服务器的多个Sentinel可以走动发现对方。发现后就可以互相创建命令连接,最终跟新自身的sentinel字典
三、高可用的方案
检测主观下线
sentinel每隔1s向其他服务器发送ping,如果超过down-after-nukkuseconds,就会被判定为主观下线
何谓主观,就是仅仅考虑自己的想法,这里指就是自身这台sentinel判定不通过,认为你下线了。
检测客观下线
当sentinel判定一台服务器主观下线后,会去向其他的sentinel询问,如果反馈达到一定数量,则被判定为客观下线。这个数量quorum是一开始配置好的。
选举sentinel的leader
sentinel选举是基于raft算法选出leader的。
参考文档:https://www.jianshu.com/writer#/notebooks/28197258/notes/57839517/preview
故障转移
当选出sentinel的leader后,那一台sentinel就可以执行故障转移高可用
-
1.在从服务器里,挑选一个从服务器,转换为新的主
挑选的依据主要是根据存活,优先级,最大偏移量,运行id,依次选下去。
发送命令 slaveof no one后,从就会变成主,再次期间,sentinel每隔1s向服务器发送info命令直到info 返回的role是master了,就确认从已经正确切换成主 -
2.让其他的从,变成新的主的从
向其他的从发送新的slaveof 命令 -
3.让已下线的主设置为新的主服务的从,如果旧主重新上线就变成了新主的从
保存在自身结构中,这样下掉的主回来就变成新的从了