持续数据自平衡
在一个线上 Apache Kafka 集群中,流量的波动、Topic 的创建和删除、Broker 的消亡和启动都无时无刻不在发生,而这些变化可能导致流量在集群各个节点间分布不均,从而导致资源浪费、影响业务稳定。此时则需要主动将 Topic 的不同分区在各个节点间移动,以达到平衡流量和数据的目的。
开源方案面临的挑战
Apache Kafka 一直以来在数据自平衡方面都面临了很大的挑战,社区有两种解决方案:
-
Apache Kafka 官方提供了分区迁移工具,但具体的迁移计划则需要运维人员自行决定,而对于动辄成百上千个节点规模的 Kafka 集群来说,人为监控集群状态并制定一个完善的分区迁移计划几乎是不可能完成的任务,
-
社区也有诸如 Cruise Control[1] 这类第三方外置插件用于辅助生成迁移计划。但由于 Apache Kafka 的数据自平衡过程中涉及到大量变量的决策(副本分布、Leader 流量分布、节点资源利用率等等),以及数据自平衡过程中由于数据同步带来的资源抢占和小时甚至天级的耗时,现有解决方案复杂度较高、决策时效性较低,在实际执行数据自平衡策略时,还需依赖运维人员的审查和持续监控,无法真正解决 Apache Kafka 数据自平衡带来的问题
AutoMQ 的架构优势
得益于 AutoMQ 对云原生能力的深度应用,我们将 Apache Kafka 的底层存储完全基于云的对象存储进行了重新实现,彻底从 Shared Nothing 架构升级为了 Shared Storage 架构,支持了秒级的分区迁移能力。因此,分区迁移计划的决策因素得到了极大的简化:
-
无需考虑节点的磁盘资源。
-
无需考虑分区的 Leader 分布和副本分布。
-
分区的迁移不涉及数据同步和拷贝。
故我们有机会在 AutoMQ 内部实现一个内置的、轻量化的数据自动平衡组件,持续监控集群状态,自动执行分区迁移。