每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。
放弃不难,但坚持很酷~
kafka:2.11-1.1.0
在上一篇 《必会 | 教你如何重新分布kafka分区、增加分区副本数》文章中,描述了如何重新分配 kafka topic 分区以及增加分区副本数。在最后我留了一个小疑问,如果 kafka leader replica 不挂掉的话,如何选择某 replica 为指定leader 呢?
首先介绍一个概念,叫 preferred replica 。每个 partitiion 的所有 replicas 叫做 "assigned replicas" ,"assigned replicas"中的第一个 replicas 叫 "preferred replica"。
kafka 有提供这样的脚本:kafka-preferred-replica-election.sh,该工具可将每个分区的 Leader replica 转移回 “preferred replica”,它可用于平衡 kafka brokers 之间的 leader 。kafka replica leader 负责处理数据读写请求,如果都集成在一个 broker 上,这样会因为资源的不均衡使用,影响 kafka 效率。
首先看一下 kafka-preferred-replica-election.sh 的参数介绍:
如果不指定 --path-to-json-file 参数的话,默认操作所有已存在的分区。
如果指定 --path-to-json-file 参数的话,是指定一个文件,文件内容为 json 格式。
./bin/kafka-preferred-replica-election.sh --zookeeper cdh-worker-1:2181/kafka --path-to-json-file xxx.json
同样还是以 create17 这个 topic 为例,当前,该 topic 详情如下图所示:
Leader 都集中在了 broker 201 上,如果要使 leader replica 负载均衡的话,可以这样做:
创建 preferred-replica-election.json 文件,编辑如下内容,指定了要更改 leader replica 的分区号:
> cat preferred-replica-election.json
{"partitions":[{"topic":"create17","partition":0},{"topic":"create17","partition":1},{"topic":"create17","partition":2},{"topic":"create17","partition":3},{"topic":"create17","partition":4},{"topic":"create17","partition":5},{"topic":"create17","partition":6},{"topic":"create17","partition":7}]}
然后执行命令:
./bin/kafka-preferred-replica-election.sh --zookeeper cdh-worker-1:2181 --path-to-json-file preferred-replica-election.json
执行结果:
create17 详细信息为:
如上图所示,leader 已经做到了负载均衡了。Leader 的值就是 Replicas 列表值的第一个,也就是 preferred replica 。