6.3.2. 重新分配分区
kafka-reassign-partitions.sh
工具用于将分区重新分配给不同的代理。
它有三种不同的模式:
--generate
- 取一组主题和代理,并生成 重新分配 JSON 文件,该文件将导致这些主题的分区分配给这些代理。这是生成 重新分配 JSON 文件 的一种简单方法,但它作用于整个主题,因此使用它不一定是合适的。
--execute
- 取 重新分配 JSON 文件 并将其应用到集群中的分区和代理。正在获得分区的代理将成为分区领导者的追随者。对于给定分区,新代理一旦发现并加入 ISR 后,旧的代理将停止作为追随者并删除其副本。
--verify
-
使用与
--execute
步骤相同的 重新分配 JSON 文件,--verify
检查文件中的所有分区是否已移到预期的代理中。如果重新分配完成后,它也会移除任何生效的 节流。除非被删除,否则节流将继续影响群集,即使重新分配完成后也是如此。
在任意给定时间只能在集群中运行一个重新分配,且无法取消正在运行的重新分配。如果您需要取消重新分配,必须等待它完成,然后执行另一个重新分配来恢复第一个分配的效果。kafka-reassign-partitions.sh
将输出这个重新版本的重新分配 JSON 作为其输出的一部分。在需要停止进行中的重新分配时,应将非常大的重新分配分成几个较小的重新分配。
6.3.2.1. 重新分配 JSON 文件
重新分配 JSON 文件 有一个特定的结构:
{
"version": 1,
"partitions": [
<PartitionObjects>
]
}
其中 <PartitionObjects> 是一个用逗号分开的对象列表,例如:
{ "topic": <TopicName>, "partition": <Partition>, "replicas": [ <AssignedBrokerIds> ], "log_dirs": [<LogDirs>] }
"log_dirs"
属性是可选的,用于将分区移到特定的日志目录中。
以下是重新分配 JSON 文件的示例,该文件分配主题 topic-a
,分区 4
分配给代理 2
、4
和 7
,以及主题 topic-b
分区 2
分配给代理 1
、5
和 7
:
{ "version": 1, "partitions": [ { "topic": "topic-a", "partition": 4, "replicas": [2,4,7] }, { "topic": "topic-b", "partition": 2, "replicas": [1,5,7] } ] }
JSON 中没有包括的分区不会更改。