[转帖]s3fs把 s3-like 对象存储挂载到本地
s3fs把 s3-like 对象存储挂载到本地 s3fs把 s3-like 对象存储挂载到本地
s3fs-fuse 是一个采用 c++ 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 API 的第三方对象存储像普通文件系统一样挂载到本地计算机,由于这种功能通过 FUSE 实现,因此只能在 Linux 和 MacOS 上使用。
安装
配置
- 准备密码文件
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
- 挂载 AWS S3
复制$ s3fs mybucket /path/to/mountpoint -o passwd_file=~/.passwd-s3fs
mybucket替换成实际的 S3 Bucket/path/to/mountpoint替换成本地挂载点-o用来指定额外的参数,除非密码文件没有放在默认位置,否则不需指定密码文件。
- 挂载兼容 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 和七牛对象存储不需指定该参数。
- 开机自动挂载
编辑 /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保存密码。
- 其他参数
- 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。
使用记录
- s3fs 挂载后
df显示的空间是256T,并不是实际容量;官方解释,如果有1PB的空间,显示的256T并不影响实际的使用,只是使用率会超过100%。
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可以让程序在前台运行,便于查看日志。
写入过程
通过观察日志发现,文件写入分三个阶段:
- 文件写入到到fuse的某个地方,4G文件大概花费了9s;因为不太了解实现细节,这里用了某个地方。
- 文件分片,这部分也会花费一定的时间;时间和分片大小与并发有关。
- 文件上传,这个阶段才会占用带宽。前两个阶段,实际上并没有占用带宽,但会占用时间,所以会拉低整体
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-fuse 把 s3-like 对象存储挂载到本地
s3fs-fuse 是一个采用 c++
- 【系统设计】S3 对象存储
在本文中,我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务.S3 是 Amazon Web Services (AWS) 提供的一项服务, 它 ...
- 基于openshift+华为对象存储的CSI开发
目录 需求来源 环境准备 代码修改 镜像下载 镜像生成 修改部署文件 部署CSI插件 CSI原理 核心原理 生命周期: 组件介绍 FAQ 参考: 需求来源 项目上目前使用的是openshift 3.1 ...
- 010 Ceph RGW对象存储
一.对象存储 1.1 介绍 通过对象存储,将数据存储为对象,每个对象除了包含数据,还包含数据自身的元数据 对象通过Object ID来检索,无法通过普通文件系统操作来直接访问对象,只能通过API来访问 ...
- 对象存储服务-Minio
Mino 目录 Mino 对象存储服务 Minio 参考 Minio 架构 为什么要用 Minio 存储机制 纠删码 MinIO概念 部署 单机部署: Docker 部署Minio 分布式Minio ...
- FreeNAS 11.0 正式发布,提供 S3 兼容的对象存储服务
FreeNAS 11.0 正式版已发布,该版本带来了新的虚拟化和对象存储功能.FreeNAS 11.0 将 bhyve 虚拟机添加到其受欢迎的 SAN / NAS.Jail 和插件中,让用户可以在 F ...
- 基于LAMP php7.1搭建owncloud云盘与ceph对象存储S3借口整合案例
ownCloud简介 是一个来自 KDE 社区开发的免费软件,提供私人的 Web 服务.当前主要功能包括文件管理(内建文件分享).音乐.日历.联系人等等,可在PC和服务器上运行. 简单来说就是一个基于 ...
- Golang 调用 aws-sdk 操作 S3对象存储
Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...
- 使用FileZilla Pro S3协议访问七牛云对象存储
偶然发现FileZilla还有Pro版本,主要是比免费版多了一些协议支持,也偶然发现七牛云支持了S3协议接口,这样刚好弥补了其没有FTP的不足,于是找官方文档,折腾一下,使用FileZilla Pro ...
- Ceph对象存储 S3
ceph对象存储 作为文件系统的磁盘,操作系统不能直接访问对象存储.相反,它只能通过应用程序级别的API访问.ceph是一种分布式对象存储系统,通过ceph对象网关提供对象存储接口,也称为RADOS网 ...
随机推荐
- WinForm如何将子控件插入FlowLayoutPanel开始位置
需求描述 动态将控件插入到FlowLayoutPanel控件的开始位置 实现方案 将控件添加到FlowLayoutPanel的Controls集合中,默认插到末尾 使用SetChildIndex方法更 ...
- MySQL系列:索引(B+Tree树、构建过程、回表、基本操作、执行计划、应用)
介绍 https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html 作用 优化查询 算法 索引的算法包括 BTree Hash R ...
- Llama2-Chinese项目:2.2-大语言模型词表扩充
因为原生LLaMA对中文的支持很弱,一个中文汉子往往被切分成多个token,因此需要对其进行中文词表扩展.思路通常是在中文语料库上训练一个中文tokenizer模型,然后将中文tokenizer与 ...
- makefile:带你了解一种常用于GNU gcc编译的工具语言
摘要:该文章主要介绍makefile,一种常用语GNU gcc编译的工具语言,同时LiteOS也是利用该文件对工程项目进行make构建生成执行文件的. LiteOS源码中使用makefile进行文件的 ...
- FusionInsight怎么帮「宇宙行」建一个好的「云数据平台」?
摘要:基于数据湖架构,应用效率得以极大提升.经过几年发展,当前集群规模已经达到1000多节点,数据量几十PB,日均处理作业数大概是10万,赋能于180多个总行应用和境内外41家分行及子公司. 本文分享 ...
- 云图说|初识数据库和应用迁移UGO
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:数据库和应用迁移 ...
- Git hooks与自动化部署
好的 commit message 是至关重要的,如果随意编写 log,带来的后果可小可大,但是无论大小都影响了开发的效率和回朔的难度,所以有必要进行 log 规范化检查. 通过自定义的commit ...
- drf-jwt配置文件 jwt签发认证源码分析 自定义用户签发认证 simpleui后台管理美化 权限控制 (acl、rbac)
目录 昨日回顾 接口文档 自动生成接口文档 接口文档必备的内容 cookie-session-token发展史 token原理 base64 快速签发 定制返回格式 jwt的认证 drf-jwt配置文 ...
- AliPLC 智能丢包补偿算法,提升弱网环境的通话质量
在线视频/语音通话逐渐成为人们日常生活的一部分,而复杂多变的网络环境会导致部分音频包无法传送到接收端,造成语音信号的短时中断或者卡顿,这会严重影响通话体验,为解决这类问题,阿里云视频云音频技术团队在综 ...
- C 与 C++ 区别
C 与 C++ 区别 本文介绍 C 与 C++ 之间重要的或者容易忽略的区别.尽管 C++ 几乎是 C 的超集,C/C++ 代码混用一般也没什么问题,但是了解 C/C++ 间比较重要区别可以避免碰到一 ...