EFS 文件存储

Amazon Elastic File System (EFS) 提供可扩展的共享文件存储。

核心概念

什么是 EFS

网络文件系统:

┌─────────────────────────────────────┐
│      EFS 文件系统(跨可用区)         │
│  ┌──────────────────────────────┐  │
│  │   /efs/data/                 │  │
│  │   ├─ app/                    │  │
│  │   ├─ logs/                   │  │
│  │   └─ shared/                 │  │
│  └──────────────────────────────┘  │
└──┬─────────┬─────────┬─────────────┘
   │         │         │
┌──▼───┐ ┌──▼───┐ ┌──▼───┐
│ EC2  │ │ EC2  │ │Lambda│
│ AZ-1a│ │ AZ-1b│ │      │
└──────┘ └──────┘ └──────┘

关键特性:

  • 共享访问:多个实例同时读写
  • 弹性容量:自动扩展,无需预配置
  • 高可用:跨多个可用区复制
  • POSIX 兼容:标准 Linux 文件系统

EFS vs EBS vs S3

特性 EFS EBS S3
访问方式 NFS (文件系统) 块设备 HTTP API
共享 多实例并发 单实例(除 io2) 无限并发
容量 弹性无限 固定容量 无限
性能 可扩展 固定 IOPS 高吞吐量
延迟 低(毫秒级) 最低(亚毫秒) 中等
成本 $0.30/GB(标准) $0.08/GB(gp3) $0.023/GB
使用场景 共享文件、内容管理 数据库、OS 盘 对象存储、备份

EFS 性能模式

性能模式(Performance Mode)

通用模式(General Purpose):

特性:
├─ 延迟:单位毫秒级
├─ 吞吐量:随容量扩展
├─ 适合:大多数应用
└─ 限制:7,000 文件操作/秒

最大 I/O 模式(Max I/O):

特性:
├─ 延迟:稍高(双位毫秒级)
├─ 吞吐量:更高
├─ 适合:大规模并行
└─ 无 IOPS 上限

如何选择:

  • 默认选择:General Purpose
  • 大数据、媒体处理:Max I/O
  • 注意:创建后无法更改

吞吐量模式(Throughput Mode)

1. 弹性模式(Elastic):

自动扩展:
├─ 读取:最高 3 GB/s
├─ 写入:最高 1 GB/s
├─ 按使用量计费
└─ 推荐:大多数工作负载

2. 突增模式(Bursting):

基线吞吐量:
├─ 50 MB/s/TB(最小 1 MB/s)
├─ 可突增至 100 MB/s
├─ 突增积分制
└─ 适合:持续低流量,偶尔高峰

3. 预配置模式(Provisioned):

固定吞吐量:
├─ 独立于存储大小
├─ 最高 1 GB/s(可申请更高)
├─ 按配置吞吐量计费
└─ 适合:持续高吞吐量需求

性能对比:

场景:100 GB 数据

弹性模式:
  - 按需扩展
  - 成本:$30(存储)+ 实际使用

突增模式:
  - 基线:5 MB/s
  - 可突增至 100 MB/s
  - 成本:$30

预配置模式:
  - 固定:200 MB/s
  - 成本:$30 + $120(吞吐量)

存储类别

标准存储类别

1. 标准(Standard):

特性:
├─ 低延迟访问
├─ 跨多个可用区
├─ 价格:$0.30/GB/月
└─ 适合:频繁访问的数据

2. 单区(One Zone):

特性:
├─ 单个可用区存储
├─ 价格:$0.16/GB/月(节省 47%)
├─ 可用性:99.9%(vs 99.99%)
└─ 适合:非关键数据、可重建数据

生命周期管理

不频繁访问(Infrequent Access, IA):

存储类别:
├─ 标准 IA:$0.025/GB/月
├─ 单区 IA:$0.0133/GB/月
├─ 访问费用:$0.01/GB
└─ 自动分层:根据访问模式

生命周期策略:
未访问 7 天  → 标准 IA
未访问 30 天 → 单区 IA
未访问 90 天 → 归档(未来功能)

成本优化示例:

1 TB 数据,10% 频繁访问

标准存储:
  1000 GB × $0.30 = $300/月

智能分层:
  100 GB × $0.30 = $30(标准)
  900 GB × $0.025 = $22.5(IA)
  总计:$52.5/月(节省 82%)

使用场景

1. 内容管理系统

WordPress 集群
├─ 多个 Web 服务器
├─ 共享 /wp-content/uploads/
├─ 自动扩展
└─ 高可用

优势:

  • 媒体文件统一存储
  • 无需手动同步
  • 新实例自动访问全部内容

2. 大数据分析

数据处理管道
├─ 原始数据写入 EFS
├─ 多个 EMR 节点并行读取
├─ 处理结果写回 EFS
└─ 分析工具直接访问

3. 开发环境

共享代码库
├─ /efs/projects/
├─ 多个开发者同时访问
├─ 版本控制集成
└─ CI/CD 构建共享

4. 容器持久化存储

ECS/EKS + EFS
├─ 容器无状态
├─ 数据持久化到 EFS
├─ 容器重启不丢失数据
└─ 多个副本共享数据

