某个代理宕机后如何更改主题领导者或删除分区?

Ser*_*gey 5 apache-kafka apache-zookeeper

我们有一个带有 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
Run Code Online (Sandbox Code Playgroud)

如何删除Leader 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"
Run Code Online (Sandbox Code Playgroud)

ara*_*ran 5

你可以使用 Kafkakafka-reassign-partitions.sh来做到这一点。您有两种方法,一种是生成新分配的建议,另一种是手动指定特定分区的领导者。


1 . 生成提案

第一种方法,如kafka docs 中所指定,遵循以下逻辑:

1.1 生成提议的分区重新分配配置

首先,您应该创建一个 json 文件,例如链接中提供的文件。让我们命名它topics.json

{
  "topics": [{"topic": "foo1"},
            {"topic": "foo2"}],
  "version":1
}
Run Code Online (Sandbox Code Playgroud)

这将告诉 kafka 您愿意从哪些主题重新分配其分区。在示例中,他希望 Kafka 为主题foo1和提出建议foo2

使用该 json,调用该工具并在命令中设置活动代理列表:

kafka-reassign-partitions.sh --zookeeper $ZK_HOSTS 
--topics-to-move-json-file topics.json --broker-list "1,2,3,4,5" --generate
Run Code Online (Sandbox Code Playgroud)

这将输出 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]}]
}
Run Code Online (Sandbox Code Playgroud)

如果您愿意(或认为这是正确的做法,因为该工具并不完美),您可以手动修改某些分配。将 json 保存到一个文件中,例如,reassign-example.json将在下一步中使用。

1.2. 执行提议的分区重新分配

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

bin/kafka-reassign-partitions.sh --zookeeper $ZK_HOSTS 
 --reassignment-json-file reassign-example.json --execute
Run Code Online (Sandbox Code Playgroud)

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


2 . 说明书规格

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

{"version":1,"partitions":[{"topic":"XXX","partition":1,"replicas":[5,6]}]}
Run Code Online (Sandbox Code Playgroud)

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

bin/kafka-reassign-partitions.sh --zookeeper $ZK_HOSTS 
 --reassignment-json-file manual-reassign.json --execute
Run Code Online (Sandbox Code Playgroud)