通过s3fs挂载OBS对象桶
应用场景
对于原本使用本地文件系统存储数据的用户,希望把数据存储在OBS上但不改变数据的访问方式,推荐使用s3fs。
s3fs是一款基于用户空间文件系统(Filesystem in Userspace,简称FUSE)的文件系统工具,支持您在Linux系统中,将OBS对象桶挂载到本地文件系统,让您能够像操作本地文件一样操作对象,实现数据的共享。关于s3fs的更多信息,请参见GitHub。如果您在s3fs使用过程中遇到问题,请参见常见问题进行排查。
方案优势
- 支持上传和下载文件、目录、 软链接、设置用户权限等POSIX文件协议标准的大部分功能。
- 支持多段上传。
- 可以使用本地磁盘作为缓存提高IO性能。
约束与限制
- s3fs不支持挂载并行文件系统。
- 随机写或追加写文件场景需要重写整个文件,会有带宽浪费。
- 由于网络延迟,元数据操作(如列举目录)性能较差。
- 不支持文件或目录的原子性重命名。
- 支持挂载到多台云服务器,但数据一致性需由您自行维护,避免出现多台云服务器同时对一个文件并发写入的情况。
- 不支持硬链接。
- s3fs与存储服务端交互采用HTTP/HTTPS协议,客户端CPU开销会较大。
- 因为客户端存在操作系统元数据缓存,可能导致该缓存失效前,客户端元数据与存储服务端元数据呈现不一致现象。
- 因使用FUSE框架存在内核态与用户态切换,不适合高并发场景。
实施步骤
通过s3fs挂载OBS对象桶的步骤如下:
- 下载相关依赖:
yum install fuse sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
需要保证云服务器上fuse版本>= 2.8.4,部分过老操作系统可能不满足这个约束,需要自行适配。
- 支持通过以下两种方式下载s3fs。
- 方式一:镜像源安装。
# Ubuntu sudo apt install s3fs # CentOS sudo yum install epel-release sudo yum install s3fs-fuse
- 方式二:GitHub获取指定版本安装。
推荐使用s3fs 1.91 版本,下载以后自行编译安装。
- 方式一:镜像源安装。
- 编译。使用方式一安装s3fs请跳过该步骤。
进入s3fs-fuse解压目录,按照以下命令执行编译操作:
./autogen.sh ./configure make sudo make install
- 执行以下命令检查安装情况。
s3fs --version
当命令回显出现s3fs版本信息时,表示s3fs能够成功运行。
- 配置AK:SK。
按照以下命令配置AK:SK:
echo "AK:SK" >>/root/.passwd-s3fs chmod 600 /root/.passwd-s3fs
获取AK:SK方法请参见获取访问密钥(AK和SK)。
- 挂载。
按照以下格式执行挂载命令:
s3fs 对象桶名 本地挂载目录 -o passwd_file=密钥文件路径 -o url=区域终端节点地址 -o nonempty -o big_writes -o max_write=131072 [-o ensure_diskfree=xxxx] [-o tmpdir=xxxx]其他挂载参数
ensure_diskfree和tmpdir是可选挂载参数,但建议根据机器情况设置,详细说明见常见参数说明。
例如,通过s3fs挂载中国-香港区域的OBS对象桶“test-bucket”,命令示例如下:
s3fs test-bucket /mnt/s3fs-test -o passwd_file=/root/.passwd-s3fs -o url=https://obs.ap-southeast-1.myhuaweicloud.com -o nonempty -o big_writes -o max_write=131072 -o ensure_diskfree=2048 -o tmpdir=/data
- 验证。
执行以下命令,检查挂载结果。
df -h
当界面显示如下类似回显信息时,表示对象桶挂载成功。
Filesystem Size Used Avail Use% Mounted on s3fs 16E 0 16E 0% /mnt/s3fs-test
如果没有显示以上类似回显信息,表示OBS桶挂载失败。此时可在执行的挂载命令后面添加以下参数,用以在回显中输出挂载过程以及详细调试日志:
-d -d -f -o f2 -o curldbg
常见参数说明
参数 |
说明 |
---|---|
tmpdir |
参数解释: 临时数据缓存目录。 s3fs在进行读写时,默认会使用一部分本地目录空间作为临时数据缓存用来提高性能。 建议选择磁盘目录,而不是共享内存目录。
说明:
可使用df -h 命令来查询目录类型及容量使用情况。
示例:
[root@huawei-esc ~]# df -h /tmp Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 20G 19G 52% / [root@huawei-esc ~]# df -h /run Filesystem Size Used Avail Use% Mounted on tmpfs 32G 3.3G 29G 11% /run /tmp目录类型是/dev/vda1,是磁盘。 /run目录类型是tmpfs,是共享内存。 默认取值: /tmp |
ensure_diskfree |
参数解释: 临时缓存目录保留空间,单位:MB。
注意:
若不设置此值,tmpdir指定目录有被打满风险,可能会影响其他进程的运行。 建议设置tmpdir指定目录可用容量的10%。 默认取值: 0 |
compat_dir |
参数解释: 兼容目录,s3fs尽可能支持目录类型的对象,并将其识别为目录。 可以识别为目录对象的对象有“dir/”、“dir_$folder$”。
注意:
1.92版本必须添加此挂载参数,否则无法显示桶内的多级目录对象。 例:使用sdk创建对象:a/b/c或a/b/c/,若不添加此参数将无法显示目录a。 注:s3fs识别以‘/’为结尾的对象为目录。 默认取值: 无 |
allow_other |
参数解释: 允许其他用户访问挂载目录。 默认取值: 无 |
umask |
参数解释: 配置文件权限的掩码,使用此参数会覆盖并行文件系统内所有文件的权限。 默认取值: 0000 |
nonempty |
参数解释: 添加该参数后允许在非空目录上挂载。 默认取值: 无 |
multipart_size |
参数解释: 以多段上传模式上传文件时,段的大小,单位为MB。段的大小会影响能够上传的文件大小,具体参考多段上传。 取值范围: 5~5120,单位:MB。 默认取值: 10 |
no_check_certificate |
参数解释: 对服务端的证书不做校验,仅在使用HTTPS协议时有效,默认开启证书校验。 默认取值: 无 |
use_cache |
参数解释: 用于本地文件缓存的地址,使用该参数后,IO性能会提升,但是磁盘占用会升高,可以和del_cache配合使用。 默认取值: ""(表示不使用缓存) |
del_cache |
参数解释: s3fs进程在启动和退出时删除本地缓存文件。 默认取值: 无 |
更多参数详见s3fs-fuse。