redis - 哨兵(高可用)提了哨兵的作用以及简略配置,这边就讲一讲他的原理。

哨兵是怎么发现其余哨兵的

哨兵与哨兵之间,是须要晓得其余哨兵的衰弱状况以及信息的分享,咱们在后面的配置中,并没有看到其余哨兵地址的配置,只配置了master的地址。哨兵通过redis的Pub/Sub性能,发现也监督的master/slave的其余哨兵。
哨兵会往名字为__sentinel__:hello的Channel里发送hello,此时其余的哨兵就能够接管到音讯,并晓得其余哨兵的存在。

  • 每隔两秒,会向__sentinel__:hello的Channel发送音讯,内容包含ip, port, runid。
  • Hello音讯还包含主服务器的残缺以后配置。如果接管哨兵为给定的主服务器配置了比接管到的更老的配置,它会立刻更新到新的配置。
  • 每个哨兵会监听_sentinel__:hello的Channel的音讯,当他发现其余哨兵的信息时,就会被退出哨兵群里。
  • 退出哨兵群里之前,他会判断runid是否一样,或者ip+port是否一样,如果一样,旧的信息降被移除,用新的信息代替。

哨兵是怎么晓得master挂了

每个哨兵,都会给每个节点发送ping申请(上面只画了master,slave也会发送ping申请),如果节点在down-after-milliseconds(sentinel的配置,比方30秒)内没有响应sentinel-1的ping申请,则咱们认为他是被动下线了(SDOWN),如果sentinel-2也发现他没有响应ping申请了,此时两个sentinel大于等于quorum(此时是2),则咱们认为他是主观下线了(ODOWN)。也能够这么了解,比方路人甲认为路人乙很坏,可能是因为他跟路人乙有矛盾,主观的认为他坏,其他人可能并不认可他的想法,所以是主观下线。然而路人丙路人丁等少数人感觉路人很坏,那很可能路人乙真的坏,大家的评估是主观的,所以是主观下线。

那咱们以什么判断是达到了ODOWN的条件呢,就是咱们之前配置的Quorum,然而是否进行故障转移,也要思考到majority,也就是数量要达到majority才运行受权做故障转移。
比方有5个哨兵,Quorum设置为2,majority设置为3,此时master没响应哨兵的数量为2,曾经达到ODOWN的条件了,还是不能做故障转移,只有达到3的时候,才能够做故障转移。
如果Quorum设置为3,majority设置为2,此时master没响应哨兵的数量为2,尽管能够受权做故障转移,然而并没有达到ODOWN的条件,还是不能做故障转移。

哨兵是怎么选举master的

当master被认为是ODOWN的时候,哨兵会通过以下几个选举一个slave为master:

  1. 从master断开的工夫
  2. slave的优先级
  3. offset 的值
  4. Run ID

如果slave和master的断开工夫超过down-after-milliseconds的10倍+master的SDOWN的时长,则不思考切换为master,公示如下:

(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

slave被选举为master的程序如下:

  1. redis.conf配置的优先级,replica-priority越低优先级越高。
  2. 优先级一样,看offset,offset越大,阐明对master的同步数据越多。
  3. 看offset也一样,则抉择runid最小的,抉择最小的是为了在抉择的时候有更多的确定性,而不是随机选一个。

确定了哪个slave降级为master,那哨兵也是要从哨兵中选举一个来做这些操作的。

  1. 对应的slave执行slaveof no one,把slave的role移除,变为新的master。
  2. 告诉其余的slav指向新的master。
  3. 告诉应用程序指向新的master。
  4. 出故障的原master重启后,成为新master的slave节点。