哨兵模式简介
定义
概述:自动选举当老大模式,当主服务器宕机后,需要手动选举一台从服务器为主服务器,这时候需要人工干预,费时费力,还会造成一段时间内服务不可用,这不是一种推荐模式,更多时候我们优先选择哨兵模式。(REDIS2.8之后正式提供了哨兵架构)。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个单独的进程,他会独立进行。
原理:哨兵通过发送命令,等待redis服务器响应,从而监控运行多个Redis实例。
作用
1。通过发送命令让redis服务器返回监控其运行状态,包括主服务器和从服务器。
2.当哨兵检测到Master宕机时,会自动将Slave切换成Master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让他切换主机。
注意:一个哨兵进程对redis服务器进行监控可能会出现问题,为此我们可以使用多个哨兵进行监控,各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover进程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线。
当后面的哨兵也检测到主服务器不可用,并且数量达到一致时,哨兵之间就进行一次偷拍你,投票的结果由一个哨兵发起,进行failover故障转移操作,切换成功后就会通过发布订阅模式,让各个哨兵把自己监视的从服务器实现切换主机,称为客观下线。
优点
哨兵模式的优点
哨兵集群,基于主从复制模式,所有主从复制的优点他都有。
主从可以切换,故障可以转移,系统的可用性更好。
哨兵模式时主从复制模式的升级,手动转自动,更加健壮。
缺点
redis不好在线扩展,集群容量一旦到达上限,在线扩容十分麻烦。
实现哨兵模式的配置十分麻烦,里面有很多选择。
为什么要有哨兵模式?
在Redis的主从架构中,由于主从模式的读写分离,如果主节点挂了,那么将没有主节点来服务客户端的写操作请求,也没有主节点给从节点进行数据同步。

当主服务器宕机后,需要手动选举一台从服务器为主服务器,这时候需要人工干预,费时费力,还会造成一段时间内服务不可用,REDIS2.8之后正式提供了哨兵架构,这不是一种推荐模式,更多时候我们优先选择哨兵模式。
哨兵机制是如何工作的?
哨兵其实是一个运行在特殊模式下的Redis进程,所以他也是一个节点。它相当于一种观察者模式,观察的对象是主从节点。,在哨兵观察到有异常时,会做出一些动作来修复异常状态。
哨兵节点主要负责三件事情:监控,选举,通知。
接下来我们注重学习这三件事情:
哨兵节点是如何监控节点的?又是如何判断主节点是否真的故障了?
根据什么规则选择一个从节点切换为主节点?
怎么把新主节点的相关信息通知给从节点和客户端呢?
如何判断主节点真的故障了?
哨兵每隔一秒给所有主从节点发送PING命令,当主从节点收到PING命令后,会发送一个响应命令给哨兵,这样就可以判断其是否正常运行。

如果主节点或者从节点没有在规定时间内响应哨兵的PING命令,哨兵就会将他们标记为主观下线,这个规定时间是配置项down-after-milliseconds参数设定的,单位是毫秒。
注意:哨兵判断其为主观下线有可能是主节点并没有故障,而是因为主节点的系统压力过大或者网络发送了拥塞,导致主节点没有在规定时间内响应哨兵的PING命令。
因此为了减少误判,引入了客观下线,哨兵在部署时不会只部署一个节点,而是用多个节点部署成哨兵集群(最少三台),通过多个哨兵一起判断,就可以避免上种误判。
具体如何判断主节点客观下线呢?
当一个哨兵判断其主观下线后,就会向其他哨兵发起命令,其他哨兵收到这个命令后就会根据自身和主节点的网络状况,做出赞成投票或者拒绝投票的响应。

当这个哨兵的赞同票达到哨兵配置文件的quorum配置项设定的值后,这时主节点就会被标记为客观下线。
主从故障转移的过程是怎样的?
主从故障转移操作包含以下四个步骤:
第一步:在已下线主节点属下的所有从节点里挑选一个从节点,并将其转换为主节点。
第二步:让已下线的主节点属下的所有从节点修改复制目标,修改为复制新主节点。
第三步:将新主节点的IP地址和信息,通过发布/订阅者机制通知给客服端。
第四步:继续监视其就主节点,当这个旧主节点重新上线时,将它设置为新主节点的从节点。
哨兵集群是如何组成的?
搭建哨兵命令:只需要填下面这几个参数,设置主节点名字、主节点的 IP 地址和端口号以及 quorum 值。
sentinel monitor <master-name> <ip> <redis-port> <quorum>
哨兵集群是通过Redis的发布者/订阅者机制来互相发现的。
在主从集群中,主节点有一个名为_sentinel_:hello的频道,不同哨兵就是通过它来互相发现的,实现通信。
例如,哨兵A将自己的IP 端口信息发送到_sentinel_:hello频道上,哨兵B与C订阅了该频道,那么B与C就可以直接获取A的IP号与端口号。
我们知道了哨兵是怎样连接的,那哨兵是怎么知道从节点的。
主节点知道所有的从节点信息,所以哨兵每隔10s都会向主节点发送INFO命令获取从节点信息。
例如:哨兵B发送给主节点INFO命令,主节点接受这个命令后,把从节点列表返回给哨兵。

正是通过 Redis 的发布者/订阅者机制,哨兵之间可以相互感知,然后组成集群,同时,哨兵又通过 INFO 命令,在主节点里获得了所有从节点连接信息,于是就能和从节点建立连接,并进行监控了。
总结
在传统的主从复制机制下,如果主服务器宕机,则会阻塞写操作命令,必须手动实现选择新的主节点,费时费力,Redis在2.8版本以后提供的哨兵机制,它的作用是实现主从节点故障转移,他会观察主节点是否故障,多个哨兵同时检测,当主节点客观下线时,哨兵选取新的主节点,将从节点修改复制目标,通过发布订阅模式告知客户端,随后继续检测刚宕机的主节点是否恢复,恢复后称为从节点,哨兵集群是通过发布订阅模式相互联系的,哨兵与从节点是通过与主节点的INFO命令,后主节点向哨兵返回从节点列表。