我正面临一些与卡夫卡有关的问题。我创建了一个包含2个分区和1个副本的主题来测试kafka行为。
kafka_2.10-0.9.0.0/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic t1
检索主题相关数据我得到了这个:
kafka_2.10-0.9.0.0/bin/kafka-topics.sh --describe --topic t1 --zookeeper localhost:2181
Topic:t1 PartitionCount:2 ReplicationFactor:1 Configs:
Topic: t1 Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: t1 Partition: 1 Leader: 1 Replicas: 1 Isr: 1
如果我关闭经纪人0,有时主题相关数据保持不变,即使从经纪人1的日志中我可以看到字符串“已成功当选为 领导者“,而其他时候他们改变如下:
kafka_2.10-0.9.0.0/bin/kafka-topics.sh --describe --topic t1 --zookeeper
Topic:t1 PartitionCount:2 ReplicationFactor:1 Configs:
Topic: t1 Partition: 0 Leader: -1 Replicas: 0 Isr:
Topic: t1 Partition: 1 Leader: 1 Replicas: 1 Isr: 1
确定第一个行为是错误的(因为ISR 0不存在)。预期的行为应该是什么?如果第二个是正确的,那么从那一刻起所有发送的消息都将在分区1上结束是真的吗?
在两种情况下用
分析zookeper fsls /brokers/ids
它只显示了经纪人1
答案 0 :(得分:1)
您创建了主题,其中1为复制因子。这意味着每个分区仅存在于1个代理上。
所以在你的例子中,如果你取消经纪人0,t1-0变为离线,其领导者是-1(无)并且它没有Isr。在此阶段,没有客户端可以使用它来发送或接收消息。所以你上面粘贴的行为是预料之中的。
您描述的第一个行为是不正确的。由于您没有粘贴任何相关输出,因此很难说清楚发生了什么。
如果您希望在关闭1个代理时分区保持可用,则需要增加复制因子(在您的示例中为2)。
答案 1 :(得分:0)
突出Mickael所说的,复制因子不是你的分区除了领导者之外的副本数量;复制因子是分区将包含的副本的总数。
所以你在这里复制的行为是正确的。每个分区只有一个副本(领导者一个),如果相关代理发生故障,分区完全脱机,因此没有领导者(-1)没有ISR。