Amazon EFS 专业教程:从入门到精通
目录
-
(图片来源网络,侵删)- 什么是 EFS?
- EFS 的核心优势
- EFS vs. EBS vs. FSx (对比)
- EFS 的核心组件
-
- 架构:弹性文件系统与挂载目标
- 性能模式:通用模式 vs. 最大 I/O 模式
- 吞吐量模式:弹性与突发
- 加密:静态与传输中
- 生命周期策略:智能成本优化
-
- 任务 1:创建 EFS 文件系统
- 任务 2:配置 VPC 和安全组
- 任务 3:挂载 EFS 到 EC2 实例
- 任务 4:配置自动挂载
- 任务 5:使用 EFS 挂载助手
-
- 高可用性与可扩展性
- 成本优化策略
- 性能调优
- 安全与权限管理
- 备份与恢复
- 监控与告警
-
(图片来源网络,侵删)- Web 服务器内容共享
- 大数据分析
- 容器化应用 (Docker/Kubernetes)
- 主机应用共享
第一部分:基础概念与核心优势
什么是 EFS?
Amazon Elastic File System (EFS) 是一种完全托管、可扩展的网络文件系统,专为 AWS 云设计,它消除了在 EC2 实例上手动设置、扩展和维护文件服务器的复杂性,您可以像在本地网络中一样,通过网络将 EFS 挂载到多个 EC2 实例上,实现数据共享。
EFS 的核心优势
- 弹性伸缩:文件系统会根据您存储的数据量和并发访问量自动扩展,无需手动干预,您无需预测容量需求。
- 完全托管:AWS 负责所有硬件、软件打补丁、配置和备份,您可以专注于应用程序,而不是底层基础设施。
- 高可用性:EFS 在多个可用区内自动复制数据,确保数据持久性和高可用性。
- 共享访问:多个 EC2 实例(可以是不同可用区)可以同时挂载并读写同一个 EFS,非常适合需要共享状态的应用。
- 标准 NFS 协议:使用行业标准 NFSv4.1 协议,与大多数 Linux 应用程序兼容良好。
EFS vs. EBS vs. FSx
| 特性 | Amazon EFS | Amazon EBS | Amazon FSx (for Lustre/Windows) |
|---|---|---|---|
| 类型 | 网络文件系统 | 块存储 | 高性能文件系统 |
| 访问方式 | 通过网络挂载 (NFS) | 作为卷附加到单个 EC2 | 通过网络挂载 |
| 共享性 | 多实例共享 | 单实例独占 | 多实例共享 |
| 弹性 | 自动弹性 | 手动调整大小 | 可配置,有固定大小选项 |
| 主要用途 | 内容管理、开发环境、数据分析 | 数据库、操作系统、单个应用 | 高性能计算、Windows 文件服务器 |
EFS 的核心组件
- 文件系统:这是您在 EFS 中创建的逻辑存储单元,它有一个唯一的 DNS 名称,您通过这个名称来挂载它。
- 挂载目标:这是您 VPC 中的一个网络端点,允许 EC2 实例连接到 EFS 文件系统。一个文件系统在每个可用区中至少需要一个挂载目标,挂载目标位于您的 VPC 子网中,并关联一个安全组来控制入站流量。
- 性能模式:
- 通用模式:平衡的延迟和吞吐量,适用于大多数用例。
- 最大 I/O 模式:优化吞吐量和 I/O 操作,延迟略高,适用于高吞吐量应用(如媒体处理、大数据)。
- 吞吐量模式:
- 弹性模式:吞吐量随文件系统大小和基准自动调整,适合不可预测的工作负载。
- 突发模式:提供初始的基线吞吐量,并允许在短时间内“突发”到更高的吞吐量,适合读多写少或间歇性高负载的场景。
第二部分:深入核心架构与性能模式
架构:弹性文件系统与挂载目标
想象一下,EFS 文件系统是一个巨大的、位于云端的“仓库”,挂载目标就像是仓库的多个“入口”,分别开在不同的“区域”(可用区),您的 EC2 实例可以通过与自己位于同一可用区的“入口”来访问仓库,这样网络延迟最低,性能最好。
性能模式
- 通用模式:
- 延迟:低且一致的单位数毫秒延迟。
- 吞吐量:根据文件系统大小和基准吞吐量自动调整。
- 适用场景:Web 服务器、内容管理系统、开发环境等对延迟敏感的应用。
- 最大 I/O 模式:
- 延迟:比通用模式高,但吞吐量显著提升。
- 吞吐量:基于预配置的吞吐量值(以 MiB/s 为单位),不受文件系统大小限制。
- 适用场景:视频转码、科学计算、日志处理等需要极高吞吐量的应用。
吞吐量模式
- 弹性模式:
- 文件系统大小 ≤ 1 TiB: 基础吞吐量 = 文件系统大小 (GiB) / 2。
- 文件系统大小 > 1 TiB: 基础吞吐量 = 文件系统大小 (GiB)。
- 突发吞吐量 = 文件系统大小 (GiB) * 2。
- 工作负载可以随时使用突发吞吐量,超出后,会在短时间内消耗“突发余额”,然后回落到基础吞吐量,余额会随时间慢慢恢复。
- 预配置模式:
- 您为文件系统设置一个固定的、您所需要的吞吐量值。
- 适合需要稳定、可预测性能的生产工作负载,可以避免因突发耗尽而导致的性能下降。
加密
- 传输中加密:默认开启,挂载目标与客户端之间的所有流量都通过 TLS 1.2 加密。
- 静态加密:默认开启,EFS 上的所有数据都在其存储层使用 AES-256 加密,您可以使用 AWS KMS 管理密钥,AWS 提供的默认密钥,或您自己的 CMK。
生命周期策略
这是 EFS 成本优化的关键功能,它允许您将不常访问的文件(超过 X 天未被访问)自动移动到成本更低的 EFS Standard-Infrequent Access (EFS Standard-IA) 存储类别。

