Kafka的Controller & Leader副本选举 & ZooKeeper

kafka

Controller Broker

回顾已知信息,kafka集群由多个broker服务器组成。集群中会有一个controller broker,去均衡每个broker上的每个主题下分区leader副本的分布(应使同topic下的不同分区的leader副本分布在不同的broker)、创建主题、删除主题、调整其他broker等

  • 均衡leader分区:当有其他broker故障时,其所含有的分区leader副本无法提供服务,需要选一个新的leader副本,可能会导致新的leader副本所在broker存在该主题的多个分区leader副本,影响其性能;broker可能故障立马上线,controller为了均衡可能会出现换leader分区的情况,将故障的分区副本重新选举为leader,这是个耗时的过程,建议在生产环境中关闭该设置
  • controller broker的选定:每个broker都有成为controller的机会,先成功创建即为controller,需要定时向zookeeper发送心跳,如果zookeeper发现无心跳会认为故障,发出重新选择的通知,这时也是哪个先成功创建,哪个broker是controller,并将controller成功创建的信息发布给所有的broker;可能原本zookeeper认为故障的controller并没有故障而是在进行GC,一直gc到新的controller创建,因此该broker并没收到新的controller创建的通知,仍然认为自身就是controller;
    • 此时就有两个controller,针对该情况,每个controller创建时zookeeper会给予一个epoch值,该值是一个单调递增的值,其他broker在接收信息时,如果发现有两个不同的broker都以controller的身份发布通知,就会通过epoch值来判断哪个才是真正的controller,即epoch值最大的才会被认为是真正的controller

leader副本的选举

kafka实现高可用和可靠性的手段之一就是它的副本机制,一个分区含有一个leader副本,其余皆为follower副本,不向外提供服务。其中详细的介绍,可查看该博客kafka 可靠性保证
这里再简单说明一下副本机制:

每个分区的leader负责维护和跟踪ISR中所有follower滞后的状态。当producer发送一条消息到broker后,leader写入消息并复制到ISR中所有follower。消息复制延迟受最慢的follower限制,重要的是快速检测慢副本,follower从leader同步数据有一些延迟时间,任意一个超过阈值replica.lag.time.max.ms都会把follower剔除出ISR,移入OSR。

当leader副本crash时,就需要从follower副本中选举出一个新的leader副本,其中这涉及到一个参数unclean.eader.election = false/true,false表明leader副本只能从ISR列表中选取一个follower副本;true则表明也可从OSR列表中选取,即所有的follower副本都有可能成为leader副本,但可能会存在选举成功的新leader副本没有完全同步到原本leader副本中对消费者可见的数据。
极端情况下,如果该分区中ISR中的所有副本都crash了,那么数据的一致性与可靠性就无法保证了,如果此时想确保系统的可用性,就得允许leader副本能从OSR中选取,即设置unclean.eader.election = true,这实际是在系统可用性和数据可靠性之间做的取舍

Kafka架构中的Zookeeper

在基于 Kafka 的分布式消息队列中,ZooKeeper 的作用有 Broker 注册、Topic 注册、Producer 和 Consumer 负载均衡、维护 Partition 与 Consumer 的关系、记录消息消费的进度以及 Consumer 注册等。

kafka中有消费者组的概念,一个主题的分区只能被消费者组中的一个消费者消费,消费的消费者并不固定,可能是消费者组中的任意一个(具体看均衡策略),但强调每个分区只能被其中一个消费者消费,这只是在消费者组的层次下。不同消费者组间并没有该约束。

  • Consumer 负载均衡:借助 ZooKeeper 实现负载均衡
    • Consumer Group、Consumer、Broker 都会在 ZooKeeper 中注册节点,基于 ZooKeeper 提供的 Watcher,Consumer 可以监听同一 Group 中 Consumers 的变化,以及 Broker 列表的变化。
    • kafka内部实现了均衡分配消费者消费指定分区:
      • 如果有3个Partition, 同一个消费组有3个消费者,消费者与分区一一对应关系
      • 如果有3个Partition, 同一个消费组有2个消费者,则其中一个消费者消费2个分区的数据,另一个消费者消费一个分区的数据;
      • 如果有2个Partition, 同一个消费组有3个消费者,则其中有一个消费者空闲,另外2个消费者消费分别各自消费一个分区的数据
      • 正因如此,不推荐消费者组的消费者数量超过分区数量,应小于等于分区数量,否则就会造成有消费者的闲置

猜你喜欢

转载自blog.csdn.net/weixin_47407737/article/details/128192275