文档首页/ 对象存储服务 OBS/ 最佳实践/ 通过s3fs挂载OBS对象桶
更新时间:2024-10-17 GMT+08:00

通过s3fs挂载OBS对象桶

应用场景

对于原本使用本地文件系统存储数据的用户,希望把数据存储在OBS上但不改变数据的访问方式,推荐使用s3fs

s3fs是一款基于用户空间文件系统(Filesystem in Userspace,简称FUSE)的文件系统工具,支持您在Linux系统中,将OBS对象桶挂载到本地文件系统,让您能够像操作本地文件一样操作对象,实现数据的共享。关于s3fs的更多信息,请参见GitHub。如果您在s3fs使用过程中遇到问题,请参见常见问题进行排查。

方案优势

  • 支持上传和下载文件、目录、 软链接、设置用户权限等POSIX文件协议标准的大部分功能。
  • 支持多段上传。
  • 可以使用本地磁盘作为缓存提高IO性能。

约束与限制

  • s3fs不支持挂载并行文件系统。
  • 随机写或追加写文件场景需要重写整个文件,会有带宽浪费。
  • 由于网络延迟,元数据操作(如列举目录)性能较差。
  • 不支持文件或目录的原子性重命名。
  • 支持挂载到多台云服务器,但数据一致性需由您自行维护,避免出现多台云服务器同时对一个文件并发写入的情况。
  • 不支持硬链接。
  • s3fs与存储服务端交互采用HTTP/HTTPS协议,客户端CPU开销会较大。
  • 因为客户端存在操作系统元数据缓存,可能导致该缓存失效前,客户端元数据与存储服务端元数据呈现不一致现象。
  • 因使用FUSE框架存在内核态与用户态切换,不适合高并发场景。

实施步骤

通过s3fs挂载OBS对象桶的步骤如下:

  1. 下载相关依赖:

    yum install fuse
    sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

    需要保证云服务器上fuse版本>= 2.8.4,部分过老操作系统可能不满足这个约束,需要自行适配。

  2. 支持通过以下两种方式下载s3fs。

    • 方式一:镜像源安装。
      # Ubuntu
      sudo apt install s3fs
      
      # CentOS
      sudo yum install epel-release 
      sudo yum install s3fs-fuse
    • 方式二:GitHub获取指定版本安装。

      推荐使用s3fs 1.91 版本,下载以后自行编译安装。

  3. 编译。使用方式一安装s3fs请跳过该步骤。

    进入s3fs-fuse解压目录,按照以下命令执行编译操作:
    ./autogen.sh
    ./configure
    make
    sudo make install

  4. 执行以下命令检查安装情况。

    s3fs --version

    当命令回显出现s3fs版本信息时,表示s3fs能够成功运行。

  5. 配置AK:SK。

    按照以下命令配置AK:SK

    echo "AK:SK" >>/root/.passwd-s3fs
    chmod 600 /root/.passwd-s3fs

    获取AK:SK方法请参见获取访问密钥(AK和SK)

  6. 挂载。

    按照以下格式执行挂载命令:

    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

  7. 验证。

    执行以下命令,检查挂载结果。
    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

常见参数说明

表1 常见参数说明

参数

说明

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