[转帖]s3fs把 s3-like 对象存储挂载到本地

s3fs,s3,like,对象,存储,挂载,本地 · 浏览次数 : 0

小编点评

**文件写入分三个阶段:** 1. 文件写入到到fuse的某个地方。 2. 4G文件大概花费了9s。 3. 文件写入到到fuse的某个地方。 **文件上传阶段:** 1. 两个阶段,实际上不会占用带宽,但会占用时间。 2. 3个阶段,可以跑满带宽。 **S3FS 的优缺点:** **优点:** * 允许 Unix 普通用户在不修改内核的条件下能够创建自己的文件系统。 * 通过 FUSE 实现,可以提供用户级文件系统。 **缺点:** * 文件系统仅支持对象存储。 * 文件系统修改是重传,大文件的话就要考虑带宽成本和修改速度。 * 文件系统不支持文件大小超过 256T。 * 使用 FUSE 的文件系统可能比 s3fs 的文件系统慢一些。

正文

s3fs把 s3-like 对象存储挂载到本地 

s3fs把 s3-like 对象存储挂载到本地 

 

s3fs-fuse 是一个采用 c++🚀 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 API 的第三方对象存储像普通文件系统一样挂载到本地计算机,由于这种功能通过 FUSE 实现,因此只能在 Linux 和 MacOS 上使用。

安装

安装参考📙

官方编译安装参考wiki 🍌

配置

  1. 准备密码文件

S3 及兼容 API 的对象存储都采用 ACCESS KEY 和 ACCESS SECRET 认证身份,为了方便配置,可以将认证 KEY 放到独立的密码文件中,s3fs 默认会从以下两个文件中读取认证信息:

  • 用户家目录下的 .passwd-s3fs 文件 (例如 ~/.passwd-s3fs)
  • 全局文件 /etc/passwd-s3fs

任选其一即可,文件默认不存在,需要自己手动创建。

复制$ echo ACCESS_KEY_ID:SECRET_ACCESS_KEY >  ~/.passwd-s3fs
$ chmod 600  ~/.passwd-s3fs
  1. 挂载 AWS S3
复制$ s3fs mybucket /path/to/mountpoint -o passwd_file=~/.passwd-s3fs
  • mybucket 替换成实际的 S3 Bucket
  • /path/to/mountpoint 替换成本地挂载点
  • -o 用来指定额外的参数,除非密码文件没有放在默认位置,否则不需指定密码文件。
  1. 挂载兼容 S3 API 的第三方对象存储

用 -o 指定对象存储 Endpoint 地址即可,阿里云OSS Endpoint地址参考这里🌐七牛对象存储 Endpoint地址参考这里🌐

复制$ s3fs mybucket /path/to/mountpoint -o url=https://endpoint -o use_path_request_style

use_path_request_style 参数是对还不支持 virtual-host 请求风格的对象存储而提供的参数,指定该参数会使用传统的 API 调用风格。实测表明,阿里云 OSS 和七牛对象存储不需指定该参数。

  1. 开机自动挂载

编辑 /etc/fstab:

  • For S3
复制s3fs#mybucket /path/to/mountpoint fuse _netdev,allow_other 0 0
  • For S3-like
复制s3fs#mybucket /path/to/mountpoint fuse _netdev,allow_other,use_path_request_style,url=http://endpoint/ 0 0

注意:设置开机自动挂载可能需要把 s3fs 二进制文件放到 /usr/local/bin 目录,还要使用全局配置文件 /etc/passwd-s3fs 保存密码。

  1. 其他参数
  • use_cache 使用缓存

设置 use_cache 将本地计算机的某个位置作为缓存,从而提高数据上传的效率。

复制$ s3fs mybucket /path/to/mountpoint -o url=https://endpoint -o use_cache=/tmp

经过测试,普通盘的缓存可能还会降低吞吐,最好用机械盘,并做对比测试。

  • del_cache 删除缓存

指定 del_cache 参数,当 s3fs 启动和退出时会自动删除缓存文件。

性能优化

复制s3fs <bucket_name> <mountpoint> -o url=http://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=64 \
-o parallel_count=30 \
-o multireq_max=30 \
-o dbglevel=warn

