我创建了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”消息是否在所有四个分区中复制?
3个代理中的每个代理都包含所有4个分区?在上述情况下,它与3的复制因子有什么关系?
如果我有8个使用者在他们自己的进程或线程中并行运行并订阅了zeta主题,那么Kafka如何分配分区或代理来并行服务这些人?
答案 0 :(得分:1)
复制和分区是两个不同的东西。
复制将在整个集群中复制相同的数据,以提高可用性/耐久性。 分区是Kafka在整个群集中分配非冗余数据的方式,并且会随着分区数量的增加而扩展。
当生产者向主题zeta发送消息“ hello world”时,Kafka首先将消息写入哪个分区?
默认情况下,当您向主题发送“ hello world”消息时,生产者将基于该消息的键(例如hash(key) % number_of_partitions
)应用哈希算法。如果您没有提供密钥,则生产者将进行轮询,因此无法预测消息将发送到哪个分区。我想如果这是第一则消息,它将最终出现在分区0中。
“ hello world”消息是否在所有四个分区中复制?
这条消息将在所有副本中复制,但不会复制到4个分区。
您将在代理20、21、22上找到该消息。但是,每个分区都有一个领导者,负责处理该分区的所有读写操作。在屏幕快照中,您还可以发现每个分区的负责人的经纪人ID。从Leader: 21
的分区0
中,您可以知道该分区的负责人位于代理人21
上。
3个代理中的每个代理都包含所有4个分区?在上述情况下,它与3的复制因子有什么关系?
在将复制因子设置为3的同时,群集中总共有3个代理,所以所有三个代理都包含所有四个分区。同样,分区和副本之间是有区别的。您可能只有一个经纪人就拥有一个Kafka“集群”,但在该主题中仍然有20个分区。
如果我有8个使用者在他们自己的进程或线程中并行运行并订阅了zeta主题,那么Kafka如何分配分区或代理来并行服务这些人?
在此取决于这8个消费者是否属于同一个消费者组。重要的是要知道,一个分区最多只能由来自特定使用者组的一个使用者线程读取。
如果所有8个使用者都属于同一组,则其中4个使用者将从一个分区读取(仅从分区领导者读取),而其他四个则处于空闲状态。
答案 1 :(得分:1)
Kafka主题在内部分为多个分区。 分区允许您通过跨多个代理将特定主题中的数据拆分来并行化主题 另一方面,副本是您希望在发生故障时实现容错能力的每个分区的副本数 每个分区都有一个首选的领导者,负责处理来自kafka客户端的所有写入和读取请求。
万一领导节点发生故障,ISR(同步副本)列表中的一个副本将被提升为领导,直到首选的领导节点被恢复,并追上自故障以来生成的所有新数据。
要回答您的查询:
当生产者向主题zeta发送消息“ hello world”时,Kafka首先将消息写入哪个分区?
生产者负责选择将哪个记录分配给主题中的哪个分区。可以以循环方式完成此操作,仅是为了平衡负载,也可以根据某些语义分区函数来完成。
“ hello world”消息是否在所有四个分区中复制?
消息“ hello world”将仅写入1个主题分区,然后再复制到该分区的所有副本。
3个代理中的每个代理都包含所有4个分区?在上述情况下,它与3的复制因子有什么关系?
每个代理将成为1个分区的领导者,而其他3个将包含该分区的副本。在输出中,如果您注意到ISR列表,则列表中的第一个ID是该分区的当前领导者,其他2个是该分区的副本所在的跟随者
如果我有8个使用者在他们自己的进程或线程中并行运行并订阅了zeta主题,那么Kafka如何分配分区或代理来并行服务这些人?
如果所有8个使用者都在同一个使用者组中,那么只有4个将接收数据。这是因为分区数为4。Kafka确保将每个分区仅分配给使用者组中的1个使用者。当分配了分区的使用方崩溃时,该分区将重新分配给另一个使用方。 如果使用者都是独立客户端,则将主题的所有4个分区分配给每个使用者。
我希望这会有所帮助:)