Zookeeper 如何改变主题领导人或删除分区后,一些代理关闭?

pbgvytdp  于 2022-12-09  发布在  Apache
关注(0)|答案(1)|浏览(126)

我们有一个Kafka集群,其中有4个代理和一些主题,副本因子为1,分区为10。在某个时刻,我们有4个服务器中的2个服务器发生了故障。所以现在我们有2个代理和相同的主题。当i m run command ./kafka_topics.sh --zookeeper localhost:2181 --describe i m得到:

Topic:outcoming-notification-error-topic        PartitionCount:10       ReplicationFactor:1     Configs:
    Topic: outcoming-error-topic       Partition: 0    Leader: 2       Replicas: 2     Isr: 2
    Topic: outcoming-error-topic       Partition: 1    Leader: 3       Replicas: 3     Isr: 3
    Topic: outcoming-error-topic       Partition: 2    Leader: 4       Replicas: 4     Isr: 4
    Topic: outcoming-error-topic       Partition: 3    Leader: 1       Replicas: 1     Isr: 1
    Topic: outcoming-error-topic       Partition: 4    Leader: 2       Replicas: 2     Isr: 2
    Topic: outcoming-error-topic       Partition: 5    Leader: 3       Replicas: 3     Isr: 3
    Topic: outcoming-error-topic       Partition: 6    Leader: 4       Replicas: 4     Isr: 4
    Topic: outcoming-error-topic       Partition: 7    Leader: 1       Replicas: 1     Isr: 1
    Topic: outcoming-error-topic       Partition: 8    Leader: 2       Replicas: 2     Isr: 2
    Topic: outcoming-error-topic       Partition: 9    Leader: 3       Replicas: 3     Isr: 3

我怎么能删除领导人2...4?或者可能是我需要删除此领导人的分区,但如何?
警方...
我们还使用Kafka_exporter来监控kafka与prometheus。在kafka_exporter日志中的2个代理程序关闭后,我们得到以下错误:

level=error msg="Cannot get oldest offset of topic outcoming-error-topic partition  10: kafka server: In the middle of a leadership election, there is currently no leader for this partition and hence it is unavailable for writes." source="kafka_exporter.go:296"
9vw9lbht

9vw9lbht1#

你可以用Kafka的kafka-reassign-partitions.sh来做这件事。你有两种方法,一种是生成一个新任务的建议,另一种是手动指定特定分区的领导者。

1 .生成建议

第一种方法,如Kafka文献中所述,遵循以下逻辑:
1.1生成建议的分区重新分配配置
首先,你应该创建一个json文件,比如链接中提供的,我们将其命名为topics.json

{
  "topics": [{"topic": "foo1"},
            {"topic": "foo2"}],
  "version":1
}

这将告诉Kafka您愿意从哪些主题重新分配分区。在示例中,他希望Kafka为主题foo1foo2提出建议。
使用该json,调用该工具并在命令中设置活动代理列表:

kafka-reassign-partitions.sh --zookeeper $ZK_HOSTS 
--topics-to-move-json-file topics.json --broker-list "1,2,3,4,5" --generate

这将输出Kafka的建议,您可以将其保存到另一个.json文件中。例如:

{
  "version":1,
  "partitions":[{"topic":"foo1","partition":2,"replicas":[5,6]},
              {"topic":"foo1","partition":0,"replicas":[5,6]},
              {"topic":"foo2","partition":2,"replicas":[5,6]},
              {"topic":"foo2","partition":0,"replicas":[5,6]},
              {"topic":"foo1","partition":1,"replicas":[5,6]},
              {"topic":"foo2","partition":1,"replicas":[5,6]}]
}

如果你愿意的话,你可以手动修改一些赋值(或者认为这样做是正确的,因为这个工具并不完美)。将json保存到一个文件中,例如reassign-example.json,它将在下一步中使用。
1.2.执行建议的分区重新分配
让我们让Kafka执行这个提议并移动分区。为此,执行:

bin/kafka-reassign-partitions.sh --zookeeper $ZK_HOSTS 
 --reassignment-json-file reassign-example.json --execute

这将执行reassign-example.json文件中定义的分区移动。

2.说明书说明

第二种方法比较简单,但您必须手动识别要重新指派的分割区。例如,如果您要将主题XXX的分割区1移至代理程式5和6,您可以建立json档案(manual-reassign.json),如下所示:

{"version":1,"partitions":[{"topic":"XXX","partition":1,"replicas":[5,6]}]}

它的启动方式与前面的方法相同:

bin/kafka-reassign-partitions.sh --zookeeper $ZK_HOSTS 
 --reassignment-json-file manual-reassign.json --execute

相关问题