https://www.zhangzhuo.ltd/articles/2021/10/22/1634888049032.html

一、s3fs工具

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

1.1 什么是FUSE

Filesystem in Userspace顾名思义,即在用户空间的文件系统。
为什么要强调用户空间呢?接触过Linux内核的大概会知道,文件系统一般是实现在内核里面的,比如,Ext4、Fat32、NTFS(Kernel原生版)等常见的文件系统,其代码都在内核中,而FUSE特殊之处就是,其文件系统的核心逻辑是在用户空间实现的。

优势

  • 文件系统的改动不用更新内核, FUSE的核心逻辑在用户空间,所以修改文件系统的行为绝大部分修改会在用户空间。这在很多场合是一件很方便的事情。
  • 很容易实现自己的文件系统,理论上它可以实现任何天马行空的文件系统,只要一个开发者实现了基本的文件操作。而这个所谓的文件操作也是自己定义的,甚至可以这个操作可能只是一句打印而已,或者是一件超级复杂的事情,只要这个操作符合开发者的要求,他就完成了一个符合开发者需求的文件系统(也许本质上并不是文件系统了,这种情况是有现实例子的)。

劣势

  • 效率较低,这是显而易见的,就针对块设备的文件系统而言,用户层肯定不如内核实现的效率高,毕竟用户态/内核态切换的开销是少不了的。这也是符合一般软件规律的,越高层次的软件易用性越高,效率越低。

FUSE实现原理

图中体现了FUSE的2个关键部分(绿色方框),分别是Kernel中的那个FUSE(这里简称kernel FUSE)和user space中的那个**fuse_user程序。其中kernel FUSE是负责把从用户层过来的文件系统操作请求传递给fuse_user程序的,而这个fuse_user**程序实现了前面所说的文件系统的核心逻辑。

1.2 s3fs工具的安装使用

安装可以是rpm包安装或者是docker容器启动

s3fs官方github:https://github.com/s3fs-fuse/s3fs-fuse

s3fs镜像地址:https://hub.docker.com/r/panubo/s3fs

1.2.1.centos系统安装使用s3fs

1.安装

#安装s3fs,yum安装需配置epel源
[09:45:09 root@centos7 ~]#yum install s3fs-fuse -y #验证安装的版本
[09:56:02 root@centos7 ~]#s3fs --version
Amazon Simple Storage Service File System V1.90 (commit:unknown) with OpenSSL

2.使用

我这里的对象存储使用minio

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

  • 用户家目录下的 .passwd-s3fs 文件 (例如 ~/.passwd-s3fs)
  • 全局文件 /etc/passwd-s3fs
