创建主题之后我们还可以修改分区的个数,同样可以修改副本因子(副本数)。修改副本因子的使用场景也很多,比如在创建主题时填写了错误的副本因子数而需要修改,再比如运行一段时间之后想要通过增加副本因子数来提高容错性和可靠性。
前面主要讲述了分区重分配的相关细节,本节中修改副本因子的功能也是通过重分配所使用的 kafka-reassign-partition.sh 脚本实现的。我们仔细观察一下上一节中的示例使用的 project.json 文件:
{
"version": 1,
"partitions": [
{
"topic": "topic-throttle",
"partition": 1,
"replicas": [
2,
0
],
"log_dirs": [
"any",
"any"
]
},
{
"topic": "topic-throttle",
"partition": 0,
"replicas": [
0,
2
],
"log_dirs": [
"any",
"any"
]
},
{
"topic": "topic-throttle",
"partition": 2,
"replicas": [
0,
2
],
"log_dirs": [
"any",
"any"
]
}
]
}
可以观察到 JSON 内容里的 replicas 都是2个副本,我们可以自行添加一个副本,比如对分区1而言,可以改成下面的内容:
{
"topic": "topic-throttle",
"partition": 1,
"replicas": [
2,
1,
0
],
"log_dirs": [
"any",
"any",
"any"
]
}
我们可以将其他分区的 replicas 内容也改成[0,1,2],这样每个分区的副本因子就都从2增加到了3。注意增加副本因子时也要在 log_dirs中添加一个“any”,这个log_dirs 代表 Kafka 中的日志目录,对应于 broker 端的 log.dir 或 log.dirs 参数的配置值,如果不需要关注此方面的细节,那么可以简单地设置为“any”。我们将修改后的 JSON 内容保存为新的 add.json 文件。在执行 kafka-reassign-partition.sh 脚本前,主题 topic-throttle 的详细信息(副本因子为2)如下:
# bin/kafka-topics.sh --zookeeper localhost:2181/ kafka --describe --topic topic-throttle
Topic:topic-throttle PartitionCount:3 ReplicationFactor:2 Configs:
Topic: topic-throttle Partition: 0 Leader: 0 Replicas: 0,1 Isr: 0,1
Topic: topic-throttle Partition: 1 Leader: 1 Replicas: 1,2 Isr: 2,1
Topic: topic-throttle Partition: 2 Leader: 2 Replicas: 2,0 Isr: 2,0
执行 kafka-reassign-partition.sh 脚本(execute),详细信息如下:
# bin/kafka-reassign-partitions.sh --zookeeper localhost:2181/kafka --execute --reassignment-json-file add.json
Current partition replica assignment
{"version":1,"partitions":[{"topic":"topic-throttle","partition":2,"replicas":[2,0],"log_dirs":["any","any"]},{"topic":"topic-throttle","partition":1,"replicas":[1,2],"log_dirs":["any","any"]},{"topic":"topic-throttle","partition":0,"replicas":[0,1],"log_dirs":["any","any"]}]}
Save this to use as the --reassignment-json-file option during rollback
Successfully started reassignment of partitions.
执行之后再次查看主题 topic-throttle 的详细信息,详细信息如下:
# bin/kafka-topics.sh --zookeeper localhost:2181/ kafka --describe --topic topic-throttle
Topic:topic-throttle PartitionCount:3 ReplicationFactor:3 Configs:
Topic: topic-throttle Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: topic-throttle Partition: 1 Leader: 1 Replicas: 0,1,2 Isr: 2,1,0
Topic: topic-throttle Partition: 2 Leader: 2 Replicas: 0,1,2 Isr: 2,0,1
可以看到相应的副本因子数已经增加到3了。
与修改分区数不同的是,副本数还可以减少,这个其实很好理解,最直接的方式是关闭一些 broker,不过这种手法不太正规。这里我们同样可以通过 kafka-reassign-partition.sh 脚本来减少分区的副本因子。再次修改 project.json 文件中的内容,内容参考如下:
{"version":1,"partitions":[{"topic":"topic-throttle","partition":2,"replicas":[0],"log_dirs":["any"]},{"topic":"topic-throttle","partition":1,"replicas":[1],"log_dirs":["any"]},{"topic":"topic-throttle","partition":0,"replicas":[2],"log_dirs":["any"]}]}
再次执行 kafka-reassign-partition.sh 脚本(execute)之后,主题 topic-throttle 的详细信息如下:
# bin/kafka-topics.sh --zookeeper localhost:2181/ kafka --describe --topic topic-throttle
Topic:topic-throttle PartitionCount:3 ReplicationFactor:1 Configs:
Topic: topic-throttle Partition: 0 Leader: 2 Replicas: 2 Isr: 2
Topic: topic-throttle Partition: 1 Leader: 1 Replicas: 1 Isr: 1
Topic: topic-throttle Partition: 2 Leader: 0 Replicas: 0 Isr: 0
可以看到主题 topic-throttle 的副本因子又被修改为1了。
细心的读者可能注意到我们执行 kafka-reassign-partition.sh 脚本(execute)所使用的候选方案都是手动修改的,在增加副本因子的时候由于整个示例集群中只有3个 broker 节点,从2增加到3只需填满副本即可。再者,示例中减少副本因子的时候改成了1,这样可以简单地把各个 broker 节点轮询一遍,如此也就不太会有负载不均衡的影响。不过在真实应用中,可能面对的是一个包含了几十个 broker 节点的集群,将副本数从2修改为5,或者从4修改为3的时候,如何进行合理的分配是一个关键的问题。