用 MinIO 和 s3fs 快速部署对象及文件存储服务

MinIO 是一个用 Golang 编写的对象存储 server 开源实现。s3fs 是一个基于 FUSE 框架的以 s3 存储服务作为后端并导出 POSIX 文件系统挂载的开源实现。

本文首先基于 MinIO 搭建一个简单的对象存储服务。然后进一步借助 s3fs 将这个对象存储服务挂载为一个文件系统目录。

搭建 MinIO 对象存储

安装 Minio

go install github.com/minio/minio@latest

启动

mkdir minio_dir
minio server minio_dir

Pasted image 20240311135446.png

CLI 操作

curl https://dl.min.io/client/mc/release/linux-amd64/mc \
  --create-dirs \
  -o $HOME/minio-binaries/mc

chmod +x $HOME/minio-binaries/mc
export PATH=$PATH:$HOME/minio-binaries/

# 设置 alias,之后就可以将 myminio 作为第一级目录操作了
mc alias set myminio http://localhost:9000 minioadmin minioadmin
# 一些操作命令样例:
mc ls myminio/zjctest
# 还有很多命令看帮助:
mc --help

Pasted image 20240311135505.png

webUI 操作

MinIO 启动后有 WebUI 可以使用,只需将启动后终端提示信息中的<地址:端口>输入到浏览器地址栏:
Pasted image 20240311135523.png

后台文件组织形式

查看我们作为存储后端的 server 侧本地目录,我们可以看到 minio 相对明了的目录组织:

  • 首先,就像直觉上那样,所有的文件都在我们指定的目录 ~/minio_dir 中;并且每个 bucket 是一个目录,bucket 下边的 folders 也是一层更深的目录;
  • 每个 object 也是一个目录,它的目录下面至少有一个元数据文件 xl.meta;
  • object 的数据可能内嵌到元数据文件 xl.meta 中(默认是 128 KB 以下会内嵌);
  • object 的数据也可能放到下一级的目录下进行分 part 存储,每个part 文件是 10244 kb。
root@2347:~$ tree -h minio_dir/
minio_dir/
└── [4.0K]  zjctest
    ├── [4.0K]  credentials.json
    │   └── [ 604]  xl.meta
    ├── [4.0K]  folder1
    │   └── [4.0K]  fio.pdf
    │       ├── [4.0K]  0789fc8b-4462-4367-8174-736a3f256b2b
    │       │   └── [1000K]  part.1
    │       └── [ 350]  xl.meta
    ├── [4.0K]  zjc
    │   └── [ 513]  xl.meta
    ├── [4.0K]  zjc3
    │   ├── [4.0K]  ecbac464-3ee5-4659-96e0-e9f8c1e8150c
    │   │   ├── [ 10M]  part.1
    │   │   ├── [ 10M]  part.2
    │   │   └── [ 10M]  part.3
    │   └── [ 506]  xl.meta
    └── [4.0K]  zjc4
        └── [128K]  xl.meta

9 directories, 9 files

用 s3fs 实现文件系统挂载

由于 MinIO 兼容 s3 协议,通过 s3fs,我们很容易将一个 bucket 作为一个文件系统服务来使用:

# 安装 s3fs
apt install s3fs
# 挂载 zjctest 这一 bucket 到 ~/s3mnt 目录
s3fs zjctest ~/s3mnt/ -o url=http://localhost:9000,passwd_file=/dev/stdin,use_path_request_style < <(echo minioadmin:minioadmin)
# 之后就可以像本地目录一样操作了

Pasted image 20240311135535.png
注意这里 minio server 运行在本地,所以地址是 localhost:9000。你也可以从其他节点上挂载 s3fs 也是可以行的,那样也就可以看作是一种远程的文件系统服务了。

总结

本文通过 minio 和 s3fs 这两个流行的开源软件,快速搭建了支持远程访问的对象存储、文件存储服务。生产环境也许并非可靠方案,但作为临时使用或个人使用不失一种低成本的搭建形式,希望给你带来帮助或启发。


minio/minio: The Object Store for AI Data Infrastructure (github.com)
s3fs-fuse/s3fs-fuse: FUSE-based file system backed by Amazon S3 (github.com)
cookbook/docs/s3fs-fuse-with-minio.md at master · nitisht/cookbook (github.com)

Leave a Reply

Your email address will not be published. Required fields are marked *