EBS 的定义

EBS(Elastic Block Storage)是一种高可用、高性能、弹性可扩展的分布式块存储服务。对于业务来说,它就像是一块普通的磁盘——使用方式和访问本地磁盘一样,但数据实际上存储于远端的网络节点上。

EBS 主要应用于以下场景:

  • 有状态容器的状态存储:解决容器重启后数据丢失的问题
  • 海量数据存储:邮件系统、监控平台、数据库、用户录音、集成测试平台、MySQL 备份等

EBS 的文件系统结构

在 EBS 分布式块存储系统中,ChunkServer 是最终存储业务写入数据的核心服务。

核心组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────┐
│ Volume (逻辑卷) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Chunk │ │ Chunk │ │ Chunk │ │
│ │ #1 │ │ #2 │ │ #N │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
└───────┼───────────┼───────────┼────────┘
│ │ │
└───────────┴───────────┘

┌───────┴───────┐
│ ChunkServer │
│ ┌─────────┐ │
│ │ big-journal│ │
│ │ dir │ │
│ └─────────┘ │
│ ┌─────────┐ │
│ │ chunk │ │
│ │ files │ │
│ └─────────┘ │
└───────────────┘

Volume 与 Chunk

  • Volume:业务申请的每一块 EBS 网络盘在系统中对应一个 Volume,是一个逻辑概念
  • Chunk:每个 Volume 被切分为多个 Chunk,Chunk 最终对应到 ChunkServer 文件系统中的一个真实文件

单机存储引擎负责管理 Chunk 文件的创建、读写、删除等操作。业务的数据读写请求到达 ChunkServer 后,通过单机存储引擎与操作系统文件系统交互来完成数据的持久化。

EBS 中的 Journal 机制

在 ChunkServer 的单机存储引擎层引入了 Journal 机制,用于优化写入性能和保证数据一致性。

为什么需要 Journal?

1. 随机写优化

ChunkServer 可能同时处理大量写请求,这些请求最终转化为对磁盘的大量随机写操作。随机写的性能很差(尤其是机械硬盘),会成为系统瓶颈。

引入 Journal 后,系统将随机写转化为对 Journal 文件的顺序追加写,显著提升写性能、降低写延迟。

2. 数据一致性保证

如果没有 Journal,用户数据将直接写入 Chunk 文件。当 ChunkServer 意外宕机时,可能导致:

  • Chunk 文件中出现脏数据(部分写入的数据块)
  • 同一 Chunk 的不同副本之间产生不一致

Journal 通过先写日志、再异步刷盘的方式,确保任何时刻都可以从 Journal 恢复出一致的数据状态。

Journal 的工作原理

1
2
3
应用写请求 → 写入 Journal(顺序追加)→ 返回成功

异步刷入 Chunk 文件
  1. 写入阶段:写请求首先追加写入 Journal 文件(顺序 IO,速度快)
  2. 响应阶段:Journal 持久化后即可向客户端返回写入成功
  3. 刷盘阶段:后台异步将数据从 Journal 刷入实际的 Chunk 文件

这种设计体现了经典的 WAL(Write-Ahead Logging) 思想:先写日志,再写数据。即使系统崩溃,也能通过重放 Journal 恢复数据,保证不丢数据、不出错。

总结

EBS 通过分层架构实现了高性能、高可靠的分布式块存储:

层级 职责 关键技术
Volume 层 逻辑抽象、容量管理 分片为 Chunk
ChunkServer 层 数据持久化、副本管理 Journal + 异步刷盘
存储引擎层 文件操作、IO 优化 顺序写优化、崩溃恢复

Journal 机制是存储系统的经典设计,它同时解决了性能(随机写转顺序写)和可靠性(崩溃恢复、副本一致)两大核心问题。