Skip to main content

概述

S3Stream:共享流存储库

S3Stream 是 AutoMQ 中核心的流存储组件,秉承了 AutoMQ 存算分离的理念,将 Apache Kafka 原生的基于 ISR 复制的 Log 存储层卸载至对象存储,并提供 WAL 存储加速能力。

S3Stream 是一个流存储 Library,它并不是一套分布式存储服务,AutoMQ 创新性地在对象存储之上实现了一套核心的流存储 API,包括位点管理、Append、Fetch 和 Trim 数据等,如下代码片段是这套 API 的几个核心接口。


public interface Stream {
/**
* Get stream id
*/
long streamId();

/**
* Get stream start offset.
*/
long startOffset();

/**
* Get stream next append record offset.
*/
long nextOffset();

/**
* Append RecordBatch to stream.
*/
CompletableFuture<AppendResult> append(RecordBatch recordBatch);

/**
* Fetch RecordBatch list from a stream.
*/
CompletableFuture<FetchResult> fetch(long startOffset, long endOffset, int maxBytesHint);

/**
* Trim stream.
*/
CompletableFuture<Void> trim(long newStartOffset);
}

流存储的几个核心特征

互联网上所有的数据都是以流式的方式产生的,再以流的方式进行存储和计算,以挖掘实时数据的业务价值,这也意味着流数据对存储至少有以下几个要求:

  • 低延迟:流式数据最大的价值是数据新鲜度,比如广告推荐相关的业务,对实时性要求非常高,数据最快地被存储和计算,将能最大程度上发挥出数据的价值。

  • 高吞吐:所有的数据以流式的方式产生,意味着对流存储有超高的吞吐要求,很多业务至少有 GiB/s 的带宽要求。

  • 低成本:海量的流数据意味着存储成本高,再加上很多业务有数据回放,重新计算的诉求,按天存储流数据是业务常态。

对象存储在大数据规模和成本方面具有显著优势,尤其在数据湖生态中表现突出。然而,对象存储的特性,包括每次 API 调用的100ms级别延迟和按调用计费,限制了其在低延迟和高 IOPS 存储场景中的应用,而这些特性恰好是流存储的关键需求。

为了克服这一限制,使对象存储适用于流存储场景,AutoMQ 在 S3Stream 中引入了 WAL(预写日志)存储模块。该模块通过集中式存储,将节点所有分区的数据混合存储在一个 WAL 文件或对象中,以实现高写入效率和低 IOPS 消耗。

AutoMQ 创新性地结合 WAL 存储和对象存储,弥补了对象存储在流存储场景中的不足,提供了低延迟、高吞吐、低成本以及几乎无限的容量流存储能力。

S3Stream 架构

在 S3Stream 的核心架构中,数据首先持久化写入到 WAL 中,然后被近实时地上传至 S3 存储。同时,为了高效地支持 Tailing Read 和 Catch-up Read 两种读模型,S3Stream 内置了数据缓存组件用于加速读取。

  • WAL 存储:根据业务的延迟和持久性需求选择不同的存储介质,一般选择块存储或者对象存储。

  • S3 存储:选择云厂商规模最大的对象存储服务提供高吞吐和低成本的数据主存服务。

  • 数据缓存:热数据和预读的冷数据都会放一份在缓存中用于加速读取,同时根据消费者专注度机制进行有效地驱逐,提高内存利用效率。