优先副本的选举
当我们输入以下命令,
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
【后端|kafka 系列 -- 5.1、分区管理】重分配结果如下
文章图片
推荐阅读
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- c语言|C语言初期学习遇到的特殊点 【三子棋详解】【初学者福音,详细总结,复习能手】
- Python|Python实战(使用线性回归预测房价)
- IC|数字IC后端真的不如前端设计和验证吗()
- Python|教你写个简单好用的Python脚本一键自动整理文件非常适合办公用~
- python|oeasy教您玩转python - 007 - # 字符本质
- vue.js|后端开发学习Vue(一)
- Go|Docker后端部署详解(Go+Nginx)
- 后台|NATAPP内网穿透通过nginx实现一个端口访问多个不同端口服务