Redis使用主从复制模式后可以使Redis的读并发量提高,但是主节点挂掉以后,Redis的主从复制模式就只能提供读的功能,无法提供写的功能,因为从节点是开启了只读模式,这种时候可以说Redis的一主多从模式已经不可用了,为了解决这种情况,Redis引入了哨兵模式。
一、Redis哨兵模式(sentinel)
Redis哨兵可以是一个也可以是多个,但是为了保证哨兵的高可用性,一般都会吧Redis哨兵部署成集群(有几个Redis,就部署就几个哨兵),Redis哨兵对整个Redis的主从进行监控。集群中的每一个哨兵都会单独的对master和slave进行监控。
下面的故障转移、主观下线与客观下线介绍的背景是一台master、2台slave、3台sentinel、quorum等于2(法定人数)。
故障转移:在Redis的主从模式中,一旦我们的master出现故障,哨兵就会监控到,哨兵就会将一台slave切换成master,继续为用户提供写服务,提高了主从模式的可用性。
假设有一台哨兵检测到master出现故障(无法ping通),那么这个哨兵就会认为master是不可用的,但是这个时候,这个哨兵是不能对master做故障转移的,因为在生产环境中,我们的分布式系统会有很多个节点(网络环境复杂),在某些时刻确实会出现网络抖动,导致当前这个哨兵检测到master不可用(ping不通),但是其他的哨兵检测到master是可用的,这个时候,检测到master不可用的这个哨兵是没有发言权的(不可以进行故障转移),这就是一种主观下线。
主观下线:当有一台哨兵或者少量(没有达到quorum指定的值)的哨兵检测到master不可用的时候,这种情况其实是一种主管判断,这时是不进行故障转移的。我们当前背景是3台哨兵,quorum的值是2,一台哨兵检测到master不可用,就属于主观下线。
客观下线:哨兵集群中,有大多数哨兵检测到master不可用(等于或大于quorum指定的值),就属于客观下线,这种时候就会执行故障转移。我们当前背景是3台哨兵,quorum的值是2,两台或两台以上台哨兵检测到master不可用,就属于客观下线。
所以哨兵集群一般都会部署奇数个,这样才能做到少数服从多数的情况(一半以上的哨兵决定master是否可用),而不会出现对半分的情况(一半哨兵检测到master是可用的,另一半哨兵检测到master是不可用的),这样才能更好的做到一个主观下线的操作,所以哨兵可以是3台、5台、7台······。
选举leader:故障转移是由某一个哨兵去完成的,在哨兵集群中会有一个leader,转移工作有这个leader去完成,这个leader是由选举得出的,选举也是一个少数服从多数的情况,我们现在有3台哨兵,只要有一台获得2票(或者2票以上)的支持,那么这个哨兵就是leader。leader在故障转移时,会从多个slave中挑选一个作为新的master,整个过程都由哨兵leader去完成。
挂掉的master重新恢复后,会成为slave节点,注意这时候这个slave节点可能是无法同步数据的,原因与情况在中有具体描述。