以下是主题 xx_json_topic 的分区信息。这是一个包含三个节点的Kafka群集。
所有节点:
Topic: xx_json_topic PartitionCount:4 ReplicationFactor:2 Configs:
Topic: xx_json_topic Partition: 0 Leader: 1 Replicas: 3,1 Isr: 3,1
Topic: xx_json_topic Partition: 1 Leader: 2 Replicas: 1,2 Isr: 2,1
Topic: xx_json_topic Partition: 2 Leader: 2 Replicas: 2,3 Isr: 2,3
Topic: xx_json_topic Partition: 3 Leader: 3 Replicas: 3,2 Isr: 2,3
此时..如果我关闭节点" node-1" ..看起来如下:
Topic: xx_json_topic PartitionCount:4 ReplicationFactor:2 Configs:
Topic: xx_json_topic Partition: 0 Leader: 3 Replicas: 3,1 Isr: 3
Topic: xx_json_topic Partition: 1 Leader: 2 Replicas: 1,2 Isr: 2
Topic: xx_json_topic Partition: 2 Leader: 2 Replicas: 2,3 Isr: 2,3
Topic: xx_json_topic Partition: 3 Leader: 3 Replicas: 3,2 Isr: 2,3
我的问题是..如果kafka知道节点1已经关闭并且它需要保持复制因子,它不会使节点3成为分区-1&&的复制品。 node-2是partition-0的副本,然后使node-3和node-2成为他们的Isr?
的一部分或者你认为卡夫卡并不承诺...... 如果复制因子是2 ..这并不意味着数据将始终在至少2个节点中可用(如Cassandra中的一致性级别)。
答案 0 :(得分:3)
你是对的,这不是Kafka中处理复制因子的方式。为主题指定复制因子2时,将在2个代理上创建该主题的分区(并且群集控制器会尝试将它们分散到群集上)。那时,一个人成为领导者,一个人成为追随者。这并不保证总会有两个分区副本,它只指定创建两个副本,并且如果所有副本都不存在,代理将通知您(通过重复不足的分区计数mbean)。
Kafka不会对群集执行任何自动修复,但如果您有一个分区的多个副本,并且领导者副本变得不可用,则其中一个关注者将接管为领导者。然而,当领导者回来时,它将不会恢复领导(它成为追随者)。同样,群集不会创建新的副本。这可能是一项资源密集型操作,因为需要将大量数据通过网络移动到新副本。
虽然可以选择执行自动领导者重新平衡,但没有相同的选项来执行自动副本创建。