WAL 存储
在流存储库 S3Stream 中,WAL 是核心组件之一,WAL 存储主要用来解决使用对象存储作为数据主存带来的延迟高,大量分区写入效率低等问题。其主要有两个职责:
提供低延迟、高性能的数据持久化写入。数据在写入 WAL 成功后即可返回确认给客户端。
当 Broker 节点出现故障需要 Failover 时,会从 WAL 中恢复未被及时上传到 S3 的数据。
WAL 存储实现
WAL 在实现上是一块固定大小的,循环写入的存储空间,存储介质可以有多种选型,但 WAL 实现上主要考虑以下几点:
集中式写入,与 Apache Kafka 不同,AutoMQ 并不需要为每个分区写入不同的 Log 文件,通过将所有分区的数据混合写入到 WAL 中,能支持大规模分区情况下的高效写入。
顺序写入和组提交,数据顺序写入到 WAL 中,配合组提交机制,仅需少量的 IOPS 即可完成高吞吐写入。
Direct IO 写入,数据直接写穿到存储介质上,充分利用云存储的持久性,写入成功后才可返回确认,不受操作系统 Page Cache 脏页回收等影响。
支持裸设备写入[1],AutoMQ 仅需要写入一个文件,如果采用 EBS 作为存储介质,可以直接将 EBS 用做裸设备来写入,无需挂载文件系统,也没有文件系统带来额外的开销,性能和延迟是最优的。
通过上述技术,WAL 存储显著降低流存储系统对 IOPS 的依赖,解决对象存储写入效率低和API调用费用高的问题,使 S3Stream 应用广泛。无论系统是延迟敏感还是高吞吐类型,均可由 AutoMQ 支持。
WAL 存储介质选型
公有云厂商一般提供三种类型的存储服务,分别是:
块存储,比如 AWS EBS,Azure Zone-redundant Disk[2],GCP Regional Persistent Disk[3],Alibaba Cloud Regional ESSD[4]。上述存储服务中 EBS 是单 AZ 多副本架构,其它几个块存储是多 AZ 的多副本架构,下文统称为 Regional EBS。
对象存储,是云厂商提供的最标准的存储服务,基本上各个云厂商都支持标准的 S3 协议。
文件存储,以 NFS 协议为主的文件存储服务,也广泛应用于大数据等业务场景,比如 AWS EFS[5] 和 AWS FSx 系列[6]。

上述存储介质都可以用做 WAL 的存储介质,具体的差异如下表所示。
- | EBS & Regional EBS WAL | S3 WAL | NFS WAL |
---|---|---|---|
多 AZ |
| S3 同时提供单 AZ 和多 AZ 的产品选型 | NFS 同时提供单 AZ 和多 AZ 的产品选型 |
持久性 | 5 个 9 到 9 个 9 之间 | 11 个 9 左右 | 11 个 9 左右 |
延迟 | 亚毫秒级 | 百毫秒级 | 毫秒级 |
成本 | 低 | 低 | 中 |
适用场景 | Regional EBS 为最佳选项,适用于所有的的 Kafka 业务场景 | 适用于大部分对延迟不敏感的场景,如日志,监控等场景 | AWS 上低延迟场景的解决方案,比如核心的交易撮合场景 |
其中,当 AutoMQ 选择 S3 WAL 时,S3 同时提供 WAL 存储和数据主存服务,WAL 存储面向写进行优化,将消耗更少的 S3 API 调用,特别是在大量分区的场景下,S3 WAL 具备高效的数据摄取能力,同时在主存部分通过多种 Compaction 机制提供高效的数据消费能力。
引用
[1]. AutoMQ 如何基于裸设备实现高性能的 WAL: https://www.automq.com/blog/principle-analysis-how-automq-implements-high-performance-wal-based-on-raw-devices
[2]. Azure Regional EBS: https://learn.microsoft.com/en-us/azure/virtual-machines/disks-redundancy#zone-redundant-storage-for-managed-disks
[3]. GCP Regional EBS: https://cloud.google.com/compute/docs/disks/regional-persistent-disk
[4]. 阿里云 Regional EBS: https://developer.aliyun.com/special/live/regionalessd_bdrc
[5]. AWS EFS: https://aws.amazon.com/efs/
[6]. AWS FSx: https://aws.amazon.com/fsx/netapp-ontap/