综述
哨兵是redis的高可用(HA)解决方案:由一个或多个sentinel实例组成的哨兵系统。
哨兵.pngsentinel是单独的一台服务器,是一个特殊的redis服务器,不做读写,只做监控。
当监控到server1死了,会在从中,选择一台,变成新的主。
监控.png主观下线与客观下线
主观下线
在默认情况下,哨兵会以每秒一次的频率向所有与它建连的实例(主服务器,从服务器,本哨兵集群的其他哨兵)发送PING命令。
PING命令有两种回复:
- 有效服务:+PONG、-LOADING、-MASTERDOWN
- 无效服务:非有效服务的其他回复
主观下线指的是单个哨兵 认为服务器 下线。
哨兵的配置文件: down-after-milliseconds指定了哨兵判断实例进入主观下线所需的时间长度。默认: 50000毫秒。
客观下线
主观下线是一个哨兵认为它下线了。
客观就是多个哨兵认为它下线了,并通过SENTINEL is-master-down-by-addr 命令互相交流之后,得出了确实下线了的结论,然后开启failover。
客观下线就是说只有在足够数量的 Sentinel 都将一个服务器标记位主观下线之后,服务器才会被标记位客观下线(ODOWN)。
只有当master被认定为客观下线时,才会发生故障迁移。
当sentinel监视某个服务器主观下线后,sentinel会询问其他监听该服务器的sentinel,看它们是否也认为该服务器主观下线了,接收到足够数量(这个值可以配置)的sentinel判断为主观下线,既认为该服务器客观下线,并对其做故障迁移。
sentinel的"仲裁会"
前面我们谈到,当一个master被sentinel集群监控时,需要为它指定一个参数,这个参数指定了当需要判决master为不可用,并且进行failover时,所需要的sentinel数量。可以称这个参数为票数。
不过,当failover主备切换真正被触发后,failover并不会马上进行,还需要sentinel中的大多数sentinel授权后,才可以进行failover。
当ODOWN时,failover被触发。failover一旦被触发,尝试去执行failover动作的sentinel,会去获得“大多数”sentinel的授权(如果配置的票数比大多数还要大的时候,则询问更多的sentinel)。
栗子:集群中有5个sentinel,票数被设置为2,当2个sentinel认为一个master已经不可用之后,将会触发failover,但是,执行failover的那个sentinel必须先获得至少3个sentinel的授权才可以真正执行failover。
如果票数被设置为5,要达到ODOWN状态,必须所有5个sentinel都主观认为master为不可用,要执行failover,那么要获得所有5个sentinel的授权。
ps: failover为故障转移。
选举领头sentinel(即执行者选举)
一个redis服务器被判断为客观下线时,多个监视该服务器的sentinel协商,选举一个领头sentinel,对该redis服务器执行故障转移操作。
选举领头sentinel遵循以下规则:
- 所有sentinel都有公平被选举成领头的资格
- 所有sentinel都有且仅有一次将某个sentinel选举成领头的机会(在一轮选举中),一旦你选举了某个sentinel为领头,不能更改。
- sentinel设置领头sentinel是先到先得,一旦当前sentinel设置了领头sentinel,以后要求设置sentinel为领头请求都会被拒绝。
- 每个发现服务客观下线的sentinel,都会要求其他sentinel将自己设置成领头。
- 当一个sentinel(源sentinel)向另一个sentinel(目标sentinel)发送is-master-down-by-addr ip port current_epoch runid命令的时候,runid参数不是*,而是sentinel运行id,就表示源sentinel要求目标sentinel选举其为领头。
- 源sentinel会检查目标sentinel对其要求设置成领头的回复,如果回复的leader_runid和leader_epoch为源sentinel,表示目标sentinel同意将源sentinel设置成领头。
- 如果某个sentinel被半数以上的sentinel设置成领头,那么该sentinel既为领头。
- 如果在限定时间内,没有选举出领头sentinel,暂定一段时间,再选举。
基于raft算法实现的选举。redis主从的时候,主挂了,选择一个从变成主,也是用的这个算法。
为什么要选领导者?
简单来说,就是因为只能有一个sentinel节点去完成故障转移。
sentinel is-master-down-by-addr这个命令有两个作用,一是确认下线判定,二是进行领导者选举。
选举过程:
1)每个做主观下线的sentinel节点向其他sentinel节点发送上面那条命令,要求将它设置为领导者。
2)收到命令的sentinel节点如果还没有同意过其他的sentinel发送的命令(还未投过票),那么就会同意,否则拒绝。
3)如果该sentinel节点发现自己的票数已经过半且达到了quorum的值,就会成为领导者
4)如果这个过程出现多个sentinel成为领导者,则会等待一段时间重新选举。
故障转移
选出新的主服务器
领头哨兵会将已下线的主服务器下的所有从服务器保存到一个列表中,然后按照以下规则,一项一项地对列表进行过滤:
- 删除列表中所有下线或者断线的从服务器。这样保证列表中剩余的从服务器都是正常在线的
- 删除列表中所有最近5秒没有回复过领头哨兵的info命令的从服务器。这样可以保证列表中的从服务器都是最近成功进行过通信的
- 删除所有与已下线服务器断开连接的时间超过 down-after-milliseconds * 10的。这样可以保证列表中剩余的从服务器中剩余的从服务保存的数据都是比较新的。
然后:
- 根据从服务优先级进行排序。选优先级最高的。
slave优先级配置文件配置
slave-priority 100
存在一样高的
- 根据从服务器的复制偏移量offset排序,选偏移量最大的。(最大说明复制的K/V最多最新)。
又存在一样的
- 根据从服务器运行ID排序。选运行ID最小的。一定能选出来了
修改从服务器的复制目标
新的主选完了。让从服务器变成新的主的从。完成完全复制动作。
如果老的主修好了,也会变成新的主的从,也执行完全复制动作。
网友评论