Amazon EFS(弹性文件系统)通过提供无限扩展的共享存储,完美解决了多EC2实例并发访问数据的需求,其核心优势在于按需付费且无需预置容量,特别适合需要高耐用性和灵活性的Linux工作负载。
在云原生架构日益普及的今天,存储不仅仅是数据的容器,更是业务连续性的基石,许多开发者在构建分布式应用时,常常面临一个痛点:如何让位于不同可用区(Availability Zone)的多个EC2实例,像访问本地硬盘一样无缝、一致地读写同一份数据?传统的EBS卷虽然性能强劲,但它是单挂载点,无法实现共享,这时,Amazon EFS便成为了那个“全能管家”,它基于NFS协议,能够同时被成百上千个EC2实例挂载,无论这些实例分布在哪个可用区,都能获得一致的文件视图,这种架构不仅消除了数据孤岛,更让扩容变得像呼吸一样自然。
为什么选择EFS而非传统存储方案
在决定使用EFS之前,理解其与传统存储方案的差异至关重要,业内专家指出,对于大多数需要共享访问的场景,EFS提供的价值远超单纯的性能指标。
EFS与EBS的深度对比
许多初学者容易混淆EFS和EBS的适用场景,EBS是为单实例优化的块存储,而EFS是为多实例共享优化的文件存储。
- 挂载方式:EBS必须附加到单个EC2实例,就像给电脑插了一块独立硬盘;EFS则通过网络挂载到多个实例,更像是一个共享文件夹。
- 扩展性:EBS扩容需要指定新的卷大小,且存在上限;EFS则是无限扩展的,你不需要预先规划容量,存多少付多少。
- 性能模式:EBS提供固定的IOPS或吞吐量;EFS则提供通用型和吞吐量优化型两种模式,能根据负载自动调整。
据行业共识认为,当你的应用需要跨多个实例共享代码库、日志文件或媒体资产时,EFS是无可替代的选择,如果仅仅是为了数据库或单用户应用,EBS依然是更经济高效的选择。
成本结构的透明化
EFS的定价模式非常直观,主要由两部分组成:存储容量和吞吐量。

- 存储费用:采用分层存储策略,标准层适合频繁访问的数据;Infrequent Access(IA)层适合不常访问但需快速检索的数据,价格更低;Archive Access层则适合归档数据,价格极具竞争力。
- 吞吐量费用:如果你选择“ bursting throughput”(突发吞吐量),则无需为吞吐量付费,只需为存储付费,这对于大多数Web服务器和开发环境来说,足以应对日常需求,只有当你的应用需要极高的IOPS时,才需要考虑预置吞吐量模式。
这种按需付费的模式,使得初创公司无需担心初期存储投入过大,也避免了大型企业因预估不足导致的资源浪费。
创建EFS文件系统的实操步骤
创建EFS并不复杂,但细节决定成败,以下是在AWS控制台中创建EFS的标准流程,每一步都关乎后续的性能和安全性。
第一步:网络与安全组配置
在创建文件系统之前,必须确保你的VPC(虚拟私有云)和网络接口已准备就绪,EFS必须部署在与EC2实例相同的VPC中,且最好在同一可用区内,以减少网络延迟。
- 登录AWS Management Console,进入EFS控制台。
- 点击“Create file system”(创建文件系统)。
- 选择“Customize”(自定义)以进行高级设置。
- 在“VPC”下拉菜单中,选择你的目标VPC。
- 选择至少两个不同的可用区(AZ),以实现高可用性,选择us-east-1a和us-east-1b。
第二步:配置访问点与安全组
安全组是EFS的第一道防线,你需要创建一个专门的安全组,允许来自EC2实例的NFS流量。
- 入站规则:添加NFS(端口2049)规则,源设置为你的EC2实例所在的安全组ID,严禁设置为0.0.0.0/0,除非你完全理解公共访问的风险。
- 出站规则:保持默认,允许所有出站流量。
建议启用“Access Points”(访问点),访问点允许你为不同的应用程序或用户创建独立的命名空间,即使它们挂载在同一个EFS文件系统上,你可以创建一个名为

