我创建了3个kafka代理设置,代理id为20,21,22。然后我创建了这个主题:
bin/kafka-topics.sh --zookeeper localhost:2181 \
--create --topic zeta --partitions 4 --replication-factor 3
结果是:
当制作人向topiczeta发送消息“helloworld”时,kafka首先将消息写入哪个分区?
“hello world”消息会在所有4个分区中复制吗?
3个代理中的每个代理都包含所有4个分区?在上面的上下文中,这与复制因子3有什么关系?
如果我有8个并行运行在自己进程或线程中的消费者订阅了zeta主题,那么kafka如何分配分区或代理来并行服务这些进程或线程?
2条答案
按热度按时间ffscu2ro1#
复制和分区是两码事。
复制将跨集群复制相同的数据,以获得更高的可用性/持久性。分区是kafka在集群中分发非冗余数据的方法,它随着分区的数量而扩展。
当制作人向topiczeta发送消息“helloworld”时,kafka首先将消息写入哪个分区?
当您向某个主题发送“helloworld”消息时,默认情况下,生产者会根据该消息的键应用哈希算法(如
hash(key) % number_of_partitions
). 如果您没有提供密钥,生产者将执行循环,因此无法预测消息将发送到哪个分区。我猜如果这是第一条消息,它将在分区0中结束。“hello world”消息会在所有4个分区中复制吗?
这一条消息将在所有副本中复制,但不会复制到4个分区。
您将在代理20、21、22上找到该消息。但是,每个分区都有一个引线,负责从该分区到该分区的所有读写操作。在屏幕截图中,您还可以发现每个分区的负责人的代理id。从
Leader: 21
用于分区0
可以看出分区的负责人坐在代理上21
.3个代理中的每个代理都包含所有4个分区?在上面的上下文中,这与复制因子3有什么关系?
由于您已将复制因子设置为3,而集群中总共有3个代理,所以所有三个代理都包含所有四个分区。同样,分区和副本之间也有区别。您可以有一个带有单个代理的kafka“集群”,并且在主题中仍然有20个分区。
如果我有8个并行运行在自己进程或线程中的消费者订阅了zeta主题,那么kafka如何分配分区或代理来并行服务这些进程或线程?
这取决于这8个消费者是否属于同一消费群体。重要的是要知道一个分区最多只能由一个使用者线程从特定的使用者组中读取。
如果所有8个使用者都属于同一个组,则其中4个将从一个分区(仅从分区负责人处)读取数据,另外4个将处于空闲状态。
pwuypxnk2#
Kafka的主题在内部划分为若干个分区。partitions允许您通过将特定主题中的数据跨另一端的多个代理进行拆分来并行化主题replica是您希望实现容错的每个分区的副本数如果出现故障,每个分区都有一个首选的前导,负责处理来自kafka的所有写入和读取请求客户。
如果前导节点出现故障,isr(同步副本)列表中的一个副本将升级为前导节点,直到恢复首选前导节点,并且它将捕获故障后生成的所有新数据。
回答您的问题:
当制作人向topiczeta发送消息“helloworld”时,kafka首先将消息写入哪个分区?
生产者负责选择将哪个记录分配给主题中的哪个分区。这可以简单地以循环方式来平衡负载,也可以根据一些语义划分函数来完成。
“hello world”消息会在所有4个分区中复制吗?
消息“helloworld”将只写入一个主题分区,然后复制到该分区的所有副本。
3个代理中的每个代理都包含所有4个分区?在上面的上下文中,这与复制因子3有什么关系?
每个代理将是1个分区的前导,其他3个将包含该分区的副本。在您的输出中,如果您注意到isr列表,那么列表中的第一个id是分区的当前前导,另外两个id是该分区的副本所在的跟随者
如果我有8个并行运行在自己进程或线程中的消费者订阅了zeta主题,那么kafka如何分配分区或代理来并行服务这些进程或线程?
如果所有8个消费者都在同一消费者组中,则其中只有4个会收到数据。这是因为分区的数目是4。kafka确保每个分区只分配给使用者组中的一个使用者。当分配了分区的使用者崩溃时,分区被重新分配给另一个使用者。如果使用者都是独立客户机,则主题的所有4个分区都分配给每个使用者。
我希望这是有用的:)