分布式流处理组件-生产实战:Broker节点负载

? 作者:谢先生。 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

image.png

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

image.png
这里需要注意:已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

image.png
其实现在已经执行成功,但是我们再次进行校验:

kafka-reassign-partitions.sh --bootstrap-server master:9092 --reassignment-json-file b.json --verify

image.png

随后查看topic详情:

image.png

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的步骤,直接执行计划文件。此处都是重复内容,留下截图一张:

image.png
最后结果与第一步创建Topic一般无二。

最后

作为一个脚本的使用还单独开了一个章节,能够在真实生产环境中被使用才是重中之重。
接下来就会进入Broker系列内容的重头戏: 关于对副本的介绍。 精彩不好走开,马上回来。
期待~

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYfsxQj7' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片