参数分析🚀

普通用户命令行挂载s3fs

增加以下选项,并以管理员权限执行挂载命令

复制-o allow_other \
-o uid=1000 \
-o gid=1000 \
-o mp_umask=022 \

如果是/etc/fstab文件,增加相应的选项即可。

测试

环境信息:

  • Ubuntu 18
  • 48核(Intel(R) Xeon(R) CPU E5-2678 v3 @ 2.50GHz)
  • 128G

测试脚本

复制#!/bin/bash

BUCKET="testabc2"
MOUNT_POINT="/testabc2"
ENDPOINT=http://s3.test.com

parallel_counts=(10 20 30 40)
multipart_sizes=(10 16 32 64 128)

for parallel_count in ${parallel_counts[@]}; do
    for multipart_size in ${multipart_sizes[@]}; do
    	echo "parallel_count: $parallel_count | multipart_size: $multipart_size"
            # mount
            /usr/local/bin/s3fs $BUCKET $MOUNT_POINT -o passwd_file=/root/.passwd-s3fs -o url=$ENDPOINT \
            -o use_path_request_style \
            -o parallel_count=${parallel_count} \
            -o multipart_size=${multipart_size} \
            -o max_background=1000 \
    	    -o max_stat_cache_size=100000 \
    	    -o multireq_max=30

            sleep 1

            # pv copy
            dd if=/dev/zero of=${MOUNT_POINT}/2G.${RANDOM} bs=1M count=32 status=progress

            sleep 1

            # umount
            umount ${MOUNT_POINT}

            sleep 1
    done
done

测试结果

复制并发数              | 分片大小             吞吐
parallel_count: 10 | multipart_size: 10 73.6 MB/s
parallel_count: 10 | multipart_size: 16 110 MB/s
parallel_count: 10 | multipart_size: 32 108 MB/s
parallel_count: 10 | multipart_size: 64 99.9 MB/s
parallel_count: 10 | multipart_size: 128 102 MB/s

parallel_count: 20 | multipart_size: 10 74.2 MB/s
parallel_count: 20 | multipart_size: 16 106 MB/s
parallel_count: 20 | multipart_size: 32 108 MB/s
parallel_count: 20 | multipart_size: 64 105 MB/s
parallel_count: 20 | multipart_size: 128 100 MB/s

parallel_count: 30 | multipart_size: 10 77.2 MB/s
parallel_count: 30 | multipart_size: 16 107 MB/s
parallel_count: 30 | multipart_size: 32 105 MB/s
parallel_count: 30 | multipart_size: 64 102 MB/s
parallel_count: 30 | multipart_size: 128 112 MB/s

parallel_count: 40 | multipart_size: 10 73.0 MB/s
parallel_count: 40 | multipart_size: 16 109 MB/s
parallel_count: 40 | multipart_size: 32 104 MB/s
parallel_count: 40 | multipart_size: 64 102 MB/s
parallel_count: 40 | multipart_size: 128 108 MB/s

结果分析

parallel_count对吞吐的影响不大,multipart_size对吞吐影响较大,因此采用这组数据parallel_count: 10 | multipart_size: 16 110 MB/s

使用记录

  1. s3fs 挂载后 df 显示的空间是256T,并不是实际容量;官方解释,如果有1PB的空间,显示的256T并不影响实际的使用,只是使用率会超过100%。
    15-00-18-d4uyo4

dd文件吞吐测试

使用dd测试挂载后的硬盘性能,这里主要关注写入速度。使用的命令

复制dd if=/dev/zero of=4G.${RANDOM} bs=1M count=4096 status=progress

默认的日志记录在/var/log/messages或者/var/log/syslog中,默认日志级别是crit

使用-d或者--debug会将日志级别调整为info

使用dbglevel调整日志级别,可选crit(critical), err(error), warn(warning), info(information)

两个-d会将fuse的日志输出到标准输出。

-f可以让程序在前台运行,便于查看日志。

写入过程