访问控制

挂载目标(Mount Target)

架构:

┌─────────────────────────────────┐
│      VPC (10.0.0.0/16)          │
│                                 │
│  ┌──────────┐   ┌──────────┐  │
│  │  Subnet  │   │  Subnet  │  │
│  │  AZ-1a   │   │  AZ-1b   │  │
│  │          │   │          │  │
│  │ ┌──────┐ │   │ ┌──────┐ │  │
│  │ │ MT   │ │   │ │ MT   │ │  │
│  │ │10.0.1│ │   │ │10.0.2│ │  │
│  │ └──┬───┘ │   │ └──┬───┘ │  │
│  └────┼─────┘   └────┼─────┘  │
└───────┼──────────────┼─────────┘
        └──────┬───────┘
               │
        ┌──────▼──────┐
        │ EFS 文件系统 │
        └─────────────┘

挂载目标配置:

  • 每个可用区一个
  • 关联安全组
  • 指定子网
  • 获得 IP 地址

安全组规则

入站规则:
┌──────────┬──────┬────────────┐
│ 协议     │ 端口 │ 源         │
├──────────┼──────┼────────────┤
│ NFS (TCP)│ 2049 │ VPC CIDR   │
└──────────┴──────┴────────────┘

出站规则:
┌──────────┬──────┬────────────┐
│ 协议     │ 端口 │ 目标       │
├──────────┼──────┼────────────┤
│ All      │ All  │ 0.0.0.0/0  │
└──────────┴──────┴────────────┘

文件系统策略

基于身份的访问:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/MyRole"
      },
      "Action": [
        "elasticfilesystem:ClientMount",
        "elasticfilesystem:ClientWrite"
      ],
      "Resource": "arn:aws:elasticfilesystem:us-east-1:123456789012:file-system/fs-12345678"
    }
  ]
}

强制加密传输:

{
  "Effect": "Deny",
  "Principal": "*",
  "Action": "*",
  "Condition": {
    "Bool": {
      "aws:SecureTransport": "false"
    }
  }
}

数据保护

加密

静态加密:

  • 创建时启用(无法后续修改)
  • 使用 KMS 密钥
  • 自动加密所有文件
  • 无性能影响

传输加密:

  • 使用 TLS 1.2
  • EFS 挂载助手自动配置
  • 推荐:所有生产环境启用

备份

AWS Backup 集成:

备份策略:
├─ 定时备份:每日/每周
├─ 保留期:7 天到 10 年
├─ 跨区域复制
└─ 自动化管理

手动备份:

# 使用 rsync 备份到 S3
aws s3 sync /mnt/efs s3://my-backup-bucket/efs-backup/

性能优化

最佳实践

1. 并行化:

# 多线程写入
for i in {1..10}; do
  dd if=/dev/zero of=/mnt/efs/file$i bs=1M count=1000 &
done
wait

2. 使用 NFS 客户端优化:

# /etc/fstab 优化挂载选项
fs-12345678.efs.us-east-1.amazonaws.com:/ /mnt/efs nfs4 \
  nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,\
  noresvport 0 0

3. 选择合适的实例类型:

  • 网络性能影响 EFS 吞吐量
  • 增强网络实例(最高 100 Gbps)
  • 考虑 EFS 吞吐量需求

监控指标

关键指标:
├─ BurstCreditBalance(突增积分)
├─ ClientConnections(客户端连接数)
├─ DataReadIOBytes/DataWriteIOBytes(吞吐量)
├─ MetadataIOBytes(元数据操作)
├─ PercentIOLimit(I/O 限制百分比)
└─ TotalIOBytes(总 I/O)

成本优化

策略

1. 启用生命周期管理:

  • 自动移至 IA 类别
  • 节省高达 92% 成本

2. 选择合适的存储类别:

决策树:
数据是否关键?
├─ 是 → 标准存储(多 AZ)
└─ 否 → 单区存储(节省 47%)

数据访问频率?
├─ 频繁 → 标准
└─ 不频繁 → IA(节省 92%)

3. 监控未使用的文件系统:

# 查找低使用率文件系统
aws cloudwatch get-metric-statistics \
  --namespace AWS/EFS \
  --metric-name ClientConnections \
  --dimensions Name=FileSystemId,Value=fs-xxxxx \
  --start-time $(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%S) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
  --period 86400 \
  --statistics Average

4. 清理不需要的数据:

  • 定期审计文件
  • 删除临时文件
  • 压缩归档数据

故障排查

常见问题

1. 挂载失败:

  • 检查安全组(端口 2049)
  • 验证 DNS 解析
  • 确认挂载助手已安装
  • 查看系统日志

2. 性能慢:

  • 检查实例网络性能
  • 查看 CloudWatch 指标
  • 考虑升级吞吐量模式
  • 优化应用 I/O 模式

3. 权限问题:

  • 验证文件系统策略
  • 检查 IAM 角色
  • 确认 POSIX 权限
  • 查看访问点配置

EFS 是 AWS 上实现共享文件存储的最佳选择,特别适合需要多实例协作的场景!