JuiceFS:分布式文件系统
如何使用 Pigsty 提供的 PostgreSQL 与 MinIO 搭建分布式云原生文件系统 JuiceFS。
JuiceFS 是一个高性能、云原生分布式文件系统,
本文介绍如何使用 Pigsty 提供的 PostgreSQL 作为 JuiceFS 的元数据引擎,MinIO 作为 JuiceFS 的对象存储引擎,搭建一套生产级 JuiceFS 集群。
快速上手
使用 full 模式创建四节点沙箱。
./configure -c full ./install.yml 安装 JuiceFS 并使用对象存储:
JFSNAME=jfs METAURL=postgres://dbuser_meta:DBUser.Meta@10.10.10.10:5432/meta DATAURL=( --storage minio --bucket https://sss.pigsty:9000/infra --access-key minioadmin --secret-key minioadmin ) juicefs format "${DATAURL[@]}" ${METAURL} jfs # 格式化文件系统 juicefs mount ${METAURL} ~/jfs -d # 后台挂载 juicefs umount ~/jfs # 停止挂载 更狂野的玩法:PGFS,把数据库当成文件系统用
JFSNAME=jfs METAURL=postgres://dbuser_meta:DBUser.Meta@10.10.10.10:5432/meta DATAURL=( --storage postgres --bucket 10.10.10.10:5432/meta --access-key dbuser_meta --secret-key DBUser.Meta ) juicefs format "${DATAURL[@]}" ${METAURL} ${JFSNAME} juicefs mount ${METAURL} ~/jfs -d # 后台挂载 juicefs umount ~/jfs # 停止挂载 单机模式
Pigsty Infra 仓库提供最新版本的 JuiceFS RPM/DEB 包,直接使用包管理器安装即可。
以下命令使用本地 SQLite 与文件系统(/var/jfs) 创建一个本地 JuiceFS 文件系统:
juicefs format sqlite3:///tmp/jfs.db myjfs 格式化输出
$ juicefs format sqlite3:///jfs.db myjfs 2025/03/19 12:07:56.956222 juicefs[62924] <INFO>: Meta address: sqlite3:///jfs.db [interface.go:504] 2025/03/19 12:07:56.958055 juicefs[62924] <INFO>: Data use file:///var/jfs/myjfs/ [format.go:484] 2025/03/19 12:07:56.966150 juicefs[62924] <INFO>: Volume is formatted as { "Name": "myjfs", "UUID": "1568ee2a-dc4c-4a0e-9788-be0490776dda", "Storage": "file", "Bucket": "/var/jfs/", "BlockSize": 4096, "Compression": "none", "EncryptAlgo": "aes256gcm-rsa", "TrashDays": 1, "MetaVersion": 1, "MinClientVersion": "1.1.0-A", "DirStats": true, "EnableACL": false } [format.go:521] 然后使用以下命令进行本地前台挂载:
juicefs mount sqlite3:///tmp/jfs.db ~/jfs # 前台挂载,退出后自动卸载 juicefs mount sqlite3:///tmp/jfs.db ~/jfs -d # 守护进程挂载,需要手动卸载 juicefs umount ~/jfs # 取消挂载,退出进程 删除数据
使用以下命令清空 PostgreSQL 中的 JuiceFS 元数据
DROP TABLE IF EXISTS jfs_acl,jfs_chunk,jfs_chunk_ref,jfs_counter,jfs_delfile,jfs_delslices,jfs_detached_node,jfs_dir_quota,jfs_dir_stats,jfs_edge,jfs_flock,jfs_node,jfs_plock,jfs_session2,jfs_setting,jfs_sustained,jfs_symlink,jfs_xattr CASCADE; 使用以下命令清空对象存储桶:
mcli rm --recursive --force infra/jfs PGFS性能摘要
二手物理机评测结果:
METAURL=postgres://dbuser_meta:DBUser.Meta@:5432/meta OPTIONS=( --storage postgres --bucket :5432/meta --access-key dbuser_meta --secret-key DBUser.Meta ${METAURL} jfs ) juicefs format "${OPTIONS[@]}" juicefs mount ${METAURL} ~/jfs -d # 后台挂载 juicefs bench ~/jfs # 测试性能 juicefs umount ~/jfs # 停止挂载 $ juicefs bench ~/jfs # 测试性能 Write big blocks: 1024/1024 [==============================================================] 178.5/s used: 5.73782533s Read big blocks: 1024/1024 [==============================================================] 31.7/s used: 32.314547037s Write small blocks: 100/100 [==============================================================] 149.2/s used: 670.127171ms Read small blocks: 100/100 [==============================================================] 543.4/s used: 184.109596ms Stat small files: 100/100 [==============================================================] 1723.4/s used: 58.087752ms Benchmark finished! BlockSize: 1.0 MiB, BigFileSize: 1.0 GiB, SmallFileSize: 128 KiB, SmallFileCount: 100, NumThreads: 1 Time used: 42.2 s, CPU: 687.2%, Memory: 179.4 MiB +------------------+------------------+---------------+ | ITEM | VALUE | COST | +------------------+------------------+---------------+ | Write big file | 178.51 MiB/s | 5.74 s/file | | Read big file | 31.69 MiB/s | 32.31 s/file | | Write small file | 149.4 files/s | 6.70 ms/file | | Read small file | 545.2 files/s | 1.83 ms/file | | Stat file | 1749.7 files/s | 0.57 ms/file | | FUSE operation | 17869 operations | 3.82 ms/op | | Update meta | 1164 operations | 1.09 ms/op | | Put object | 356 operations | 303.01 ms/op | | Get object | 256 operations | 1072.82 ms/op | | Delete object | 0 operations | 0.00 ms/op | | Write into cache | 356 operations | 2.18 ms/op | | Read from cache | 100 operations | 0.11 ms/op | +------------------+------------------+---------------+