Sentinel在典型的一主多从的Redis系统中,当主库遇到服务异常中断时,需要手动选择一个从库升级为主库。整个过程需要人工干预,难度大。自动化。Redis2.8提供了Sentinel2.0(2.6提供了1.0,但是有很多问题)。Sentinel,顾名思义,监控Redis系统的运行状态。它的功能包括以下两个:监控主库和从库是否正常运行;主库故障时,自动将从库升级为主库;可以使用多个Sentinels来监控整个Redis系统,Sentinels之间也会互相监控。配置是在之前的一主二从架构的基础上,为他们增加哨兵。可以在三个redis节点的redis目录下找到sentinel.conf文件。该文件是哨兵配置文件。修改配置如下:sentinelmonitormymaster192.168.2.10163793其中:mymaster为需要监控的主数据库名称,可以自定义;是主数据库的ip和端口;最后3是哨兵通过的最少票数;如果需要后台启动,修改daemonize参数:daemonizeyes配置后如果有防火墙,别忘了打开sentinel的端口,默认26379。最后打开sentinel:redis-sentinel/yourpath/sentinel.conf做个测试,关闭主库(192.168.2.101)后,等待30秒(默认30秒):Sentinel会从数据库中的一个节点升级到主数据库(192.168.2.102);将另一个主库(192.168.2.101)从数据库(192.168.2.103)切换到新的主库(192.168.2.102);然后启动刚刚关闭的主库(192.168.2.101),哨兵会自动将其变成从库;原理1.监控过程结束后,Sentinel会与待监控的主数据库建立两个连接:一个用于订阅__sentinel__:hello频道,获取其他sentinel节点的信息;另一个用于定期向master数据库发送INFO等命令,获取master数据库本身的信息;与主库建立连接后,哨兵会定时执行以下三个操作:每隔10秒,哨兵会向主库和从库发送INFO命令;2秒后,sentinel将自己的信息发送到主库和从库的__sentinel__:hello通道;每隔1秒,哨兵会向主库、从库和其他哨兵发送一个PING命令;第一个操作是发送INFO命令,目的是获取主库的主库和从库的信息,从而实现新节点的自动发现,并与从库建立两个连接。第二个操作是订阅__sentinel__:hello频道,发送sentinel本身的信息,将自己的信息分享给其他同样监控数据库的sentinel,同时也判断这个sentinel是否是一个新的sentinel。哨兵之间也会建立链接,发送PING命令;第三个操作是发送PING命令。发现从库和其他哨兵后,要做的就是定时监控Redis服务是否停止。时间间隔同配置文件中的down-after-milliseconds有关。当该值小于1秒时,sentinel会每秒发送一次PING命令。当该值大于1秒时,哨兵每秒发送一次PING命令。配置方法是在sentinel.conf文件中添加:sentineldown-after-millisecondsmymaster600#600毫秒超过down-after-milliseconds时发送PING,如果PING数据库没有回复,sentinel主观认为下线。主观下线可以理解为当前sentinel认为节点下线。如果该节点是master数据库,sentinel会进一步判断是否需要修复:sentinel会发送SENTINELis-master-down-by-addr命令询问其他sentinel是否也认为是master数据库下线时,如果达到quorum参数,也就是我们配置sentinel时命令sentinelmonitormymaster192.168.2.10163793的最后一个参数3,sentinel会认为master数据库客观下线,并选举一个leadingsentinel发起一个主从系统的故障恢复。2.为了从leadersentinel选举失败中恢复,需要选举一个leadersentinel。leadersentinel的选择算法是Raft算法。命令,要求对方选择自己作为带头哨兵;如果目标哨兵节点没有选择其他哨兵,则同意将A设置为领先哨兵;如果A发现超过半数超过quorum参数的sentinel节点同意选择自己,则A成功成为Leadingsentinel;当有多个哨兵同时参与选举时,将没有任何节点被选举的可能。此时每个参与节点都会等待一个随机的时间重新发起选举,直到选举成功。3、故障恢复选出leadingsentinel后,会选出其中一个从库升级为主库:所有前线的从库都会选出优先级最高的,优先级可以通过slave-priority设置;如果有多个相同优先级的从库,复制命令的偏移量越大,优先级越高(最接近宕机的主库);如果有多个备选方案,则选择运行ID较小的一个(运行ID不会重复);选择一个节点后,leadingsentinel会发送slaveofnoone给这个节点,将其升级为master数据库。然后向其他从库发送slaveof命令,切换主库。最后更新内部记录,将已经停止服务的旧主库更新为新主库的从库,恢复时自动加入主从架构作为从库。哨兵部署哨兵推荐部署方案:为每个节点部署一个哨兵(无论是主库还是从库);使每个哨兵与其对应的节点具有相同或相似的网络环境;将quorum的值设置为N/2+1,这样只有当大部分sentinel统一时,才会选择leadersentinel进行故障恢复。
