? 作者:谢先生。 2014年入行的程序猿。多年开发和架构经验。专注于Java、云原生、大数据等技术。从CRUD入行,负责过亿级流量架构的设计和落地,解决了千万级数据治理问题。
? 微信公众号、B站:搜索「谢先生说技术」不定时更新 ~
? 清单: goku-framework、【定期开源】享阅读II
前言
每个文思泉涌的时刻都来自深夜。 而且也来自早晨,比如说这篇文章就是每一个早晨不断码字码出来的。
年龄大了,不好熬夜~
系统环境中由于业务不断调整,集群中Broker节点数量并不固定,此时不可避免的需要动态增减节点:
- Broker增加还好,并不会影响到Topic的分布,原来已经创建好的Topic数据不会进行扩散,但是新Topic产生的Partitions将会在新增Broker上生效
- 而当集群中的Broker节点被移除,由于Partitions分布在不同Broker节点上,甚至会出现当前节点存在Leader分区的情况,此时直接移除节点造成Partitions中出现:
- Leader故障
- Follower故障
- 数据重复或者数据丢失
关于引发故障原理性内容,我们在下一节中介绍~
Broker负载计划
为了最小程度的减少集群的不可用,我们需要人为手动干预整个Broker节点的操作。这就是接下来要隆重上场的主角:
– kafka-reassign-partitions.sh
当前脚本主要负责对分区重分配,当集群中Broker出现新增、下线时能够对Topic数据进行迁移。人为干预下从而保证每个Broker节点负载均衡。
通过查看帮助文档我们来找几个关键信息:
- –broker-list: 设置partition重分配的broker来源信息,已”0,1,2″的形式传递, –topics-to-move-json-file必填
- –topics-to-move-json-file: 生成负载计划时的Topic信息文件,包含了某些topic需要做重新分配
- –generate: 通过 –topics-to-move-json-file 提供信息生成负载计划,负载计划展示在终端,需要拷贝到文件内
- –execute: 通过 –reassignment-json-file 指定的负载计划文件开始执行该计划
- –verify: 验证重新分配是否按照 –reassignment-json-file 指定的文件分配完成
这么说可能不是那么明显,接下来我们就实际操作一把,看看具体的效果。
脚本实操
常规情况下kafka-reassign-partitions.sh执行需要三个步骤:
- 首先需要准备一份包含Topic信息的JSON文件,具体格式如下:
{
"topics": [
{"topic": "topic_name"}
],
"version": 1
}
- 通过执行脚本命令,结合JSON文件与Broker节点ID生成负载均衡计划
- 最后执行该计划并进行验证
根据命令描述帮助也能看到具体说明~
Broker节点新增
我们先来提前准备一个Topic,这里需要注意:
- 本次没有启动node02节点,故而ISR节点少一个
kafka-topics.sh --bootstrap-server master:9092 --create --topic test_res --replication-factor 2 --partitions 3
kafka-topics.sh --bootstrap-server master:9092 --describe --topic test_res
ISR节点只有 0、1
随后我们将node02节点启动,分片与副本不会与已经创建Topic有任何关系
随后我们开始创建负载计划,先准备一个JSON文件
{"topics":[{"topic":"test_res"}],"version":1}
通过如下命令生成负载计划,以下参数前面都已经介绍过
kafka-reassign-partitions.sh --bootstrap-server master:9092 --broker-list "0,1,2" --topics-to-move-json-file a.json --generate
这里需要注意:已Proposed partition reassignment configuration为分界线,复制以下内容
{"version":1,"partitions":[{"topic":"test_res","partition":0,"replicas":[2,0],"log_dirs":["any","any"]},{"topic":"test_res","partition":1,"replicas":[0,1],"log_dirs":["any","any"]},{"topic":"test_res","partition":2,"replicas":[1,2],"log_dirs":["any","any"]}]}
然后我们执行如下命令
kafka-reassign-partitions.sh --bootstrap-server master:9092 --reassignment-json-file b.json --execute
其实现在已经执行成功,但是我们再次进行校验:
kafka-reassign-partitions.sh --bootstrap-server master:9092 --reassignment-json-file b.json --verify
随后查看topic详情:
Broker下线
前面我们复制了一段JSON内容,其实我们是可以自定义的
当我们想要下线某个Broker,我们可以通过修改其中replicas来进行,比如:
{
"version": 1,
"partitions": [
{
"topic": "test_res",
"partition": 0,
"replicas": [
1,
0
],
"log_dirs": [
"any",
"any"
]
},
{
"topic": "test_res",
"partition": 1,
"replicas": [
0,
1
],
"log_dirs": [
"any",
"any"
]
},
{
"topic": "test_res",
"partition": 2,
"replicas": [
1,
0
],
"log_dirs": [
"any",
"any"
]
}
]
}
此时我们就可以省去--generate
的步骤,直接执行计划文件。此处都是重复内容,留下截图一张:
最后结果与第一步创建Topic一般无二。
最后
作为一个脚本的使用还单独开了一个章节,能够在真实生产环境中被使用才是重中之重。
接下来就会进入Broker系列内容的重头戏: 关于对副本的介绍。 精彩不好走开,马上回来。
期待~