- 转换条件:基于文件的
last accessed time(最后访问时间)。 - 优势:显著降低存储冷数据(归档数据)的成本。
- 注意:将文件从 IA 类别读回标准类别会产生数据检索费用。
第三部分:实战演练 - 创建与管理 EFS
任务 1:创建 EFS 文件系统
- 登录 AWS Management Console,导航到 EFS 服务。
- 点击 创建文件系统。
- 基本设置:
- 名称:为您的文件系统命名(可选)。
- 区域:选择您希望文件系统所在的区域。
- 网络设置:
- VPC:选择您的 EC2 实例所在的 VPC。
- 安全组:选择一个安全组,或者创建一个新的。必须确保此安全组允许 NFS 流量(TCP/UDP 端口 2049)从您的 EC2 实例的 IP 地址或安全组流入。
- 文件系统设置:
- 性能模式:根据您的需求选择 通用模式 或 最大 I/O 模式。
- 吞吐量模式:选择 弹性模式 或 预配置模式,如果选择预配置,输入您需要的吞吐量值。
- 启用的存储类别:默认为 Standard 和 Standard-IA,确保 Standard-IA 已启用,以便使用生命周期策略。
- 加密:保持默认的 启用 状态。
- 生命周期策略:
- 勾选 启用生命周期管理。
- 设置 过渡到 IA 的访问期限(30天)。
- 创建文件系统。
创建完成后,您将看到文件系统的状态变为 available,并获取到文件系统的 DNS 名称(fs-12345678.us-east-1.elasticfilesystem.amazonaws.com)。
任务 2:配置 VPC 和安全组
这是最关键也最容易出错的一步。
- 确保 EC2 和 EFS 在同一 VPC:在创建 EC2 实例时,选择与 EFS 相同的 VPC。
- 配置安全组:
- 找到您 EC2 实例使用的安全组。
- 添加一条入站规则:
- 类型:选择
NFS。 - 来源:选择
自定义,然后输入您 EFS 文件系统的安全组 ID。这是最安全的做法,允许 EFS 安全组内的资源互相访问。 或者,如果您确定,也可以输入 EC2 实例的 IP 地址/范围。
- 类型:选择
任务 3:挂载 EFS 到 EC2 实例
在您的 EC2 实例(Linux)上执行以下操作:
-
安装 NFS 客户端:
sudo yum install -y nfs-utils # For Amazon Linux / CentOS / RHEL # sudo apt-get update && sudo apt-get install -y nfs-common # For Ubuntu/Debian
-
创建挂载目录:
sudo mkdir /mnt/efs
-
挂载文件系统: 使用您在 EFS 控制台获取的 DNS 名称。
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-12345678.us-east-1.elasticfilesystem.amazonaws.com:/ /mnt/efs
nfsvers=4.1:指定 NFS 版本。rsize/wsize:设置读写块大小,对于 EFS,最大为 1 MiB (1048576 bytes),这是最佳实践。hard:NFS 服务器无响应,挂载会“挂起”,直到恢复。timeo:超时时间(单位为十分之一秒)。retrans:重传次数。- 最后部分是
DNS名称:/,表示挂载文件系统的根目录。
-
验证挂载:
df -hT
您应该能看到
/mnt/efs条目,并显示文件系统大小和使用情况。
任务 4:配置自动挂载
为了让 EC2 实例在重启后自动挂载 EFS,需要修改 /etc/fstab 文件。
- 获取挂载命令的输出,它包含了
mount -t ...的所有选项。 - 编辑
/etc/fstab文件:sudo vi /etc/fstab
- 在文件末尾添加一行,使用
netdev选项,这有助于系统识别这是一个网络设备。fs-12345678.us-east-1.elasticfilesystem.amazonaws.com:/ /mnt/efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev 0 0 - 测试
fstab是否正确:sudo umount /mnt/efs sudo mount -a
如果没有报错,说明配置正确。
任务 5:使用 EFS 挂载助手
AWS 提供了一个名为 amazon-efs-utils 的工具包,它简化了挂载过程,并支持 IAM 角色授权等高级功能。
- 安装:
sudo yum install -y amazon-efs-utils # For Amazon Linux
- 使用挂载助手挂载:
sudo mount -t efs fs-12345678:/ /mnt/efs
这种方式更简洁,
amazon-efs-utils会自动处理 NFSv4 的细节。
第四部分:高级主题与最佳实践
高可用性与可扩展性
- 多可用区部署:EFS 默认跨多个可用区复制数据,无需额外配置,确保您的 EC2 实例分布在多个可用区,并使用各自可用区的挂载目标,以获得最佳性能和容错能力。
- 无单点故障:文件系统本身没有单点故障,挂载目标也是高可用的。
成本优化策略
- 生命周期策略:对于有大量不常访问数据的场景,这是最有效的成本节省方式。
- 按需付费:EFS 没有最低费用,您只为实际使用的存储和吞吐量付费。
- 选择合适的吞吐量模式:对于工作负载可预测的应用,预配置模式可能比弹性模式更经济。
- 监控使用情况:使用 AWS Cost Explorer 和 CloudWatch 监控存储和吞吐量成本。
性能调优
- 选择正确的性能模式:通用模式适用于大多数场景,最大 I/O 模式用于吞吐量密集型。
- 选择正确的吞吐量模式:预配置模式保证性能下限。
- 使用并行 I/O:鼓励应用程序使用多个线程或进程进行读写操作,以充分利用 EFS 的并发处理能力。
- 调整 I/O 大小:如前所述,将
rsize和wsize设置为 1 MiB 是最佳实践。 - 放置组:对于使用 EC2 实例集的应用,可以将实例放置在同一个“放置组”中,以减少网络延迟。
安全与权限管理
- 安全组:始终使用安全组来控制对挂载目标的访问,遵循“最小权限”原则。
- NFS 权限:通过文件系统的根目录权限和文件/目录的 POSIX 权限来控制 EC2 实例上的访问。
- 默认情况下,挂载点的用户和组 ID 为
nfsnobody(65534)。 - 您可以在 EC2 上创建具有特定 UID/GID 的用户,并确保 EFS 上的文件权限与之匹配。
- 默认情况下,挂载点的用户和组 ID 为
- IAM 授权:结合使用 IAM 角件和
amazon-efs-utils,可以实现基于 IAM 的授权,无需在 NFS 客户端管理用户密码,这对于容器化环境(如 EKS)尤其有用。
备份与恢复
- 快照:EFS 提供了创建文件系统快照的功能,快照是文件系统在某个时间点的只读副本。
- 创建快照:在 EFS 控制台或通过 CLI (
create-snapshot) 手动创建,也可以配置自动快照计划。 - 恢复:您可以从快照创建一个新的文件系统,新文件系统将恢复到快照时的状态,快照也可以用于跨区域复制,实现灾难恢复。
监控与告警
- CloudWatch 指标:EFS 自动向 CloudWatch 发送性能指标,如:
BurstCreditBalance:突发信用余额。ConnectionCount:客户端连接数。ClientConnections:客户端连接数。DataReadBytes,DataWriteBytes:读写吞吐量。MetadataOperations:元数据操作数。
- 设置告警:为关键指标(如
BurstCreditBalance接近 0,或ConnectionCount过高)设置 CloudWatch 告警,以便在问题发生前收到通知。
第五部分:典型应用场景与案例
- Web 服务器内容共享:多个 EC2 实例作为 Web 服务器,共同挂载同一个 EFS 来存放网站文件(如 HTML, CSS, JavaScript, 图片),当您更新文件时,所有服务器都会立即看到最新版本。
- 开发环境:团队成员通过各自的 EC2 实例或容器挂载同一个 EFS,共享项目代码库、依赖项和构建产物,确保环境一致。
- 容器化应用:
- Docker:将 EFS 作为 Docker 卷挂载到多个容器实例,实现容器间的数据共享。
- Kubernetes (EKS):使用 EFS CSI 驱动程序,将 EFS 动态挂载为 PersistentVolume,为有状态应用提供持久化存储。
- 大数据分析:像 Apache Spark 或 Hadoop 这样的分布式计算框架,可以将 EFS 作为共享存储,存放输入数据和中间结果,供多个计算节点同时访问。
- 主机应用共享:运行在多个 EC2 实例上的应用程序需要共享数据库文件、日志文件或配置文件。
第六部分:故障排查与常见问题
问题 1:mount: mountpoint /mnt/efs does not exist
- 原因:挂载目录不存在。
- 解决:在挂载前,使用
sudo mkdir /mnt/efs创建目录。
问题 2:mount: fs-123...:/: Connection timed out
- 原因:
- EC2 和 EFS 不在同一个 VPC。
- 安全组配置错误,没有允许 NFS (TCP/UDP 2049) 端口的入站流量。
- EC2 实例所在子网的路由表没有指向 Internet 网关(EFS 是通过公网 DNS 访问的)。
- 解决:
- 检查 VPC 设置。
- 检查安全组规则,确保来源正确,端口开放。
- 确保子网路由正确。最佳实践是使用 VPC 端点,让流量完全保持在 AWS 网络内部,更安全、更低延迟。
问题 3:性能缓慢,I/O 操作延迟高
- 原因:
- 使用了错误的性能模式或吞吐量模式。
- 工作负载超出了当前吞吐量配额,导致突发信用耗尽。
- 安全组规则过于宽泛,影响了网络性能。
- EC2 实例和 EFS 挂载目标不在同一个可用区。
- 解决:
- 升级到最大 I/O 模式或预配置吞吐量模式。
- 监控
BurstCreditBalance指标,如果经常归零,考虑增加基线吞吐量。 - 审查并收紧安全组规则。
- 确保使用同一可用区的挂载目标。
问题 4:权限被拒绝 (Permission Denied)
- 原因:
- EFS 文件系统或目录的 POSIX 权限不正确。
- 挂载时使用的用户/组 ID 与文件所有者不匹配。
- 解决:
- 在 EC2 上,使用
ls -l /mnt/efs查看文件权限。 - 在 EFS 上,确保根目录 () 的权限是
755,并且文件/目录的所有者和组权限是正确的。 - 考虑使用
uid和gid挂载选项来显式指定映射的用户和组 ID。
- 在 EC2 上,使用
