EBS 块存储

Amazon Elastic Block Store (EBS) 提供 EC2 实例的持久化块存储。

核心概念

什么是块存储

块存储 vs 对象存储 vs 文件存储:

块存储(EBS)
├─ 数据以块为单位存储
├─ 需要文件系统(ext4、xfs)
├─ 低延迟、高性能
└─ 适合:数据库、操作系统

对象存储(S3)
├─ 数据以对象为单位存储
├─ 通过 HTTP API 访问
├─ 无限扩展、低成本
└─ 适合:静态文件、备份

文件存储(EFS)
├─ 提供文件系统接口
├─ 支持并发访问
├─ NFS 协议
└─ 适合:共享文件、内容管理

EBS 架构

┌────────────────────────────────────┐
│        可用区 (Availability Zone)   │
│                                    │
│  ┌──────────┐      ┌──────────┐  │
│  │   EC2    │──────│   EBS    │  │
│  │ Instance │ 附加  │  Volume  │  │
│  └──────────┘      └──────────┘  │
│                                    │
│  ┌─────────────────────────────┐  │
│  │    EBS 快照(Snapshot)      │  │
│  │  存储在 S3(跨可用区)       │  │
│  └─────────────────────────────┘  │
└────────────────────────────────────┘

关键特性:

  • 可用区级别:卷与实例必须在同一可用区
  • 持久化:数据在实例终止后仍然保留
  • 独立生命周期:可以独立于实例存在
  • 可附加/分离:可以在实例间移动

EBS 卷类型

1. 通用型 SSD (gp3/gp2)

gp3(推荐):

特性:
├─ 基准性能:3,000 IOPS,125 MB/s
├─ 可扩展:最高 16,000 IOPS,1,000 MB/s
├─ 容量:1 GB - 16 TB
├─ 价格:$0.08/GB/月(独立计费 IOPS 和吞吐量)
└─ 适合:大多数工作负载

gp2(旧一代):

  • 性能与容量绑定:3 IOPS/GB
  • 最小 100 IOPS,最大 16,000 IOPS
  • 爆发性能:小卷可临时提升到 3,000 IOPS

何时选择:

  • 启动卷
  • 开发/测试环境
  • 中小型数据库
  • 虚拟桌面

2. 预配置 IOPS SSD (io2/io1)

io2 Block Express:

性能:
├─ IOPS:最高 256,000
├─ 吞吐量:最高 4,000 MB/s
├─ 延迟:亚毫秒级
├─ 容量:4 GB - 64 TB
└─ 耐久性:99.999%

io2:

  • IOPS:最高 64,000
  • 容量:4 GB - 16 TB
  • 价格:$0.125/GB + $0.065/IOPS

何时选择:

  • 关键业务应用
  • 大型数据库(Oracle、SAP HANA)
  • 需要一致的高性能
  • 低延迟要求

3. 吞吐量优化 HDD (st1)

特性:

性能:
├─ 基准吞吐量:40 MB/s/TB
├─ 最大吞吐量:500 MB/s
├─ 爆发吞吐量:250 MB/s/TB
├─ 容量:125 GB - 16 TB
└─ 价格:$0.045/GB/月

何时选择:

  • 大数据处理
  • 日志处理
  • 数据仓库
  • 顺序读写为主

4. 冷 HDD (sc1)

特性:

  • 最低成本:$0.015/GB/月
  • 基准吞吐量:12 MB/s/TB
  • 最大吞吐量:250 MB/s
  • 不常访问的数据

何时选择:

  • 归档存储
  • 不频繁访问的数据
  • 成本优先

卷类型对比

类型 IOPS 吞吐量 延迟 价格 使用场景
gp3 3K-16K 125-1000 MB/s 单位毫秒 $0.08/GB 通用
io2 100-64K 1000 MB/s 亚毫秒 $0.125/GB 数据库
st1 - 40-500 MB/s 毫秒级 $0.045/GB 大数据
sc1 - 12-250 MB/s 毫秒级 $0.015/GB 归档

EBS 性能优化

IOPS 和吞吐量

理解性能指标:

IOPS(每秒 I/O 操作数)
├─ 衡量:随机读写性能
├─ 影响因素:
│   ├─ I/O 大小
│   ├─ 卷类型
│   └─ 实例类型
└─ 适用场景:数据库、OLTP

吞吐量(MB/s)
├─ 衡量:数据传输速率
├─ 影响因素:
│   ├─ I/O 大小
│   ├─ 卷类型
│   └─ 网络带宽
└─ 适用场景:大文件、流处理

性能计算:

IOPS 与吞吐量的关系:
吞吐量 = IOPS × I/O 大小

示例:
- 16KB I/O,1000 IOPS
- 吞吐量 = 1000 × 16KB = 16 MB/s

- 256KB I/O,1000 IOPS  
- 吞吐量 = 1000 × 256KB = 256 MB/s

性能瓶颈

1. 实例限制:

  • 每个实例有 EBS 带宽上限
  • t3.micro:最大 2,085 Mbps(约 260 MB/s)
  • m5.large:最大 4,750 Mbps(约 593 MB/s)

