Skip to main content

与多级存储的区别

AutoMQ 使用对象存储作为核心的存储服务,而 Apache Kafka 从 3.6.0 版本开始也引入了 KIP-405 多级存储方案,利用对象存储来卸载历史数据。

AutoMQ 的概述▸由 WAL(Write-Ahead Logging)存储和数据主存组成,而 Kafka 多级存储则包含一级的 EBS 存储和二级的对象存储。通常,开发者可能认为 AutoMQ 的 WAL 存储与 Kafka 的一级 EBS 存储相似,但实际上,它们存在本质差异。本文将介绍 AutoMQ 相较于 Apache Kafka 多级存储的优势和不同点。

架构区别

参考 KIP-405 的设计,Apache Kafka 分级存储版本采用了两级存储的思路,存储模块依赖本地磁盘以及对象存储。消息数据首先写入本地磁盘,再通过转冷的策略异步上传到对象存储。由于本地磁盘介质存在损坏风险,因此根据副本策略,每一份消息需要经过 ISR 机制跨节点复制到多个磁盘上。

如今,在公共云环境部署分级存储版本,Apache Kafka 的架构并未改变,仍旧使用 EBS 作为本地磁盘的替代,消息仍旧需要复制到多份 EBS 上。总结而言,Apache Kafka 仍旧将 EBS 视作普通的块设备存储介质 ,跟本地机房的一块物理硬盘没有本质的区别。

AutoMQ 采用了对象存储作为主要存储方式,无存储分级概念。然而,为优化存储效率,如减少写入对象存储的延迟、提升海量分区的写入效率,AutoMQ 引入了 WAL 存储机制。具体架构对比如下:

由于 WAL 存储可以采用 EBS 作为存储介质,开发者可能认为其与 Kafka 的一级存储有相似之处。然而,WAL 存储在设计理念和实现上与 Kafka 存在根本差异,包括存储职责、存储效率、存储空间、存储介质、持久性和多 AZ 容灾设计等方面。请参考下表了解具体差异:

-
WAL 存储
Kafka Tier 1 Storage
职责
类似数据库的 Binlog,用于快速的数据持久化写入和故障时数据恢复(Recovery)。
核心的数据存储,提供读、写和回放等职责。
存储效率
集中式存储,将节点所有分区的数据混合存储在一个 WAL 文件或对象中,提供高写入效率和低 IOPS 消耗。
分散式存储,系统采用独立的文件列表来存储各分区数据,导致写入效率低且 IOPS 消耗高。
存储空间
占用空间较少,如 10GiB,且具备确定性。
占用空间大且不确定,需要进行容量评估,单节点通常需要数百 GiB。
存储介质
根据延迟等级和持久性需求,可选择云厂商提供的块存储、对象存储或文件存储。
通常建议选择本地硬盘或云供应商提供的块存储服务。
持久性保证
利用云存储服务中的多副本或 EC(Erasure Coding)技术,数据持久性通常可达到 99.999% 至 99.999999999% 的可靠性。
Apache Kafka 的 ISR 副本机制提供可靠性,但不保证持久性指标。
多 AZ 容灾
云厂商提供的 Regional EBS、对象存储和文件存储(如 AWS EFS 和 FSx)均具备多可用区(AZ)数据持久性,并且免除跨 AZ 复制流量费用。
使用 ISR 实现跨可用区 (AZ) 数据复制,并将产生跨 AZ 流量复制费用。

成本优势

Apache Kafka 分级存储版本架构中仍旧将第一级 EBS 存储作为主存储对外提供读写服务,每个 Kafka 分区至少需要在第一级存储上保留最后一个活跃的 Segment 。这会导致如下现象:

  • EBS 空间不确定,和集群分区数正相关。

  • 生产环境需要预留较大的 EBS 空间,降低风险。

  • EBS 预留成本高,分级存储降本空间有限。

info

举例:

以 Apache Kafka 默认配置为例,每个 segment 大小默认为 1GB,如果活跃的分区数为 1000 个,则仍然需要预留 1TB 的 EBS。

AutoMQ 的架构中将对象存储作为主存储,EBS 定位用于故障恢复的 WAL,实现上为一个循环穿透写入的裸设备 。每个 AutoMQ 的 Broker 节点仅需要 2GB 的 EBS 卷,并且可以保证仅暂存大约 500MB 的临时数据(上述空间大小均可自定义配置)。

上述设计使得 AutoMQ 对 EBS 的空间消耗具备确定性 ,EBS 的存储开销极低,一块 2GB 的 EBS 卷每月花费仅 1 元。

运维优势

由于 Apache Kafka 多级存储架构中的一级存储空间不固定,每个分区遗留在 EBS 上的数据也不固定,所以在弹性伸缩、故障迁移等需要分区移动时,耗时也不确定,无法快速伸缩。

而 AutoMQ 的缓冲区里仅有不超过 500MB 的数据是在需要上传到对象存储中的,可以做到秒级完成上传,进而能支持秒级的分区转移。

info

以 Confluent 的案例来看,在一个大流量集群,扩容操作在非多级存储架构需要耗时 43 小时,在多级存储架构仍然需要耗时 1.4 小时。

总结

AutoMQ 相较于 Apache Kafka 多级存储方案,是一个量变引起质变的过程,通过架构优化,使得 AutoMQ 可以做到「无状态」,任意伸缩,秒级分区迁移。相反, Apache Kafka 多级存储架构仍然是一个优化方案,仍然是有状态,很难完成轻量的伸缩和分区迁移。