使用 s3fs 安装存储区

需要对 NFS 样式的文件系统执行读写操作的应用程序可以使用 s3fs,s3fs 可以将存储区安装为目录,同时保留文件的本机对象格式。

这允许您使用熟悉的 shell 命令(如用于列示的 ls 或用于复制文件的 cp)与 Cloud Storage 进行交互,以及提供对依赖于读写本地文件的旧应用程序的访问权。 有关更详细的概述,请访问项目的官方自述文件

查找有关如何在 IBM Cloud Kubernetes Service 集群中使用 IBM Cloud® Object Storage 的指示信息? 改为转至 IBM Cloud Kubernetes Service 文档

先决条件

安装植入

在 Debian 或 Ubuntu 上:

sudo apt-get install automake autotools-dev fuse g++ git libcurl4-openssl-dev libfuse-dev libssl-dev libxml2-dev make pkg-config

在 RHEL 和 CentOS 7 或更高版本上,通过 EPEL:

sudo yum install epel-release
sudo yum install s3fs-fuse

您的设备必须具有公用连接才能拉取此 EPEL 存储库,因为它在 IBM的专用存储库中不可用。 有关更多信息,请参阅 如何在 RHEL 和 CentOS Stream 上安装 EPEL。

官方 s3fs 文档建议使用的是 libcurl4-gnutls-dev,而不是 libcurl4-openssl-dev。 这两者均可正常工作,但 OpenSSL 版本的性能可能更佳。

对于 macOS,您将需要从源构建 s3fs :

确保已安装以下软件包 (所有软件包都可通过 Homebrew 获得):

  • macfuse
  • automake
  • gcc
  • curl
  • libxml2
  • pkg-config
  • openssl

openssl 安装的输出中所述,您将需要设置以下环境变量:

export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@3/include"
export PKG_CONFIG_PATH="/usr/local/opt/openssl@3/lib/pkgconfig"

请注意,macFUSE 是包含内核扩展的闭源软件,可能需要许可证才能用于商业用途。

请首先克隆 Github 存储库:

git clone https://github.com/s3fs-fuse/s3fs-fuse.git 

然后构建 s3fs

cd s3fs-fuse
./autogen.sh
./configure
make

安装二进制文件:

sudo make install

配置

将凭证存储在包含 <access_key>:<secret_key>:<api_key> 的文件中。 此文件需要具有有限访问权,因此请运行:

chmod 0600 <credentials_file>

现在,您可以使用以下命令来安装存储区:

s3fs <bucket> <mountpoint> -o url=http{s}://<endpoint> -o passwd_file=<credentials_file>

如果凭证文件仅有 API 密钥(无 HMAC 凭证),那么还需要添加 ibm_iam_auth 标志:

s3fs <bucket> <mountpoint> -o url=http{s}://<endpoint> -o passwd_file=<credentials_file> -o ibm_iam_auth

示例中的 <bucket> 引用了现有存储区,而 <mountpoint> 是要在其中安装存储区的本地路径。 <endpoint> 必须对应于 存储区的位置credentials_file 是创建的包含 API 密钥或 HMAC 凭证的文件。

现在,ls <mountpoint> 将列示该存储区中的对象,如同它们是本地文件一样 (或者在对象前缀的情况下,如同它们是嵌套目录一样)。

性能优化

虽然性能绝不会与真正的本地文件系统完全一样,但是可以使用一些高级选项来提高吞吐量。

s3fs <bucket_name> <mountpoint> -o url=http{s}://<COS_endpoint> –o passwd_file=<credentials_file> \
-o cipher_suites=AESGCM \
-o kernel_cache \
-o max_background=1000 \
-o max_stat_cache_size=100000 \
-o multipart_size=52 \
-o parallel_count=30 \
-o multireq_max=30 \
-o dbglevel=warn
  1. cipher_suites=AESGCM 仅在使用 HTTPS 端点时适用。 缺省情况下,与 IBM COS 的安全连接使用的是 AES256-SHA 密码套件。 使用 AESGCM 套件可大大降低客户机上的 CPU 负载 (由 TLS 加密功能导致),同时提供相同级别的加密安全性。
  2. kernel_cache 支持 s3fs mountpoint 安装点上的内核缓冲区高速缓存。 这意味着对象将仅由 s3fs 读取一次,因为同一文件的重复读取可以通过内核的缓冲区高速缓存进行处理。 内核缓冲区高速缓存将仅使用未被其他进程使用的可用内存。 如果在存储区安装期间预期存储区对象会被其他进程/机器覆盖,并且您的用例需要实时访问最新的内容,那么建议不要使用此选项。
  3. max_background=1000 可提高 s3fs 并行文件读取性能。 缺省情况下,FUSE 支持最多 128 KB 的文件读请求。 当要求读取的对象超过此大小时,内核会将大请求拆分为较小的子请求,并允许 s3fs 以异步方式处理这些子请求。 max_background 选项用于设置此类并行异步请求的全局最大数目。 缺省情况下,它设置为 12,但将其设置为任意高值 (1000) 会阻止读取请求,即使在同时读取许多文件时也是如此。
  4. max_stat_cache_size=100000 可减少 HEAD 发送的冗余 HTTP s3fs 请求数,并缩短列出目录或检索文件属性所用的时间。 典型的文件系统用法会通过 stat() 调用频繁访问文件的元数据,该调用将映射到对象存储系统上的 HEAD 请求。 缺省情况下,s3fs 会高速缓存最多 1000 个对象的属性(元数据)。 每个高速缓存的条目最多需要 0.5 KB 内存。 理想情况下,您希望高速缓存能够保存存储区中所有对象的元数据。 但是,您可能需要考虑这种高速缓存对内存使用量的影响。 将其设置为 100000 需要的内存不超过 0.5 KB * 100000 = 50 MB。
  5. multipart_size=52 将设置从 COS 服务器发送和接收的请求和响应的最大大小 (以 MB 为单位)。缺省情况下,s3fs 将此值设置为 10 MB。 增大此值还会增加每个 HTTP 连接的吞吐量(MB/秒)。 另一方面,从文件提供的第一个字节的等待时间也将增加。 因此,如果您的用例仅读取每个文件中的少量数据,那么您可能不需要增大此值。 此外,对于大型对象(例如,超过 50 MB),如果此值足够小,允许使用多个请求来并行访存文件,那么吞吐量会增加。 我发现此选项的最佳值大约为 50 MB。 COS 最佳实践建议使用的请求数为 4 MB 的倍数,因此建议将此选项设置为 52 (MB)。
  6. parallel_count=30 设置每个文件读/写操作中并行发送给 COS 的最大请求数。 缺省情况下,此值设置为 5。 对于非常大的对象,您可以通过增大此值来获取更多吞吐量。 与先前选项一样,如果只读取每个文件的少量数据,请使此值保持较小。
  7. multireq_max=30 - 列出目录时,会针对列表中的每个对象发送对象元数据请求 (HEAD),除非在高速缓存中找到元数据。 此选项用于限制针对单个目录列示操作发送到 COS 的此类并发请求数。 缺省情况下,此值设置为 20。 请注意,此值必须大于或等于上面的 parallel_count 选项。
  8. dbglevel=warn 将调试级别设置为 warn,而不设置为缺省值 (crit),以将消息记录到 /var/log/syslog。

限制

请务必记住,s3fs 可能并不适用于所有应用程序,因为 Object Storage 服务的首字节响应时间的等待时间较长,并且缺少随机写访问权。 仅读取大文件的工作负载(如深度学习工作负载)可以使用 s3fs 实现良好的吞吐量。