2. 网络限制:

  • EBS 卷通过网络附加
  • 与实例网络带宽共享
  • 大量网络流量影响 EBS 性能

3. 卷性能限制:

  • 每个卷有自己的性能上限
  • 多个卷可以聚合性能
  • RAID 0 提升吞吐量

优化策略

1. 预热卷:

# 从快照创建的卷需要预热
# 读取所有块以达到最佳性能
sudo fio --filename=/dev/xvdf \
  --rw=read \
  --bs=128k \
  --iodepth=32 \
  --ioengine=libaio \
  --direct=1 \
  --name=volume-initialize

2. 使用 EBS 优化实例:

  • 专用 EBS 带宽
  • 不与网络流量竞争
  • 建议:所有生产实例启用

3. 选择合适的卷类型:

  • 数据库:io2(一致性能)
  • 通用应用:gp3(性价比)
  • 大数据:st1(高吞吐量)

4. 监控性能:

关键指标:
├─ VolumeReadOps/WriteOps(IOPS)
├─ VolumeReadBytes/WriteBytes(吞吐量)
├─ VolumeThroughputPercentage(吞吐量使用率)
├─ VolumeIdleTime(空闲时间)
└─ BurstBalance(爆发余额,gp2)

EBS 快照

快照机制

增量备份:

第一次快照(完整备份)
├─ 复制所有数据块
├─ 存储在 S3(跨可用区)
└─ 持久化存储

后续快照(增量)
├─ 仅复制变更的块
├─ 引用之前快照的未变更块
└─ 节省存储成本

快照链:
Snap1(完整) → Snap2(增量) → Snap3(增量)
    └─────────────┴─────────────┘
           可以独立删除任意快照

跨区域复制:

  • 灾难恢复
  • 地理扩展
  • 合规要求

快照策略

自动化快照:

AWS Data Lifecycle Manager (DLM)
├─ 定义快照策略
│   ├─ 创建频率(每小时/天/周)
│   ├─ 保留策略(7 天/30 天/1 年)
│   └─ 标签过滤
├─ 自动执行
└─ 跨区域复制

最佳实践:

  • 生产环境:每日快照,保留 7-30 天
  • 关键数据:每小时快照,跨区域复制
  • 测试环境:每周快照,保留 7 天
  • 重要变更前:手动快照

快照成本:

计费:$0.05/GB/月(标准存储)

示例:
- 100 GB 卷
- 每日快照,保留 30 天
- 平均变更率 10%

成本 = 100GB(首次)+ 10GB×29(增量)
     = 390GB × $0.05 = $19.50/月

数据保护

加密

EBS 加密:

加密流程:
数据 → AES-256 加密 → 存储
         ↑
    KMS 密钥管理

加密范围:
├─ 卷上的静态数据
├─ 卷与实例间的传输数据
├─ 快照
└─ 从快照创建的卷

默认加密:

  • 可以在区域级别启用
  • 新卷自动加密
  • 无性能损失

密钥管理:

  • AWS 托管密钥(免费)
  • 客户管理密钥(KMS,$1/月)
  • 细粒度权限控制

多附加(Multi-Attach)

io2 卷特性:

单个卷附加到多个实例
├─ 最多 16 个实例(同一可用区)
├─ 需要集群感知文件系统
│   └─ GFS2、OCFS2
├─ 用于共享存储
└─ 高可用集群

使用场景:

  • 高可用数据库
  • 共享应用服务器
  • Teradata 等分析平台

成本优化

1. 选择合适的卷类型

场景分析:
小型数据库(< 500 IOPS)
  → gp3(成本最优)

大型数据库(> 5000 IOPS)
  → io2(性能保证)

日志存储(顺序写)
  → st1(吞吐量优化)

归档数据(很少访问)
  → sc1(最低成本)

2. 删除未使用的卷

# 查找未附加的卷
aws ec2 describe-volumes \
  --filters Name=status,Values=available \
  --query 'Volumes[*].[VolumeId,Size,CreateTime]' \
  --output table

# 清理
aws ec2 delete-volume --volume-id vol-xxxxx

3. 快照管理

  • 删除过期快照
  • 使用 DLM 自动化
  • 跨账户共享快照(避免重复)

4. 监控使用率

低使用率卷:
├─ VolumeIdleTime > 90%
├─ 考虑缩小容量
└─ 或更换为 sc1

故障排查

常见问题

1. 卷无法附加:

  • 检查可用区是否匹配
  • 验证卷状态(available)
  • 检查设备名称冲突
  • 查看 IAM 权限

2. 性能不足:

  • 检查实例类型限制
  • 验证 EBS 优化是否启用
  • 查看 CloudWatch 指标
  • 考虑升级卷类型

3. 空间不足:

# 在线扩容(无需停机)
aws ec2 modify-volume \
  --volume-id vol-xxxxx \
  --size 200

# 扩展文件系统
sudo growpart /dev/xvdf 1
sudo resize2fs /dev/xvdf1

4. 数据丢失风险:

  • 启用自动快照
  • 测试恢复流程
  • 跨区域复制关键数据

EBS 是 AWS 上最常用的存储服务,理解其性能特性和最佳实践是运维的基础技能!