/app1的访问点给前端服务,另一个名为/logs的访问点给日志收集服务,互不干扰。
第三步:选择性能模式与吞吐量模式
这是影响性能的关键决策。
- General Purpose(通用模式):适用于大多数文件工作负载,如Web服务器、内容管理系统和开发环境,它平衡了性能和成本。
- Max I/O(最大I/O模式):适用于需要极高并行IOPS的场景,如大规模数据分析,但请注意,这种模式的延迟略高,且费用更高。
对于吞吐量模式,推荐选择“Bursting”(突发模式),它允许系统在存储容量较低时提供较高的吞吐量,随着存储量增加,基准吞吐量线性增长,只有当你的应用需要持续的高吞吐量时,才选择“Provisioned”(预置模式)。
挂载EFS到EC2实例
创建完成后,下一步是将EFS挂载到你的Linux实例上,这个过程需要安装NFS客户端并配置自动挂载。
安装NFS客户端
大多数现代Linux发行版(如Amazon Linux 2026, Ubuntu 22.04)默认已安装NFS客户端,如果没有,可以使用以下命令安装:
sudo yum install nfs-utils -y # 适用于Amazon Linux/RHEL sudo apt-get install nfs-common -y # 适用于Ubuntu/Debian
挂载文件系统
- 在EFS控制台,点击你刚创建的EFS ID,复制“DNS name”(DNS名称)。
- 在EC2实例上,创建挂载点目录:
sudo mkdir -p /mnt/efs/fs1
- 执行挂载命令:
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport <EFS_DNS_NAME>:/ /mnt/efs/fs1
nfsvers=4.1:使用NFSv4.1协议,支持更好的性能和元数据缓存。hard:如果网络中断,客户端会重试而不是报错退出,保证数据一致性。-

timeo=600:设置超时时间为60秒,避免短暂网络波动导致挂载断开。
配置自动挂载
为了确保EC2重启后EFS能自动挂载,需要修改/etc/fstab文件:
sudo nano /etc/fstab
在文件末尾添加以下行:
<EFS_DNS_NAME>:/ /mnt/efs/fs1 nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 0 0
保存并退出,你可以运行sudo mount -a来测试配置是否正确,无需重启即可生效。
常见问题与最佳实践
在实际操作中,用户可能会遇到一些典型问题,以下是基于大量案例总结的解决方案。
Q&A:关于EFS的常见疑问
Q1: EFS创建网络文件系统后,Windows实例能挂载吗?
A1: 原生不支持,Amazon EFS仅支持NFS协议,因此只能挂载到Linux实例,如果你需要在Windows环境中使用共享文件存储,应使用Amazon FSx for Windows File Server,它基于SMB协议,完全兼容Windows AD集成和权限管理。
Q2: EFS的吞吐量如何监控?
A2: 可以通过Amazon CloudWatch监控EFS的指标,重点关注“BurstBalance”(突发余额)和“PermittedThroughput”(允许吞吐量),如果BurstBalance接近0,说明系统正在使用预置吞吐量或达到上限,此时可能需要升级吞吐量模式或优化应用IO模式。
Q3: EFS是否支持加密?
A3: 是的,在创建EFS时,默认启用AWS托管密钥(AWS managed key)的静态加密,你也可以选择使用客户管理的KMS密钥(Customer managed KMS key)以增强合规性,加密过程对应用透明,无需修改代码。
Amazon EFS以其无限的扩展性和共享能力,成为了现代云架构中不可或缺的一部分,通过合理选择性能模式、配置安全组以及优化挂载参数,你可以构建出一个既高效又安全的存储层,没有最好的存储,只有最适合场景的存储,对于需要共享、灵活且无需预置容量的Linux工作负载,EFS无疑是当前的最优解。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/424279.html
