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 上实现共享文件存储的最佳选择,特别适合需要多实例协作的场景!