Kafka 分区和 Kafka 副本有啥区别?
Posted
技术标签:
【中文标题】Kafka 分区和 Kafka 副本有啥区别?【英文标题】:What is the difference between Kafka partitions and Kafka replicas?Kafka 分区和 Kafka 副本有什么区别? 【发布时间】:2020-11-19 20:28:04 【问题描述】:我创建了 3 个 Kafka 代理设置,代理 ID 为 20、21、22。然后我创建了这个主题:
bin/kafka-topics.sh --zookeeper localhost:2181 \
--create --topic zeta --partitions 4 --replication-factor 3
导致:
当生产者向 zeta 主题发送消息“hello world”时,消息首先被 Kafka 写入哪个分区?
“hello world”消息被复制到所有 4 个分区中?
3 个代理中的每个代理都包含所有 4 个分区?在上述情况下,这与 3 的复制因子有何关系?
如果我有 8 个消费者在他们自己的进程中运行或并行订阅 zeta 主题的线程,Kafka 如何分配分区或代理来并行服务这些?
【问题讨论】:
【参考方案1】:Kafka 主题在内部被划分为多个分区。 分区允许您通过跨多个代理拆分特定主题中的数据来并行化主题 另一方面,副本是您希望在发生故障时实现容错的每个分区的副本数 每个分区都有一个首选领导者,负责处理来自 kafka 客户端的所有写入和读取请求。
如果领导节点发生故障,ISR(同步副本)列表中的一个副本将被提升为领导节点,直到首选领导节点恢复并赶上自故障以来生成的所有新数据。
回答您的问题:
当生产者向 zeta 主题发送消息“hello world”时,消息首先被 Kafka 写入哪个分区?
生产者负责选择将哪条记录分配给主题中的哪个分区。这可以简单地以循环方式完成负载平衡,也可以根据一些语义分区函数来完成。
“hello world”消息被复制到所有 4 个分区中?
消息“hello world”将仅写入 1 个主题分区,然后复制到该分区的所有副本。
3 个代理中的每个代理都包含所有 4 个分区?在上述情况下,这与 3 的复制因子有何关系?
每个代理将成为 1 个分区的领导者,另外 3 个将包含该分区的副本。如果您注意到 ISR 列表,则在您的输出中,列表中的第一个 id 是分区的当前领导者,另外 2 个是该分区副本所在的追随者
如果我有 8 个消费者在他们自己的进程中运行或并行订阅 zeta 主题的线程,Kafka 如何分配分区或代理以并行服务这些?
如果所有 8 个消费者都在同一个消费者组中,那么其中只有 4 个会收到数据。这是因为分区数为 4。Kafka 确保每个分区仅分配给消费者组中的 1 个消费者。当分配了分区的消费者崩溃时,该分区被重新分配给另一个消费者。 如果消费者都是独立客户端,则主题的所有 4 个分区都分配给每个消费者。
我希望这会有所帮助:)
【讨论】:
【参考方案2】:复制和分区是两个不同的东西。
复制 将在集群中复制相同的数据以获得更高的可用性/耐用性。 分区是 Kafka 在集群中分配非冗余数据的方式,它会随着分区的数量而扩展。
当生产者向主题 zeta 发送消息“hello world”时,消息首先被 Kafka 写入哪个分区?
当您向主题发送“hello world”消息时,默认情况下,您的生产者会根据该消息的键(如hash(key) % number_of_partitions
)应用散列算法。如果您没有提供密钥,生产者将进行循环,因此无法预测消息将发送到哪些分区。我猜如果它是第一条消息,它将在分区 0 中结束。
“hello world”消息被复制到所有 4 个分区中?
这条消息将在您的所有副本中复制,但不会复制到 4 个分区。
您会在代理 20、21、22 上找到该消息。但是,每个分区都有一个领导者,负责对该分区的所有读取和写入。在您的屏幕截图中,您还可以发现每个分区领导者的代理 ID。从Leader: 21
for partition 0
可以看出,该分区的领导者位于代理21
。
3 个代理中的每个代理都包含所有 4 个分区?在上述情况下,这与 3 的复制因子有何关系?
由于您已将复制因子设置为 3,而集群中总共有 3 个代理,因此所有三个代理都包含所有四个分区。同样,分区和副本之间存在差异。您可以拥有一个带有单个代理的 Kafka“集群”,并且主题中仍然有 20 个分区。
如果我有 8 个消费者在他们自己的进程中运行或并行订阅 zeta 主题的线程,Kafka 如何分配分区或代理以并行服务这些?
这取决于这 8 个消费者是否属于同一个消费者组。重要的是要知道一个分区最多可以被来自特定消费者组的一个消费者线程读取。
如果所有 8 个消费者都属于同一个组,则其中 4 个会从一个分区读取(仅从分区领导者),另外 4 个将处于空闲状态。
【讨论】:
以上是关于Kafka 分区和 Kafka 副本有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章