亚马逊AWS官方博客

利用 EFS 快速搭建 NFS 文件系统

Amazon Elastic File System (Amazon EFS) 是AWS云上一个全托管的弹性NFS文件系统服务。EFS具有简单易用并可扩展的特性,与AWS的其他云服务紧密集成,同时也可以被本地数据中心所使用。EFS设计为可根据文件存储变化而自动进行扩缩容,同时对应用不产生中断。用户无须手动去进行存储空间的管理。EFS托管服务会自动管理文件存储底层的基础架构,用户无须关心文件系统部署、补丁管理和配置维护的技术细节,相比以往自建NFS服务器的方式,运维效率得到提高,成本也相应下降。

目前EFS已在在西云数据运营的 AWS 中国(宁夏)区域和光环新网运营的 AWS 中国(北京)区域上线。

EFS架构与基本概念

在控制台实际操作前,我们可以先简单了解一下EFS的架构和基本概念

上图是一个AWS区域中EC2实例访问EFS的架构示例,几个常见的概念简述如下:

  • 文件系统(Filesystem)

EFS是一个区域性的服务,即托管文件系统的数据和元数据会自动存储在AWS区域内的多个可用区,以实现跨可用区的数据保护。VPC内的EC2实例或用户数据中心内的服务器均可通过网络以Network File System version4(NFS v4.1和V4.0)协议对文件系统进行访问。

  • 挂载目标(Mount Target)

VPC中的EC2实例通过挂载目标来访问文件系统。挂载目标提供了VPC内的一个IP地址,每个可用区可以配置一个挂载目标,以便作为该可用区内的NFS服务器端点。挂载目标虽然是一个静态IP,但本身是进行高可用设计的,后面对应的是冗余的资源。EC2实例挂载时,可以直接指定一个对与文件系统一一对应的DNS域名,该域名会自动解析到EC2实例所在子网所对应的挂载目标上,从而简化文件系统的挂载工作。如果通过挂载帮助程序,则可以直接指定文件系统ID。

  • 权限控制

在网络层面,每个挂载目标可以设定一个或多个安全组,即类似于防火墙,可以设定哪些EC2实例有权限访问该挂载目标从而挂载文件系统。此外,用户可以使用文件系统策略(File System Policy)和访问点(Access Point)来进行更细粒度的权限控制。

演示

接下来会以宁夏区为例介绍如何快速部署一个EFS文件系统并挂载至EC2实例上

1. 创建文件系统

1.1 配置网络访问

指定EFS文件系统所对应的VPC,及在对应的子网创建挂载目标并设置安全组。

  • 一个文件系统仅对应一个VPC,但其他VPC的EC2实例可以通过VPC Peering打通VPC间的通道后再进行EFS文件系统挂载。
  • 每个可用区建议对应创建一个挂载目标,这样可以确保不同可用区的EC2实例均可挂载文件系统。如果该可用区中有多个子网,只需要选择其中一个即可,该可用区下所有子网均可以访问到对应的挂载目标。
  • 如果后续文件系统需要更换VPC,可以先将挂载目标删除后再进行更换。

本次演示会使用向导所指定的VPC默认安全组,同时后续EC2实例也会挂载该安全组以便与挂载目标进行通信。

1.2 配置文件系统设置

指定EFS文件系统的标签、生命周期管理策略、与性能相关的模式设置和数据加密等

  • 通过标签(Tag)可以为文件系统进行描述
  • 通过生命周期管理策略, EFS可以自动将指定时间(如7或14天或至最长90天)未访问的数据自动从EFS Standard转换至EFS IA(Infrequent Access, 不常访问)。该功能可以简单的理解为数据自动的冷热分层。EFS IA对应的是冷存储层,相比EFS Standard来说单位存储成本更低,且不会牺牲可用性、持久性和弹性等EFS的存储特性。需要注意到除了存储成本,EFS IA会按照数据访问量进行收费。简单来说,对于不常访问的数据,迁移至IA可以看到明显的成本优化。通过生命周期管理策略可以自动进行不常访问的数据的迁移,从而自动进行成本优化而无须人工干预。在这个演示中我们暂时不启用生命周期管理策略。
  • 吞吐量模式:分为突增(Bursting)和预置(Provisioned)两种。在突增模式下,文件系统的吞吐性能随着存储容量增加而增长。典型文件系统的负载通常会猛增,在短时间内吞吐量较高,而其余时间吞吐量较低。因此,突增模式下EFS可在一段时间内突增到高吞吐量。对于存储容量较小但又需要较高吞吐量的场景,则可以使用预置模式,直接设定EFS文件系统的吞吐量上限。在这个演示我们使用默认的突增模式
  • 性能模式:分为通用(General Purpose)和最大I/O(Max I/O)两种。通用模式适合于绝多数的EFS文件系统使用场景,特别是对延时较为敏感的应用。如果希望有更高的吞吐量和IOPS要求,则可以考虑最大I/O模式,但该模式下元数据的操作延时会相对较高。在这个演示我们使用默认的通用模式。
  • 加密:EFS可以与KMS结合,从而实现对存储在EFS文件系统内的数据进行加密。在这个演示中我们暂时不开启加密功能。

1.3 配置客户端访问

