在某些代理关闭后,如何更改主题领导者或删除分区?

时间:2019-10-02 13:12:12

标签: apache-kafka

我们有带有4个代理的kafka集群,以及一些具有复制因子1和10分区的主题。 在4个时刻中有2个时刻我们的装有kafka集群的服务器出现故障。 因此,现在我们有2个具有相同主题的经纪人。 当我m run command ./kafka_topics.sh --zookeeper localhost:2181 --describe i得到此消息时:

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

如何删除Leader 2 ... 4?还是我需要为此领导者删除分区,但是如何?

UPD ..

我们还使用kafka_exporter来监视带有prometheus的kafka。在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"

1 个答案:

答案 0 :(得分:0)

您可以使用Kafka的kafka-reassign-partitions.sh来做到这一点。您有两种方法,一种是生成新作业的提议,另一种是manually specifying领导特定分区。


第一种方法已经很好地说明了here,只是为了恢复它:

  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文件中。例如:

Proposed partition reassignment configuration

{"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. 执行建议的分区重新分配

让Kafka执行提案并移动分区。为此,执行:

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181
 --reassignment-json-file reassign-example.json --execute

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


第二种方法相当简单,但是您必须手动标识要重新分配的分区。例如,如果您希望将主题XXX的分区1移至代理5和6,则可以创建一个json文件(manual-reassign.json),例如:

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

启动方式与以前的方法相同

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181
 --reassignment-json-file manual-reassign.json --execute

希望有帮助!