broker的高可用及高伸缩——kafka源码探究之二

高可用

高可用机制

Kafka在0.8以前的版本,并不提供高可用机制,一旦一个broker宕机,则宕机期间该broke上的所有partition均不可用。从0.8版本开始,kafka开始提供高可用机制。
Kafka的高可用是通过多副本机制保证的。每个topic下的partition都有主分区以及多个follower(该值可在创建topic时设置,也可后续动态修改),但replica数量不能大于broker数量。比如有3个broker,创建topic的replica必须小于等于3.
kafka的多副本机制是partition级别的,每个partition及其副本统称为replica,replica包括leader和follower,生产者和消费者都只和leader交互,其他副本只负责从leader处复制消息,leader宕机后由controller选举一个新的leader。(这一点和elasticsearch很相似)

broker宕机后controller处理流程

以下详细阐述某个broker宕机后kafka的处理流程:

  1. controller在zk的broker节点上注册了watch,一旦有broker宕机,对应的zk节点将被删除,controller获得回调通知(BrokerChangeListener),调用方法controller.onBrokerFailure.
  2. Controller获得宕机broker中作为leader的partition,置为OfflinePartition状态
  3. 选举宕机broker中作为leader partition的新leader,PartitionStateMachine#electLeaderForPartition,默认取ISR列表中的第一个replica。选举出新的leader后,更新zk以及controller缓存,最后构造leaderAndIsrRequest,rpc调用其他broker发送变动leader和isr的变动通知。其中leader选举算法如下:判断当前partition的ISR列表是否为空,如果不为空,选举ISR列表第一位replica作为leader;如果为空,判断配置是否允许选举非ISR列表的replica,不允许则直接抛出异常;允许则判断存活broker中非ISR的replica是否为空,为空直接抛出异常,不为空选举存活broker中replica的第一位作为leader
  4. 删除宕机broker中非laeder的partition,如果删除该replica后无leader,则把leader置为-1,更新zk,更新controller缓存,同时rpc通知其他broker

图片描述

高伸缩

高伸缩机制

kafka的高伸缩指的是broker的高伸缩,broker的高伸缩由本身的无状态保证。kafka中的broker集群可任意添加,并在下一次创建topic时分配partition,也可通过kafka提供的脚本手动调整原有topic的分区情况,降低原有broker的负载。
新增加broker对生产者和消费者是无感知的,对现有topic的分区和分片也无影响,不会自动做partition的rebalance。只有新的topic加入时才会用到。如果需要手动rebalance,可以使用kafka提供的脚本实现。命令如下:
./kafka-reassign-partitions.sh --zookeeper 192.168.2.231:2181 --topics-to-move-json-file topic.json --broker-list "0,1,2" --generate
./kafka-reassign-partitions.sh --zookeeper 192.168.2.231:2181 --topics-to-move-json-file topic.json --broker-list "0,1,2" --execute

新增broker(该broker上无partition)流程

  1. 新增broker启动后会自动在zookeeper上注册临时节点
  2. controller监听到zk节点发生变化,获取到新增broker的信息。给所有的broker发送新的broker metadata信息

新增broker(宕机后重启)流程

  1. 前面两步和broker上无partition的流程一致
  2. 获得新增broker的所有partition,并判断是否要重新选举这些partition的leader,假设需要重新选举,把新的leaderAndIsr信息发送到各broker

创建topic——kafka源码探究之一
https://segmentfault.com/a/11...

消息生产与消息存储——kafka源码探究之三
https://segmentfault.com/a/11...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值