概述
S3Stream 是 AutoMQ 中核心的流存储组件,秉承了 AutoMQ 存算分离的理念,将 Apache Kafka 原生的基于 ISR 复制的 Log 存储层卸载至云存储 EBS 和对象存储。
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 级别的延迟。
文件存储按带宽计费,在高吞吐的流存储场景更加不适合。
AutoMQ 创新性地组合了块存储 EBS 和对象存储,取长补短,同时提供了低延迟、高吞吐、低成本以及容量近乎“无限”的流存储能力。
S3Stream 架构
在 S3Stream 的核心架构中,数据首先持久化写入到 WAL 中,然后被近实时地上传至 S3 存储。同时,为了高效地支持 Tailing Read 和 Catch-up Read 两种读模型,S3Stream 内置了 Message Cache 组件用于加速读取。
WAL 存储:选择低延迟的存储介质,每块 WAL 盘仅需数 GiB 的空间即可,一般选择云存储 EBS。
S3 存储:选择云厂商规模最大的对象存储服务提供高吞吐和低成本的数据主存服务。
数据缓存:热数据和预读的冷数据都会放一份在缓存中用于加速读取,同时根据消费者专注度机制进行有效地驱逐,提高内存利用效率。