共计 2207 个字符,预计需要花费 6 分钟才能阅读完成。
优先正本的选举
当咱们输出以下命令,
kafka-topics.sh --zookeeper zookeeper:2181 --describe --topic test4
查看主题详情时,会展现如下信息
其中 Replicas
就是 AR
。
现,咱们将 brokerId 2
的机器重启,kafka
会从 Isr
正本中选出一个新的节点作为 leader
, brokerId
为 2 的机器重启后,只能作为 follower
从上图,能够看到,Partition 1
选出了新的 Leader 3
,从而导致,brokerId 3
负载较高。
为此,kafka
引进 优先正本概念 。
优先正本为 Replicas
列表中的第一个节点。对于 Partition 1
来说就是 brokerId 2
的节点。也就是说,Paritition 1
按理 Leader
应该为 2,而非 3。
分区主动均衡
kafka
可在 broker
端,通过 auto.leader.rebalance.enable
管制是否开启分区主动均衡,该参数默认为 true
,即默认开启。
如果开启分区主动均衡,kafka
会定时轮询所有的 broker
节点,计算每个 broker
节点分区不均衡率(不均衡的 leader
数 / 分区总数)是否超过 leader.imbalance.per.broker.percentage
参数配置的比例,默认为 10%
。如果超过,则主动执行分区均衡。其中,定时轮询工作的执行周期默认为 300 秒,由参数 leader.imbalance.check.interval.seconds
。
这里不倡议在线上开启分区自动化均衡
分区手动均衡
kafka
中提供 kafka-preferred-replica-election.sh
脚本对 leader
分区从新均衡。
在这里,咱们须要对 主题 test4
中的 partition 1
进行重调配
- 创立 test4_election.json 文件(文件本人命名)
{
"partitions": [
{
"partition": 1,
"topic": "test4"
}
]
}
- 输出命令,指定方才创立的文件
kafka-preferred-replica-election.sh --zookeeper zookeeper:2181 --path-to-json-file test4_election.json
分区重调配
当咱们须要提前下线一个节点,或者新增一个节点时,都须要对分区进行重调配。kafka
提供 kafka-reassign-partitions.sh
脚本执行分区重调配。
先看执行前test4
的分区如下
现要让 brokerId 2
节点下线。那么就须要对 parition 0
, partition 1
重新分配。
- 编写 test4_reassign.json 文件
{
"partitions": [
{
"topic": "test4",
"partition": 1,
"replicas": [1,3]
},
{
"topic": "test4",
"partition": 0,
"replicas": [1,3]
}
],
"version": 1
}
- 执行命令
kafka-reassign-partitions.sh --zookeeper zookeeper:2181 --execute --reassignment-json-file test4_reassign.json
执行完后,新的分区调配如下
分区重调配的基本原理是:broker
控制器为每个分区新增正本,而后再复制 leader 正本的数据。复制结束之后,最初将旧正本删除掉。
复制限流
从分区重调配的原理理解到,复制的时候会产生大量的网络传输,此时如果业务流量特地大,那么可能会对以后业务造成影响,因而须要对复制进行限流。
kafka-reassign-partitions.sh 限流
kafka-reassign-partitions.sh --zookeeper zookeeper:2181 --execute --reassignment-json-file test4_reassign.json --throttle 1024
批改正本因子
应用 kafka-reassign-partitions.sh
,进行正本因子的批改。
- 生成重调配 json
kafka-reassign-partitions.sh --zookeeper zookeeper:2181 --generate --topics-to-move-json-file test5_reassign.json --broker-list 1,2,3
- 将红色框的内容,复制的 json 文件中
{
"version":1,
"partitions":[
{
"topic":"test4",
"partition":0,
"replicas":[
3,
2
],
"log_dirs":[
"any",
"any"
]
},
{
"topic":"test4",
"partition":2,
"replicas":[
2,
1
],
"log_dirs":[
"any",
"any"
]
},
{
"topic":"test4",
"partition":1,
"replicas":[
1,
3
],
"log_dirs":[
"any",
"any"
]
}
]
}
- 开始重调配
kafka-reassign-partitions.sh --zookeeper zookeeper:2181 --execute --reassignment-json-file test4_reassign.json
重调配后果如下