linux哨兵命令 哨兵的命令( 二 )


对于监视同一个服务器的多个Sentinel 来说,一个Sentinel发送的信息会被其他 Sentinel接收到, 这些信息会被用于更新其他Sentinel对发送信息Sentinel的认知,也会被用于更新其他Sentinel对被监视服务器的认知 。
举个例子 ,  假设现在有sentinel1、sentinel 2、sentinel 3三个Sentinel在监视同一个服务器 ,  那么当sentinel1向服务器的_sentinel_:hello频道发送一条信息时 , 所有订阅了_sentinel_:hello频道的Sentinel(包括sentinel1自己在内)都会收到这条信息 。
当一个Sentinel从_sentinel_:hello频道收到一条信息时,Sentinel会对这条信息进行分析,提取出信息中的Sentinel IP地址、端口号、Sentinel运行ID等参数 , 并作以下检查:
**如果信息中记录的Sentinel运行ID和接收信息中Sentinel的运行ID 相同,说明这条信息是Sentinel自己发送的,Sentinel将丢弃这条信息,不做进一步处理 。
**如果信息中记录的Sentinel运行ID和接收信息的Sentinel的运行ID不相同,那么说明这条信息是监视同一个服务器的其他Sentinel发来的,接收信息的Sentinel 将根据信息中的各个参数, 对相应主服务器的实例结构进行更新 。
这里的更新包括:主服务sentinels属性的更新和创建连向其他Sentinel命令连接
(1)Sentinel为主服务器创建的实例结构中的sentinels属性保存了除Sentinel本身之外,所有同样监视这个主服务器的其他Sentinel的资料 。当一个Sentinel接收到其他Sentinel发来的信息时(我们称呼发送信息的Sentinel为源Sentinel, 接收信息的Sentinel为目标Sentinel) , 根据信息中提取出主服务器参数,目标Sentinel会在自己的Sentinel状态的masters字典中查找相应的主服务器实例结构,然后根据提取出的Sentinel参数,检查主服务器实例结构的sentinels中,源Sentinel的实例结构是否存在:
因为一个Sentinel可以通过分析接收到的频道信息来获取其他Sentinel的存在,并通过发送频道信息让其他Sentinel知道自己的存在,所以用户在使用Sentinel时不需要提供各个Sentinel的地址信息,监视同一个主服务器的多个Sentinel可以自动发现对方 。
(2) 创建连向其他Sentinel命令连接
当Sentinel通过频道信息发现一个新的Sentinel时,它不仅会为新Sentinel在sentinels中创建相应的实例结构, 还会创建一个连向新Sentinel的命令连接,而新Sentinel也同样会创建连向这个Sentinel的命令连接 ,  最终监视同一主服务器的多个Sentinel将形成相互连接的网络 。
在默认情况下,Sentinel会以 每秒一次 的频率向所有与它创建了命令的连接实例 (包括主服务器、从服务器、其他Sentinel在内) , 发送PING命令,并通过实例返回PING命令的回复判断实例是否在线,如果在规定的时间内,连续向Sentinel返回无效的回复(除了+PONG、-LOADING、-MASTERDOWN之外的回复) , 那么Sentinel会修改这个实例所对应的实例结构,在结构的flags属性中打开SRI_S_DOWN标识 , 以此来标识这个实例已经进入了 主观下线状态。
当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了 ,  它会向同样监视这一主服务器的其他Sentinel进行询问,看它们是否也认为主服务器已经进人了下线状态(可以是主观下线或者客观下线) 。当Sentinel从其他Sentinel那里接收到足够数量的已下线判断之后,Sentinel就会将从服务器判定为客观下线,Sentinel会将主服务器实例结构flags属性的SRI_O_DOWN标识打开 , 标识主服务器已经进入了客观下线状态 。
当一个主服务器被判断为客观下线时,监视这个下线的主服务器的各个Sentinel会进行协商,选举出以个领头Sentinel , 并由领头Sentinel对下线主服务器执行故障转移操作 。

推荐阅读