哨兵的作用
哨兵系统中有两种节点:
1、哨兵节点: 哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 Redis 节点,不存储数据;
2、数据节点: 主节点和从节点都是数据节点;
创建向主/从服务器的网络连接:
哨兵会创建2个连向主/从服务器的连接。一个是命令连接,用于向主/从服务器发送命令,获得响应。一个是订阅连接,用于订阅主/从服务器的hello频道。(为什么要创建订阅连接,因为在redis里面即使订阅了,被发送的消息不会保存到redis服务器里面,如果在消息发送时,客户端不在线或者断开连接,这条消息就接收不到了,因此为了确保能接收到hello频道的任何消息,要专门建立一个连接来确保接收到消息。)这个订阅连接的主要作用是sentinel利用它来发现主或者从服务器上的未知的新的sentinel。
也就是说只有sentinel会向主/从服务器创建两个连接,但是不同的sentinel之间只会创建一个连接:“命令连接”(用于通讯),而不会创建订阅连接。
主观下线和客观下线
【1】主观下线:
默认情况下,sentinel会向所有和他创建命令连接的实例(包括主服务器,从服务器,其他的sentinel)以每秒一次的频率发送PING命令,如果得到的回复不是有效回复,并且在连续时间内(这个连续时间由配置文件指定)一直返回无效回复,那么sentinel则“主观”认为该实例已经下线。这就是主观下线。
并且我们在配置文件里面设置的“下线时间”参数不仅会被用来判断主服务器的主观下线状态,同样也用于判断下面的所有从服务器的主观下线状态,以及同样监视这个主服务器的其他sentinel的主观下线状态。
【2】客观下线:
当sentinel将一个主服务器判断为主观下线之后,为了确认他是否真的下线,他会向同样监视这个主服务器的其他sentinel查询,看他们是否也认为这个主服务器已经进入了下线状态。当从其他的sentinel那里接收到足够数量(这个数量参数其实就是启动sentinel时的最后一个参数)的已下线判断之后,sentinel就会将这“主服务器”判断为客观下线,然后对“主服务器”进行故障转移操作。
因为不同sentinel的配置参数可能不一样,所以不同sentinel对于判断服务器是否下线的条件也不一样。
选举领头sentinel
当一个主服务器被判断为客观下线之后,监视这个主服务器的各个sentinel会进行协商,选举出一个领头sentinel,并由这个领头sentinel对下线的主服务器来执行故障转移操作。
但是具体的选举过程就不写了,太复杂。简单来说就是各个sentinel之间会互相进行选举,每个sentinel都会“推举”出一个局部领头sentinel,如果有一个sentinel被超过一半的sentinel选为局部领头sentinel,他就是领头sentinel。然后这个领头sentinel去执行故障转移。
故障转移
领头sentinel去执行故障转移们主要包括以下三个步骤:
1、在已经下线的主服务器的所有从服务器里面,挑选一个从服务器作为新的主服务器。
2、将原来的主服务器的所有从服务器改成复制新的主服务器。
3、然后将已经下线的主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线之后,它就成为了新的主服务器的从服务器。
那么新的主服务器是怎样被挑选出来的?
故障转移操作的第一步 要做的就是在已下线主服务器属下的所有从服务器中,挑选出一个状态良好、数据完整的从服务器,然后向这个从服务器发送 slaveof no one 命令,将这个从服务器转换为主服务器。但是这个从服务器是怎么样被挑选出来的呢?挑选的规则如下:首先会将所有的从服务器保存到一个列表里面,然后对里面的进行一步一步的过滤。
【1】首先删除列表里面所有处于下线或者断线状态的从服务器。
【2】删除列表里面最近5秒没有没有回复过领头sentinel的info命令的从服务器,这样保证列表里面的从服务器最近都是成功进行通讯的。
【3】删除列表里面与已下线的主服务器断开时长超过down-after指定时长10倍的从服务器。(也就是说剩下的从服务器里面的数据都是比较新的)
【4】在剩下的列表里面选出优先级最高的从服务器,如果优先级相同,在里面选出复制偏移量最大的,如果还是相同,那么带有最小的运行id的从服务器作为新的主服务器。