需要对 NFS 样式的文件系统执行读写操作的应用程序可以使用 s3fs
,s3fs 可以将存储区安装为目录,同时保留文件的本机对象格式。
这允许您使用熟悉的 shell 命令(如用于列示的 ls
或用于复制文件的 cp
)与 Cloud Storage 进行交互,以及提供对依赖于读写本地文件的旧应用程序的访问权。 有关更详细的概述,请访问项目的官方自述文件。
安装植入
在 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
提示:官方
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"
请首先克隆 Github 存储库:
git clone https://github.com/s3fs-fuse/s3fs-fuse.git
然后构建 s3fs
和安装二进制文件:
cd s3fs-fuse
./autogen.sh
./configure
make && make install
配置
创建s3fs密码文件 将ACCESS_KEY_ID和SECRET_ACCESS_KEY替换为你自己的
echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3fs
chmod 600 ${HOME}/.passwd-s3fs
使用以下命令将S3FS文件系统挂载到本地目录:
s3fs <bucket> <mountpoint> -o url=http{s}://<endpoint> -o passwd_file=<credentials_file>
示例中的 <bucket>
引用了现有存储区,而 <mountpoint>
是要在其中安装存储区的本地路径。 <endpoint>
必须对应于存储区的位置。 credentials_file
是创建的包含 API 密钥或 HMAC 凭证的文件。
性能优化
虽然性能绝不会与真正的本地文件系统完全一样,但是可以使用一些高级选项来提高吞吐量。
s3fs mp4 /data/s3 -o url=https://ap-south-1.linodeobjects.com -o passwd_file=${HOME}/.passwd-s3fs \
-o cipher_suites=AESGCM \
-o max_background=1000 \
-o max_stat_cache_size=100000 \
-o max_dirty_data=102400 \
-o multipart_size=52 \
-o parallel_count=30 \
-o multireq_max=30 \
-o sigv2 \
-o curldbg \
-o allow_other
-o sigv2
:签名版本号,默认为v2,可选v2和v4版本。-o max_dirty_data=102400
-o passwd_file=
:密码文件存储路径-o allow_other
:允许所有用户访问cipher_suites=AESGCM
仅在使用 HTTPS 端点时适用。 缺省情况下,与 IBM COS 的安全连接使用的是AES256-SHA
密码套件。 使用AESGCM
套件可大大降低客户机上的 CPU 负载 (由 TLS 加密功能导致),同时提供相同级别的加密安全性。-o kernel_cache
支持s3fs mountpoint
安装点上的内核缓冲区高速缓存。 这意味着对象将仅由s3fs
读取一次,因为同一文件的重复读取可以通过内核的缓冲区高速缓存进行处理。 内核缓冲区高速缓存将仅使用未被其他进程使用的可用内存。 如果在存储区安装期间预期存储区对象会被其他进程/机器覆盖,并且您的用例需要实时访问最新的内容,那么建议不要使用此选项。-o max_background=1000
可提高s3fs
并行文件读取性能。 缺省情况下,FUSE 支持最多 128 KB 的文件读请求。 当要求读取的对象超过此大小时,内核会将大请求拆分为较小的子请求,并允许 s3fs 以异步方式处理这些子请求。max_background
选项用于设置此类并行异步请求的全局最大数目。 缺省情况下,它设置为 12,但将其设置为任意高值 (1000) 会阻止读取请求,即使在同时读取许多文件时也是如此。-o max_stat_cache_size=100000
可减少HEAD
发送的冗余 HTTPs3fs
请求数,并缩短列出目录或检索文件属性所用的时间。 典型的文件系统用法会通过stat()
调用频繁访问文件的元数据,该调用将映射到对象存储系统上的HEAD
请求。 缺省情况下,s3fs
会高速缓存最多 1000 个对象的属性(元数据)。 每个高速缓存的条目最多需要 0.5 KB 内存。 理想情况下,您希望高速缓存能够保存存储区中所有对象的元数据。 但是,您可能需要考虑这种高速缓存对内存使用量的影响。 将其设置为100000
需要的内存不超过 0.5 KB * 100000 = 50 MB。-o multipart_size=52
将设置从 COS 服务器发送和接收的请求和响应的最大大小 (以 MB 为单位)。缺省情况下,s3fs
将此值设置为 10 MB。 增大此值还会增加每个 HTTP 连接的吞吐量(MB/秒)。 另一方面,从文件提供的第一个字节的等待时间也将增加。 因此,如果您的用例仅读取每个文件中的少量数据,那么您可能不需要增大此值。 此外,对于大型对象(例如,超过 50 MB),如果此值足够小,允许使用多个请求来并行访存文件,那么吞吐量会增加。 我发现此选项的最佳值大约为 50 MB。 COS 最佳实践建议使用的请求数为 4 MB 的倍数,因此建议将此选项设置为 52 (MB)。-o parallel_count=30
设置每个文件读/写操作中并行发送给 COS 的最大请求数。 缺省情况下,此值设置为 5。 对于非常大的对象,您可以通过增大此值来获取更多吞吐量。 与先前选项一样,如果只读取每个文件的少量数据,请使此值保持较小。-o multireq_max=30
- 列出目录时,会针对列表中的每个对象发送对象元数据请求 (HEAD
),除非在高速缓存中找到元数据。 此选项用于限制针对单个目录列示操作发送到 COS 的此类并发请求数。 缺省情况下,此值设置为 20。 请注意,此值必须大于或等于上面的parallel_count
选项。-o dbglevel=warn
将调试级别设置为warn
,而不设置为缺省值 (crit
),以将消息记录到 /var/log/syslog。
限制
请务必记住,s3fs 可能并不适用于所有应用程序,因为 Object Storage 服务的首字节响应时间的等待时间较长,并且缺少随机写访问权。 仅读取大文件的工作负载(如深度学习工作负载)可以使用 s3fs
实现良好的吞吐量。
评论区