选举算法汇总(redis、zookeeper、kafka)

1.redis 哨兵(sentinel)模式

  • 背景:哨兵模式,节点类型包括master、slave、和sentinel,master-slave节点和主从模式的作用是相同的;多了sentinel节点提高服务的可用性和稳定性
  • 触发原因:master(简称A节点)节点异常,当一个sentinel发现A节点ping异常,视为主观下线状态,并广播给其他sentinel,如果超过一定数量(可配置)的sentinel都视为主管下线,则节点A被置为客观下线;需要重新选出一个master节点。
  • 目标:从节点A的slave节点中选择一个节点作为新的master
  • 选举过程:
    • 第一步选举出领头sentienl
      • 所有在线的sentinel都有资格当选领头sentinel
      • 每个sentinel在每轮配置纪元只能选举一次
      • 每个发现master下线的sentinel都要求其他sentinel将自己设置为领头sentinel
      • 先到先得:第一个要求某目标sentinel将自己设置为领头sentinel会成功,后来的请求会被拒绝
      • 如果某个sentinel被过半sentinel设置为了领头sentinel,那么这个sentinel将成为领头sentinel
      • 如果这轮没成功选出,纪元加1,进行下一轮
    • 第二步领头sentinel从slave中选举出新master(是从该master的slave列表中选)
      • 删除不在线的slave
      • 删除5秒内没有和领头sentine通信的slave
      • 删除所有和已下线的master断开链接超过指定时间(可配置)的slave
      • 如果还剩多个,找到复制偏移量最大的slave(保证数据最新)
      • 如果复制偏移量最大的slave有多个,选择运行id最小的

  

2. redis 集群模式

  • 背景:集群模式下节点也是master-salve结构,slave用于复制master节点,并在master节点下线后,代替master继续运行
  • 触发原因:处理槽位的某个主节点未收到另外一个主节点的pong信息,将其标为疑似下线;当某个节点被半数以上处理槽位的主机点标记为疑似下线,则该节点被判定为客观下线。需要从其slave中选举一个新的master。
  • 选举过程:
    • 一个配置纪元表示一轮选举,配置纪元从0开始
    • 当从节点发现其复制的主节点下线时,该从节点会广播一条信息,要求有投票权的主节点将自己选举为新的主节点
    • 有投票权的主节点会将收到的第一个请求的从节点选举为主节点
    • 若某个从节点被超过半数有投票权的主节点选举为主节点,则该从节点即成功新的主节点;否则进行下一轮

 

3. zookeeper的leader选举

  • 背景:zookeeper集群节点有三种角色:leader、follower、observer;其中只有leader节点能处理事务性请求并管理集群;当leader节点下线时,需要从所有的follower节点中选择一个新的leader(其中observer不参与选择和事务投票,只用来扩展集群的非事务处理能力)。zookeeper选择了cp,舍弃了a
  • 触发原因:leader节点下线,集群无法对外提供服务
  • 选举过程:
    • 所有follower节点都被设置为looking状态,表示要进行leader选举
    • 所有的follower节点都向其他follower节点广播消息,消息中包含<myid, zxid>,其中myid是机器id;zxid是事务id
    • 收到消息的follower节点将收到的zxid和自己的zxid对比,选择zxid大的;如果zxid一样,则选择myid大的,然后将<myid, zxid>重新广播出去
    • 统计投票,如果某个follower被半数以上follower选择,则该follower将成为新的leader
    • 改变服务器状态,分别对应为leading、following,集群开始对外服务。

 

4.kafka 优先副本选举

  • 背景:kafka每个分区有多个副本,包括一个leader副本和多个follow副本,且每个副本分配在不同的broker上,保证可靠性。只有leader副本对外提供读写服务,follow副本用来同步leader副本;因此一旦leader副本不可用,该分区就不可用;leader副本坐在的节点叫做leader节点;follow副本所在的节点叫做follow节点;优先副本即AR集合中的第一个副本;
  • 触发原因:刚开始各分区的leader副本均衡分布在各个节点,保证集群负载的均衡性;但随着节点的上下线,这种平衡被逐渐打破,导致负载不均衡;当不均衡达到设置的阈值时(即某个broker的非优先副本的leader个数/副本数 > 10%),需要进行优先副本选举,以达到分区平衡。
  • 选举过程:
    • 生成环境不建议打开优先副本选举的开关,防止对线上产生影响;建议在合适的时机进行手动操作,实现分区平衡。
posted @ 2023-04-19 22:08  Katsu  阅读(264)  评论(0编辑  收藏  举报