Skip to main content

秒级分区迁移

info

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

引言

当前 Apache Kafka 的分区迁移依赖大量数据同步的完成,以一个 100MB/s 流量的 Kafka 分区为例,运行一天产生的数据量约为 8.2T,如果此时需要将该分区迁移到其他 Broker,则需要对全量数据进行复制,即使对拥有 1 Gbps 带宽的节点,也需要小时级的时间来完成迁移,这使得 Apache Kafka 集群几乎不具备实时弹性能力。而得益于 AutoMQ Kafka 的存算分离架构,在实际进行分区迁移时仅需同步少量数据,这使得将分区迁移时间缩短至秒级成为了可能。

AutoMQ Kafka 如何实现秒级分区迁移

如上图,以分区 P1 从 Broker-0 迁移至 Broker-1 为例:

  1. 当 Kraft Controller 收到分区迁移命令时,会构建出相应的 PartitionChangeRecord 并 commit 至 Kraft Log 层,将 Broker-0 从 leader replica 列表中删除,并将 Broker-1 加入 follower replica 列表中。Broker-0 同步 Kraft Log 监听到 P1 分区变更,进入分区关闭流程。
  2. 分区关闭时,若 P1 还存在未上传至对象存储的数据,则会触发强制上传,而在一个稳定运行的集群中,这部分数据往往不超过数百 MB,结合目前云厂商提供的突发网络带宽能力,这个过程一般仅需秒级即可完成。当 P1 的数据上传完成后,即可安全的关闭并从 Broker-0 删除分区 P1。
  3. P1 从 Broker 完成关闭后会主动触发一次选主,此时 Broker-1 作为唯一的 replica 晋升为 P1 的 leader,进入分区恢复流程。
  4. 分区恢复时,会从对象存储中拉取 P1 对应的元数据,从而恢复出 P1 相应的 checkpoint,后根据 P1 的关闭状态(是否为 cleaned shutdown)进行对应的数据恢复。
  5. 至此分区迁移完成。