通过文件系统策略(File System Policies)可以指定NFS客户端对EFS文件系统所具有的权限, 包括读写权限,是否要求传输加密等。而访问点(Access Points)是 EFS文件系统中特定于应用程序的入口点,以管理应用程序对共享数据集的访问。通过访问点发出的所有文件系统请求可以被强制执行用户身份(包括用户组)。访问点还可以为文件系统强制执行不同的根目录,客户端只能访问指定目录或之下目录中的数据。

在这个演示中我们暂时不对文件系统权限和访问点进行配置,仅使用前面配置的安全组来做访问权限的控制。

1.4 审核与创建

最后我们检查一下配置是否正确 ,没问题的话就可以开始创建文件系统了

文件系统成功创建后,可以在控制台查看文件系统状态,挂载目标状态等信息。注意到此时文件系统还没有数据写入,目前的容量显示只有6KB(文件系统相关元数据的存储开销)

2. 挂载文件系统

2.1 部署EC2实例并配置安全组

接下来我们在刚才创建的文件系统对应的VPC中部署一台EC2实例,需要关联EFS文件系统挂载目标所对应的安全组,在这个演示中我们使用了VPC默认的安全组

可以看到这个默认安全组放通所有的流量,但是来源仅限于这个安全组。也就是说只要挂载了这个安全组的EC2实例,就可以与EFS挂载目标进行通信而不受限制。生产环境可以根据实际需要进一步缩小放通的端口范围等

2.2 安装EFS挂载帮助程序(Mount Helper)并挂载文件系统

EFS文件系统支持NFS协议,可以直接使用原有的NFS客户端来进行NFS文件系统挂载。另外EFS也提供了一个挂载帮助程序,以简化文件系统挂载,同时提供对EFS独特功能(如IAM认证,TLS传输加密和访问点等)。在文件系统状态页面,会有相应的链接和说明告诉用户如何来进行文件系统挂载:

这里我们以安装了Amazon Linux 2且类型为m5.large的EC2实例,演示如何从本地VPC用EFS挂载帮助程序来挂载文件系统:

首先登录EC2实例,安装EFS挂载程序:

sudo yum -y install amazon-efs-utils

接着创建挂载点目录:

sudo mkdir /mnt/efs

然后通过EFS挂载程序进行文件系统挂载

sudo mount -t efs fs-c4f11721:/ /mnt/efs

注意:
目前通过yum安装的EFS挂载程序对国内区域的文件系统域名处理有问题,会导致挂载文件系统时出现类似如下报错:

Failed to resolve "fs-c4f11721.efs.cn-northwest-1.amazonaws.com" - check that your file system ID is correct.
See https://docs.aws.amazon.com/console/efs/mount-dns-name for more detail.

目前解决方法是通过下面的命令修改配置文件:

echo -e '\n[mount.cn-north-1]\ndns_name_suffix = 
amazonaws.com.cn\n\n[mount.cn-northwest-1]\ndns_name_suffix = 
amazonaws.com.cn' | sudo tee -a /etc/amazon/efs/efs-utils.conf

再重新进行挂载即可。
该问题已经在最新的efs-utils版本上得到修复,很快新版本会更新至Amazon Linux RPM Repository中,目前用户也可以从Github上直接下载最新版本的EFS挂载程序以规避该问题,具体可查看参考资料中的相关链接

3. 检查文件系统

至此我们已经完成了文件系统的创建,接下来我们可以进行写入测试,并检查文件系统的状态。
通过dd往EFS文件系统写入一个20G的文件

sudo time dd if=/dev/zero of=/mnt/efs/20G-dd-$(date +%Y%m%d%H%M%S.%3N) bs=1M count=20480 conv=fsync

20480+0 records in 
20480+0 records out 
21474836480 bytes (21 GB) copied, 203.763 s, 105 MB/s 
0.06user 10.66system 3:23.81elapsed 5%CPU (0avgtext+0avgdata 3040maxresident)k 
0inputs+41943040outputs (0major+340minor)pagefaults 0swaps

 

可以看到这里统计的吞吐量是105MB/s。根据EFS官方文档提到的突增吞吐量的说明,小于1TB的文件系统,均可突增到100MB/s;而对于超过1TB的文件系统,存储在EFS标准上每1TB数据则可以突增100MB/s。另外需要注意到的是,EFS文件系统的性能实际上与上文提到性能模式、EC2实例网络带宽、并发压力和IO类型等等许多因素都有关,如果需要进行压力测试,可以查看参考资料里关于性能的文档链接

此时检查文件系统状态,此时可以看到文件系统的实际大小已更新为20GB:

 

小结

从这个演示我们可以看到EFS是一个托管的NFS文件服务, 用户只需要进行简单的配置就可以快速部署出一个高可用并可无限扩展的NFS文件系统。结合EFS的生命周期管理策略,数据可以实现冷热分层,从而降低存储成本。通过文件系统策略和访问点,用户还可以实现更为细粒度的权限控制。相关的技术细节可以参考EFS官方文档。

现在就开始动手测试起来吧!

参考资料

本篇作者

林俊

AWS解决方案架构师,主要负责企业客户的解决方案咨询与架构设计优化,同时致力于AWS云存储及IoT类服务的应用和推广。