#任选其一即可,文件默认不存在,需要自己手动创建。
[09:56:05 root@centos7 ~]#echo minio:minio123 >~/.passwd-s3fs
#权限必须设置否则报错
[09:58:11 root@centos7 ~]#chmod 600 ~/.passwd-s3fs
#挂载s3存储桶
[10:01:09 root@centos7 ~]#s3fs data /data -o use_path_request_style -o url=http://192.168.10.72:9000 #验证,这里的容量是不正确的,但是并不影响使用实际容量是对象存储的容量
[10:01:50 root@centos7 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
s3fs 16E 0 16E 0% /data
[10:01:52 root@centos7 ~]#ls /data/
fstab test #卸载,使用umount命令即可

3.开机自动挂载

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

s3fs#data /data fuse _netdev,allow_other,use_path_request_style,url=http://192.168.10.72:9000 0 0

5.普通用户挂载

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

6.s3fs命令详解

s3fs s3对象存储桶名称  挂载的文件位置
use_path_request_style #这个参数的作用为,不把桶名称重定向到访问对象存储的url
url #s3对象存储的访问地址
passwd_file #认证文件,如果不放在默认路径需要手动指定
se_cache #将本地计算机的某个位置作为缓存
del_cache #当s3fs启动和退出时会自动删除缓存文件
allow_other #允许非root用户挂载
-o #参数
-f #前台运行,主要用来调试可以显示日志
-d #在前台运行的情况下,显示debug级别的日志

7.s3fs优化

虽然性能永远无法等于真正的本地文件系统,但可以使用一些高级选项来增加吞吐量。

  • cipher_suites=AESGCM仅在使用 HTTPS 端点时具有相关性。
  • kernel_cache启用安装点上的内核缓冲缓存。这意味着对象将只读取一次,因为重复读取相同的文件可以从内核的缓冲缓存中送达。内核缓冲缓存将仅使用其他流程未使用的免费内存。如果您预计在安装存储桶时从其他流程/机器中覆盖存储桶对象,并且您的用例需要实时访问最新的内容,则不建议此选项。
  • max_background=1000提高并发文件读取性能。默认情况下,FUSE 支持高达 128 KB 的文件读取请求。当要求阅读更多内容时,内核将大请求拆分为较小的子请求,并允许 s3fs 异步处理它们。该选项设定了此类并发异步请求的全球最大数量。默认情况下,它被设置为 12,但将其设置为任意的高值 (1000) 可防止读取请求被阻止,即使同时读取大量文件。
  • max_stat_cache_size=100000减少由 HTTP 发送的冗余请求数量,并减少列出目录或检索文件属性所需的时间。典型的文件系统使用通过在对象存储系统上进行地图请求的呼叫频繁访问文件的元数据。默认情况下,缓存多达 1000 个对象的属性(元数据)。每个缓存条目最多需要 0.5 KB 的内存。理想情况下,您希望缓存能够保存存储桶中所有对象的元数据。但是,您可能需要考虑此缓存的内存使用影响。将其设置为不超过 0.5 KB = 100000 = 50 MB。
  • multipart_size=52将以 MB 比例设置从s3服务器发送和接收的请求和响应的最大大小。 默认情况下将此设置为 10 MB。增加此值还会增加每个 HTTP 连接的吞吐量 (MB/s)。此外,对于大型对象(例如,超过 50 MB),如果此值足够小,允许使用多个请求同时获取文件,则吞吐量会增加。我发现此选项的最佳值约为 50 MB。
  • parallel_count=30设置每个文件读取/写操作同时发送到 服务器的最大请求数。默认情况下,此设置为 5。对于非常大的对象,您可以通过增加此值获得更多的吞吐量。与之前的选项一样,如果您只读取每个文件的少量数据,则保持此值低。
  • multireq_max=30列出目录时,每个列表中每个对象都会发送对象元数据请求 (除非元数据在缓存中找到)。此选项限制发送到 COS 的同步此类请求的数量,用于单个目录列表操作。默认情况下,它被设置为 20。请注意,此值必须大于或等于上述选项。
-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

8.文件写入过程

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

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

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

9.适用场景

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

1.2.2 docker容器方式使用

下载docker镜像

[10:41:30 root@centos7 ~]#docker pull panubo/s3fs:1.80
#由于镜像中的entrypoint指定了一个启动脚本,我们无法自定义启动s3fs命令的参数,所以需要重新构建下镜像
[10:41:40 root@centos7 ~]#docker inspect panubo/s3fs:1.80
"Entrypoint": [
"/entry.sh"
],

启动镜像

由于s3fs需要使用到内核中的fuse模块,并且挂载文件系统,所以容器需要使用特权模式--privileged参数,但是这个参数可能引发不必要的安全风险,请慎重考虑。docker运行s3fs并不可以同时挂载宿主机文件后,s3fs也指定挂载这个文件,s3fs实际上就是最后执行了mount命令,如果同时使用一个目录只有最后挂载的才生效。

启动官方说明:https://github.com/panubo/docker-s3fs/

docker run -it --rm --privileged \
-e AWS_ACCESS_KEY_ID=minio \
-e AWS_SECRET_ACCESS_KEY=minio123 \
-e AWS_STORAGE_BUCKET_NAME=data \
-e AWS_S3_URL=http://192.168.10.72:9000 \
-e AWS_S3_MOUNTPOINT=/mnt \
-e S3FS_ARGS='-o use_path_request_style -f -d' \
panubo/s3fs:1.80 ls

参数变量说明

  • AWS_ACCESS_KEY_ID - 认证信息
  • AWS_SECRET_ACCESS_KEY - 认证信息
  • AWS_STORAGE_BUCKET_NAME - 对象存储桶名称
  • AWS_S3_MOUNTPOINT - 挂载位置
  • AWS_S3_URL -访问对象存储服务器地址
  • S3FS_ARGS -s3fs命令其他参数

[转帖]s3对象存储挂载到本地文件夹的更多相关文章

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

    s3fs-fuse 是一个采用 c++

  2. 阿里云对象存储oss上传文件夹

    最近公司做工程项目,实现文件夹云存储上传. 网上找了一天,发现网上很多代码都存在相似问题,最后终于找到了一个满足我需求的项目. 工程如下: 这里对项目的大文件传输功能做出分析,怎么实现文件夹上传的,如 ...

  3. 【系统设计】S3 对象存储

    在本文中,我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务.S3 是 Amazon Web Services (AWS) 提供的一项服务, 它 ...

  4. Golang 调用 aws-sdk 操作 S3对象存储

    Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...

  5. Amazon S3 对象存储Java API操作记录(Minio与S3 SDK两种实现)

    缘起 今年(2023年) 2月的时候做了个适配Amazon S3对象存储接口的需求,由于4月份自学考试临近,一直在备考就拖着没总结记录下,开发联调过程中也出现过一些奇葩的问题,最近人刚从考试缓过来顺手 ...

  6. outlook邮箱邮件与企业邮箱同步(outlook本地文件夹邮件,web邮箱里没有)

    用惯了outlook2010, 问题:今天将邮件放到自定义文件夹后,发现在web邮箱中看不到邮件了.不能同步到企业邮箱. 解决忙了一天,才知道是账户类型问题,pop3类型,只下载不上传.所以outlo ...

  7. Windows 将FTP 映射到本地文件夹 --简化操作

    转载自yutiantongbu Windows 将FTP 映射到本地文件夹 --简化操作 1.右键我的电脑,选择映射网络驱动器 2.选择"连接到可用与存储文档和图片的网站" 3.接 ...

  8. Fiddler高级技巧 - 映射路径到本地文件夹

    适用场景: 你是前端开发人员,要开发一个小模块,需要用到线上的环境(账号.数据.跨域等),但你又没有权限往线上传文件 你是移动测试人员,需要将一组接口的返回结果替换为另一组,最简单的办法就是使用Fid ...

  9. nodejs:本地文件夹http服务器http-server

    一.已经安装nodejs的电脑,有一个方便通过http访问本地文件夹.文件夹服务器 static files over HTTP,并不是我们平常说的node那个web服务器哦 二.好处 可以方便实现跨 ...

  10. 两个简单的python文件,实现删除本地文件夹和mongodb数据库的内容

    删除本地文件夹: import os , string , datetime ; str = '/home/niuguoqin/tmp/tomcat/'; b = (datetime.datetime ...

随机推荐

  1. win10安装WSL

    一.什么是WSL? Windows Subsystem for Linux 简称 WSL,是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层. 二.如何安装WS ...

  2. GeminiDB Cassandra接口新特性PITR发布:支持任意时间点恢复

    本文分享自华为云社区<GeminiDB Cassandra接口新特性PITR发布:支持任意时间点恢复>,作者: GaussDB 数据库. 技术背景 当业务发生数据损毁.数据丢失.数据误删除 ...

  3. 为什么OpenAPI是未来企业数字化转型的决定性因素?

    本文分享自华为云开发者联盟公众号<为什么OpenAPI是未来企业数字化转型的决定性因素?>. 随着数字经济不断发展升级,数据互通.万物互联正在逐步成为IT产业发展的主旋律,企业数字化转型也 ...

  4. 实战案例丨GaussDB for DWS如何识别坏味道的SQL

    摘要:SQL中的坏味道,你知道吗? SQL语言是关系型数据库(RDB)的标准语言,其作用是将使用者的意图翻译成数据库能够理解的语言来执行.人类之间进行交流时,同样的意思用不同的措辞会产生不同的效果. ...

  5. Python图像处理丨带你掌握图像几何变换

    摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实. 本文分享自华为云社区<[Python图像处理] 十二.图像几何变换之图像仿射变换.图像透视变换和图像校 ...

  6. 顶会VLDB‘22论文解读:CAE-ENSEMBLE算法

    摘要:针对时间序列离群点检测问题,提出了基于CNN-AutoEncoder和集成学习的CAE-ENSEMBLE深度神经网络算法,并通过大量的实验证明CAE-ENSEMBLE算法能有效提高时间序列离群点 ...

  7. Flask小知识集合

    全局变量g的使用 flask在上下文中提供了四种变量,分别是: 变量名 上下文 说明 current_app 应用上下文 当前激活程序的程序实例 g 应用上下文 处理请求时用作临时存储的对象.每次请求 ...

  8. 【Vue day01】前端发展介绍 Vue的快速使用 插值语法 指令系统之文本指令、事件指令、属性指令

    目录 前端发展介绍 Vue框架入门 M-V-VM思想(重要) 组件化开发 单页面应用 Vue的快速使用 前期准备 快速使用 对象与标签绑定 查看Vue对象 插值语法 三目运算符 指令系统之文本指令 v ...

  9. 揭秘2022冬奥黑科技,阿里云视频云「Cloud ME」如何实现全息会面?

    2022北京冬奥会本是一届非凡的存在,这是有史以来第一次将奥运会所需的全部核心系统全面上云,以数字化技术创造奥运的新纪元. 但绿色奥运不止如此,在面临 Covid-19 限制和物理隔阂之下,千里之外, ...

  10. UVA - 10391:Compound Words (字符串水题)

    题目大意 给定若干单词,按字典序输出由两个单词拼接而成的单词 思路分析 用set存储所有单词,枚举每个单词word,遍历word的所有左右子串组合情况,若左右子串均在set中,说明符合题意.时间复杂度 ...