Skip to main content

持续数据重平衡

info

本文中提及的 AutoMQ Kafka 术语,均特指安托盟丘(杭州)科技有限公司通过 GitHub AutoMQ 组织下开源的 automq-for-kafka 项目。

什么是数据重平衡

在一个线上 Apache Kafka 集群中,流量的波动、Topic 的创建和删除、Broker 的消亡和启动都无时无刻不在发生,而这些变化可能导致流量在集群各个节点间分布不均,从而导致资源浪费、影响业务稳定。此时则需要主动将 Topic 的不同分区在各个节点间移动,以达到平衡流量和数据的目的。

开源方案面临的挑战

当前,Apache Kafka 仅提供了分区迁移工具,但具体的迁移计划则需要运维人员自行决定,而对于动辄成百上千个节点规模的 Kafka 集群来说,人为监控集群状态并制定一个完善的分区迁移计划几乎是不可能完成的任务,为此,社区也有诸如 Cruise Control for Apache Kafka 这类第三方外置插件用于辅助生成迁移计划。但由于 Apache Kafka 的重平衡过程中涉及到大量变量的决策(副本分布、Leader 流量分布、节点资源利用率等等),以及重平衡过程中由于数据同步带来的资源抢占和小时甚至天级的耗时,现有解决方案复杂度较高、决策时效性较低,在实际执行重平衡策略时,还需依赖运维人员的审查和持续监控,无法真正解决 Apache Kafka 数据重平衡带来的问题

AutoMQ for Kafka 的架构优势

得益于 AutoMQ Kafka 对云原生能力的深度应用,我们将 Apache Kafka 的底层存储完全基于云的对象存储进行了重新实现,由此带来的优势有:

  • 完全的存算分离架构,Broker 仅需保留少量块存储空间用作 Write Ahead Log,其余数据均下沉至对象存储,在集群内部可见。
  • 分区仅需保留单副本即可实现高可用。

基于上述优势,分区迁移计划的决策因素得到了极大的简化:

  • 无需考虑节点的磁盘资源。
  • 无需考虑分区的 Leader 分布和副本分布。
  • 分区的迁移不涉及数据同步和拷贝。

故我们有机会在 AutoMQ Kafka 内部实现一个内置的、轻量化的数据自动平衡组件,持续监控集群状态,自动执行分区迁移。

AutoMQ for Kafka 的数据重平衡实现

架构图

重平衡过程

指标收集

AutoMQ Kafka Broker 实现了 Apache Kafka 的 MetricsReporter 接口,监听 Apache Kafka 内置的所有指标信息,并定期对感兴趣的指标(如网络进出口流量、CPU 利用率等)进行采样,并在 Broker 侧完成指标的预聚合,将聚合后的指标序列化成一条 Kafka 消息,发送至指定的内部 Topic 中。

AutoMQ Kafka Controller 在内存中维护了一个集群状态模型用以描述当前集群状态,包括 Broker 状态、Broker 资源容量、各 Broker 管理的 Topic-Partition 流量信息等。通过监听 Kraft Log 的事件信息,集群状态模型可以及时感知到 Broker 和 Topic-Partition 的状态变更并对模型进行更新,从而与真实集群状态保持一致。

同时,AutoMQ Kafka Controller 中的指标收集器会实时从内部 Topic 中消费消息,将消息反序列化后解析成具体指标,并更新到集群状态模型,从而构建出重平衡所需的所有前置信息。

决策分析

AutoMQ Kafka Controller 的调度决策器会周期性获取集群状态模型的快照,并根据当前集群各个 Broker 的容量和负载信息,识别出流量过高或过低的 Broker, 并尝试移动或交换分区来完成流量重平衡。

AutoMQ for Kafka 数据重平衡示例

集群配置

机型:AWS r6i.large(2C16G,基准带宽 0.781Gbps,突发带宽 12.5Gbps)

集群:1 Controller,3 Broker

负载详情

  1. 第一阶段,向 3 台 Broker 施加均衡流量,约 40MB/s
  2. 第二阶段,增加 Broker-0 流量至约 80MB/s,Broker-1 流量至约 120MB/s,Broker-2 保持 40MB/s

流量曲线

如图所示,Broker-0、Broker-1 流量增大后,触发自动负载均衡,三台 Broker 流量逐步收敛至均衡范围。

note

NOTE:在该场景中,为便于观测,人为增加了分区调度冷却时间,在使用默认配置的情况下,流量均衡时间约为 1 分钟左右

快速体验

参考 自动重平衡▸ 中的「自动重平衡」章节。

S3 数据重平衡主要配置项

参考参数配置▸ 中的「持续数据重平衡配置」章节。