哨兵存在的意义:能够在 redis
主从结构出现问题的时候(比如主节点挂了),此时哨兵节点就能帮我们选出一个主节点,来代替之前挂了的节点,保证整个 redis
仍然是可用状态
查看各节点状态 docker ps -a
我们模拟一下主节点挂了的情况。手动干掉主节点 docker stop redis-master
redis-master
是一个 sdown
状态,于是开始投票 sdown
:主观下线,本哨兵认为,主节点挂了(单方面)+odown
状态 +odown
:客观下线,好几个哨兵都认为,主节点挂了,达成一致(法定票数)switch
:进行切换,从 0.2
切换到了 0.4
我们尝试练一下原来的主节点,端口号为:6379
再连一下 6380
再连一下 6381
我们重启原来的主节点 redis-master
之后
#高频面试
哨兵节点通过心跳包,判定 redis
服务器是否正常工作。如果心跳包没有如约而至,就说明 redis
服务器挂了
此时还不能排除网络波动的影响,因此就只能是单方面认为这个 redis
节点挂了
多个哨兵都认为主节点挂了。认为挂了的哨兵数目达到法定票数,哨兵们就认为这个主节点是客观下线
是否可能出现非常严重的网络波动,导致所有的哨兵都联系不上
redis
主节点,误判成挂了呢?
redis
主节点了“挂了”不一定是进程崩了,只要是无法正常访问,都可以视为是挂了
leader
让多个哨兵节点,选出一个 leader
节点,由这个 leader
负责选出一个从节点作为新的主节点
sentinel1
的编号(在 conf
配置文件里面可以看到)leader
leader
是要为大家服务的,当 1 号哨兵说他想为大家服务的时候,2 和 3 可能是纷纷举手赞成的(谁发现客观下线,谁就先给自己投)上面投票过程,就是看谁反应快(网络延时小)
此时 leader
选举完毕,leader
就要挑选一个从节点,作为新的主节点
redis
数据节点,都会在配置文件中,有一个优先级的设置
slave-priority
,不去改就都是一样的offset
:优先级一样,谁的 offset
更大,就胜出
run id
:优先级和 offset
都一样,选 run id
更小的(随机)
redis
节点启动的时候随机生成的一串数字,大小全凭缘分把新的主节点指定好之后,leader
就会控制这个节点,执行 slave no one
,成为 master
,再控制其他节点,执行 slave of
,让这些其他节点,以新的 master
作为主节点了