在一个典型的一主多从的Redis系统中,当主数据库遇到异常中断服务后,须要手动选择一个从数据库升级为主数据库,整个过程须要人工介入,难以自动化。redis
Redis2.8提供了哨兵2.0(2.6提供了1.0,可是问题较多),哨兵顾名思义就是监控Redis系统的运行情况。它的功能包括一下两个:算法
哨兵是一个独立的进行,在一个一主多从的Redis系统中,可使用多个哨兵监控整个Redis系统,哨兵之间也会互相监控。数据库
基于前面的一主两从架构,为他们加入哨兵。bash
能够在三个redis节点的redis目录下找到sentinel.conf文件,这个文件就是哨兵的配置文件,修改配置以下:网络
sentinel monitor mymaster 192.168.2.101 6379 3
其中mymaster是要监控的主数据库名字,能够自定义;架构
接下来是主数据库的ip和端口;并发
最后一个3是指哨兵最低经过票数;测试
若是你须要后台启动,则修改daemonize参数:spa
daemonize yes
配置后若是有防火墙,不要忘记打开哨兵的端口,默认是26379。code
最后,开启哨兵:
redis-sentinel /yourpath/sentinel.conf
作个测试,关闭主数据库(192.168.2.101)后,等待30秒(默认30秒):
随后启动刚才关闭的主数据库(192.168.2.101)
哨兵启动后,会与要监控的主数据库创建两条链接:
在和主数据库创建链接后,哨兵会定时执行下面3个操做:
第一个操做是发送INFO命令,目的是获取主数据库的信息,以及主数据库的从数据库的信息,从而实现新节点的自动发现,并对从数据库也创建两条链接。
第二个操做是订阅__sentinel__:hello频道,并发送哨兵自己的信息,与一样监控该数据库的其余哨兵分享本身的信息,同时也能识别哨兵是不是新哨兵。哨兵与哨兵之间也会创建一个连接,用来发送PING命令;
第三个操做是发送PING命令,在发现了从数据库和其余哨兵后,要作的就是定时监控Redis服务是否中止,时间间隔与配置文件中的down-after-milliseconds有关,当这个值小于1秒时,哨兵会每隔该值的时间发送PING命令,当这个值大于1秒时,哨兵会每隔1秒发送一次PING命令。
配置方式是在sentinel.conf文件中加入:
sentinel down-after-milliseconds mymaster 600 # 600毫秒发送一个PING
当超过down-after-milliseconds时,若是PING的数据库未回复,则哨兵认为其主观下线。主观下线能够理解为当前的哨兵认为该节点下线了。
若是该节点是主数据库,则哨兵们会进一步判断是否须要对其进行故障修复:
哨兵会发送SENTINEL is-master-down-by-addr命令询问其余哨兵,判断他们是否也认为该主数据库下线,若是达到quorum参数,也就是咱们在配置哨兵时的命令:
sentinel monitor mymaster 192.168.2.101 6379 3
的最后一个参数3,哨兵们会认为这个主数据库客观下线,并选举一个领头哨兵对主从系统发起故障恢复。
要进行故障恢复,则须要选举出一个领头哨兵,领头哨兵的选择算法是Raft算法,具体过程以下:
发现主数据库客观下线的哨兵节点(A节点)想每一个哨兵节点发送命令,要求对方选择本身成为领头哨兵;
若是目标哨兵节点没有选择过其余人,则会赞成将A设置成领头哨兵;
若是A发现超过半数且超过quorum参数个哨兵节点赞成选择本身,则A成功成为领头哨兵;
当有多个哨兵同时参选,则会出现没有任何节点当选的可能,此时每一个参选节点将等待一个随即时间从新发起竞选,直到选举成功。
选择出领头哨兵后,会把从数据库中的一个挑选出来升级为主数据库:
选择好节点后,领头哨兵将想这个节点发送slaveof no one,升级他为主数据库。
而后想其余从数据库发送slaveof命令切换主数据库。
最后更新内部的记录,将已经中止服务的旧的主数据库更新为新的主数据库的从数据库,当其回复后自动以从数据库的身份加入到主从架构中。
哨兵的推荐部署方案:
设置quorum的值为N/2+1,这样使得只有当大部分哨兵统一后才会选择领头哨兵进行故障恢复;