1、哨兵
哨兵(Sentinel)主要是为了解决在主从复制架构中出现宕机的情况,主要分为两种情况:
1.1 从Redis宕机
这个相对而言比较简单,在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据。在Redis2.8版本后,主从断线后恢复的情况下实现增量复制。
1.2 主Redis宕机
这个相对而言就会复杂一些,需要以下2步才能完成
i.第一步,在从数据库中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务
ii.第二步,将主库重新启动后,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就能更新回来
1.3 配置
2、哨兵是什么
Redis-Sentinel是用于管理Redis集群,该系统执行以下三个任务:
2.1 监控(Monitoring):
Sentinel会不断地检查你的主服务器和从服务器是否运作正常;
2.2 提醒(Notification):
当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知;
2.3 自动故障迁移(Automatic failover):
当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器.
3.Sentinel集群搭建
3.1 单哨兵搭建
3.2 多哨兵搭建
原理
监控过程
哨兵启动后,会与要监控的主数据库建立两条连接:
1.一条用来用来订阅__sentinel__:hello频道以获取其他哨兵节点的信息;
2.另一条用来定期向主数据库发送INFO等命令来获取主数据库本身的信息;
在和主数据库建立连接后,哨兵会定时执行下面3个操作:
1.每10秒哨兵会向主数据库和从数据库发送INFO命令;
2.每2秒哨兵会向主数据库和从数据库的__sentinel__:hello频道发送自己的信息;
3.每1秒哨兵会向主数据库和从数据库和其他哨兵发送PING命令;
第一个操作是发送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成功成为领头哨兵;
当有多个哨兵同时参选,则会出现没有任何节点当选的可能,此时每个参选节点将等待一个随即时间重新发起竞选,直到选举成功。
故障恢复
选择出领头哨兵后,会把从数据库中的一个挑选出来升级为主数据库:
1.所有先线的从数据库中,选择优先级最高的,优先级可以通过slave-priority来设置;
2.如果有多个一样优先级的从数据库,则复制的命令偏移量越大,越优先(与down掉的主数据库最接近);
3.如果还有多个备选,则选择运行ID较小的(运行ID不会重复);
选择好节点后,领头哨兵将想这个节点发送slaveof no one,升级他为主数据库。
然后想其他从数据库发送slaveof命令切换主数据库。
最后更新内部的记录,将已经停止服务的旧的主数据库更新为新的主数据库的从数据库,当其回复后自动以从数据库的身份加入到主从架构中。
哨兵部署
哨兵的推荐部署方案:
1.为每个节点(无论是主数据库还是从数据库)都部署一个哨兵;
2.使每个哨兵与其对应的节点的网络环境相同或相近;
设置quorum的值为N/2+1,这样使得只有当大部分哨兵统一后才会选择领头哨兵进行故障恢复;