通过观察日志发现,文件写入分三个阶段:

  1. 文件写入到到fuse的某个地方,4G文件大概花费了9s;因为不太了解实现细节,这里用了某个地方
  2. 文件分片,这部分也会花费一定的时间;时间和分片大小与并发有关。
  3. 文件上传,这个阶段才会占用带宽。前两个阶段,实际上并没有占用带宽,但会占用时间,所以会拉低整体dd的带宽。

三个阶段的发现,通过观察debug日志和实际网卡带宽。

测试结果

千兆网卡,阶段3可以跑满带宽,但因为阶段1、2存在,整体带宽只有80MB/s左右。
万兆网卡实际测速大概是110MB/s。

使用use_cache=/dev/shm也可以加快1阶段的速度。

另外,测试了goofys,千兆速度在100MB/s左右。万兆网卡的速度在500~600MB/s。相对于s3fs,goofys的使用有着更多的限制,参考current-status

S3FS 的优缺点

S3FS本质上是对象存储,其跟块存储还是有区别的,块存储我如果修改一个大文件的话,背后只修改对应的block;s3fs的修改是重传,大文件的话就要考虑带宽成本和修改速度。
主要适用于文件写入后,不会被频繁修改的场景。

Background Knowlage

Filesystem in Userspace 简称 FUSE。它允许 Unix 普通用户在不修改内核的条件下能够创建自己的文件系统。目前 Linux 通过内核模块对 FUSE 进行支持。一些文件系统如 ZFS、glusterfs 和 lustre 通过 FUSE 实现。

🌴Reference

 
分类: 存储

与[转帖]s3fs把 s3-like 对象存储挂载到本地 相似的内容:

[转帖]s3fs把 s3-like 对象存储挂载到本地

https://www.cnblogs.com/hiyang/p/12631908.html s3fs-fuse 是一个采用 c++🚀 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 API 的第三方对象存储像普通文件系统一样挂载到本地计算机,由于这种功能通过 FUSE 实现,因此

[转帖]s3fs把 s3-like 对象存储挂载到本地

s3fs把 s3-like 对象存储挂载到本地 s3fs把 s3-like 对象存储挂载到本地 s3fs-fuse 是一个采用 c++🚀 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 API 的第三方对象存储像普通文件系统一样挂载到本地计算机,由于这种功能通过 FUSE 实现,因

[转帖]S3FS 简介及部署

PS:文章一般都会先首发于我的个人Blog上:S3FS 简介及部署 · TonghuaRoot's BloG. ,有需要的小伙伴可以直接订阅我的Blog,获取最新内容。 0x00 前言 S3FS可以把S3 Bucket可以向挂盘一样,挂在本地,适用于Linux和Mac OS,完事复制粘贴写文件啥的跟

[转帖]使用S3F3在Linux实例上挂载Bucket

https://docs.jdcloud.com/cn/object-storage-service/s3fs S3F3是基于FUSE的文件系统,允许Linux 挂载Bucket在本地文件系统,S3fs能够保持对象原来的格式。使用S3F3可以把Bucket当成一个文件夹挂载到Linux系统内部,当成

[转帖]s3fs

https://github.com/s3fs-fuse/s3fs-fuse s3fs allows Linux, macOS, and FreeBSD to mount an S3 bucket via FUSE(Filesystem in Userspace).s3fs makes you op

[转帖]s3fs - 使用S3FS存储桶目录允许其他用户使用权限

https://www.coder.work/article/6661505 我在使用S3FS时遇到问题。我正在使用 ubuntu@ip-x-x-x-x:~$ /usr/bin/s3fs --version Amazon Simple Storage Service File System 1.71

[转帖]s3对象存储挂载到本地文件夹

https://www.zhangzhuo.ltd/articles/2021/10/22/1634888049032.html 一、s3fs工具 s3fs-fuse 是一个采用 c++ 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 API 的第三方对象存储像普通文件系统一样挂载到

[转帖][minio]挂载minio到本地

https://www.cnblogs.com/XY-Heruo/p/16489190.html 前言 将minio的bucket挂载到本地文件系统 环境 客户端系统版本:centos 7 MinIO节点IP:192.168.0.20 s3fs方式步骤 安装s3fs客户端(可能需要先安装epel-r

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