写点什么

【年后跳槽必看篇 - 非广告】Kafka 核心知识点 第三章

作者:派大星
  • 2024-01-30
    北京
  • 本文字数:2679 字

    阅读完需:约 9 分钟

Kafka 为什么有 Topic 还用 Partition

Topic 和 Partition 是 Kafka 中国比较重要的概念


  • Topic:主题,是 Kafka 中承载消息的逻辑容器。可以理解为一个消息队列。生产者将消息发送到特定的 Topic,消费者从 Topic 中读取消息。Topic 可以被认为是逻辑上的消息流。在实际使用中多用来区分具体的业务。

  • Partition:分区,是 Topic 的物理分区。一个 Topic 可以被分成多个 Partition,每个 Partition 是一个有序且是持久化的存储日志文件。每个 Partition 都存储了一部分消息,并且有一个唯一的标识符(简称为 Partition ID)。


从上面简单的解释不难看出,这两个看上去其实都是消息的载体。那么为什么还要分为两层呢,有了 Topic 为什么还需要 Partition 呢?


在软件领域中,任何问题都可以加一个中间层来解决,而 Topic 和 Partition 就是类似的思想,在 Topic 的基础上,再细粒度的划分出了一层,主要有以下几个好处:


  1. 提高吞吐量:通过将一个 Topic 分成多个 Partition,可以实现消息的并行处理。每个 Partition 可以由不同的消费者进行独立消费,这样就可以提高整个系统的吞吐量。

  2. 负载均衡:Partition 的数量通常比消费者组的数量多,这样可以使每个消费者组中的消费者均匀地消费消息。当有新的消费者加入或离开消费者组时,可以通过重新分配 Partition 的方式进行负载均衡。

  3. 更好的扩展性:通过增加 Partition 的数量,可以实现 Kafka 集群的扩展。更多的 Partition 可以提高更高的并发处理能力和更大的存储容量。


综上所述,Topic 是消息的逻辑分类,而 Partition 是物理上的消息分区。通过 Topic 分成多个 Partition,可以实现提高吞吐量、负载均衡、以及由更好的扩展性。

什么是 Kafka 的重平衡机制?

Kafka 的重平衡机制是指再消费者组中新增或删除消费者时,Kafka 会重新分配 Topic Partition 给各个消费者,以保证每个消费者消费的分区数量尽可能均衡。


重平衡机制的目的时实现消费者的负载均衡和高可用性,以确保每个消费者都能够按照预期的方式消费到消息。


触发重平衡的 3 个条件:

  • 消费者组成员数量发生变化。

  • 订阅主题数量发生变化。

  • 订阅主题的分区数发生变化。


当 Kafka 集群要出发重平衡机制时,大致步骤如下:


  1. 暂停消费:在重平衡开始之前,Kafka 会暂停所有消费者的拉取操作,以确保不会出现重平衡期间的消息丢失或重复消费

  2. 计算分区分配方案:Kafka 集群会根据当前消费者组的消费者数量和 Topic Partition 数量,计算出每个消费者应该分配的分区列表,以实现分区的负载均衡

  3. 通知消费者:一旦分区分配方案确定,Kafka 集群会将分配方案发送给每个消费者,告诉它们需要消费的分区列表,并请求它们重新加入消费者组

  4. 重新分配分区:在消费者重新加消费者组后,Kafka 集群会将分区分配方案应用到实际的分区分配中,重新分配主题分区给消费者

  5. 恢复消费:最后,Kakfa 会恢复所有消费者的拉取动作,允许它们消费分配给自己的分区


Kafka 的重平衡机制能够有效地实现消费者的负载均衡和高可用性,提高消息的处理能力和可靠性。但是,由于平衡会带来一定的性能开销和不确定性,因此在设计应用时需要考虑到重平衡的影响,并采取一定的措施来降低重平衡的频率和影响。


在重平衡过程中,所有 Consumer 实例都会停止消费,等待重平衡完成。但是目前并没有什么好的办法来解决重平衡带来的 STW,只能尽量避免它的发生。

消费者的五种状态

Kafka 的 Consumer 实例的五种状态,分别是:



状态的流转过程:


Kafka 几种选举过程

在 Kafka 中常见的几种选举过程如下:

Partition Leader 选举

Kafka 中的每个 Partition 都有一个 Leader,负责处理该 Partition 的读写请求。在正常情况下,Leader 和 ISR 集合中的所有副本保持同步,Leader 接收到的消息也会被 ISR 集合中的副本所接收。当 Leader 副本宕机或者无法正常工作时,需要选举新的 Leader 副本来接管分区的工作。


Leader 选举的过程如下:


  • 每个参与选举的副本会尝试向 Zookeeper 上写入一个临时节点,表示它们正在参与 Leader 选举。

  • 所有写入成功的副本会在 Zookeeper 上创建一个序列号节点,并将自己的节点序列号写入该节点。

  • 节点序列号最小的副本会选为新的 Leader,并将自己的节点名称写入 Zookeeper 上的的 /broker/.../leader 节点中

Controller 选举

Kafka 集群中只能有一个 Controller 节点,用于管理分区的副本分配、leader 选举等任务。当一个 Broker 变成 Controller 后,会在 Zookeeper 的/controller 节点中记录下来。然后其它的 Broker 会实时监听这个节点,主要就是避免这个 Controller 宕机的话,就需要重新选举。


Controller 选举的过程如下:


  • 所有可用的 Broker 向 Zookeeper 注册自己的 ID,并监听 Zookeeper 中/Controller 节点的变化

  • 当 Controller 节点出现故障时,Zookeeper 会删除/controller 节点,这是所有的 Broker 都会监听到该事件,并开始争夺 Controller 的位置

  • 为了避免出现多个 Broker 同时竞选 Controller 的情况,Kafka 设计了一种基于 Zookeeper 的 Master-Slave 机制,其中一个 Broker 成为 Master,其它 Broker 成为 Slave,Master 负责选举 Controller,并将选举结果写入 Zookeeper 中,而 Slave 则监听/controller 节点的变化,一旦发现 Master 发生故障则开始争夺 Master 的位置

  • 当一个 Broker 发现 Controller 失效时,它会向 Zookeeper 写入自己的 ID,并尝试竞选 Controller 的位置。如果创建临时节点成功,则 Broker 成为新的 Controller,并将选举结果写入 Zookeeper 中

  • 其它的 Broker 会监听到 Zookeeper 中/controller 节点的变化,一旦发现选举结果发生变化,则更新自己的元素据信息,然后与新的 Controller 建立连接,进行后续操作

Kafka 中,为什么节点序列号最小的副本会被选为新的 Leader

在 Kafka 中,节点序列号最小的副本被选为新的 Leader 是因为 Kafka 使用了 Zookeeper 作为协调服务。在 Kafka 集群中,Zookeeper 负责维护集群的元数据(例如 Topic 和 Partition 信息)以及 Brokers(Kafka 服务器)的状态


当一个 Broker(副本)成为 Leader 候选人时,它会向 Zookeeper 注册自己并申请成为该分区的 Leader。在这个过程中,每个候选人都会创建一个临时带有递增序列号的 Zookeeper 节点,被称为选举竞争者(election contender)


当都选人注册完成后,它们会查询 Zookeeper 并比较自己的序列号与其他候选人的序列号。Kafka 采用基于递增序列号的最小值来选择新的 Leader。因此,具有最小序列号的候选人将成为新的 Leader,并负责处理该分区的所有读写请求


通过这种方式,Kafka 实现了简单而有效的 Leader 选举机制,确保了高可用性和数据一致性。选择序列号最小的副本作为 Leader 可以避免分区不一致的情况,并且能够迅速的恢复正常操作,因为 Zookeeper 节点序列号是唯一且递增的


如有问题,欢迎加微信交流:w714771310,备注- 技术交流  。或关注微信公众号【码上遇见你】。


好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

发布于: 刚刚阅读数: 7
用户头像

派大星

关注

微信搜索【码上遇见你】,获取更多精彩内容 2021-12-13 加入

微信搜索【码上遇见你】,获取更多精彩内容

评论

发布
暂无评论
【年后跳槽必看篇-非广告】Kafka核心知识点 第三章_kafka_派大星_InfoQ写作社区