在阿里云上部署 JuiceFS:ECS + 云数据库 + OSS 从零搭建分布式 POSIX 文件系统
【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs
本指南基于 JuiceFS 阿里云教程 编写,完整演示如何在阿里云上使用 ECS 云服务器、云数据库(以云数据库 Redis 版为例)和 OSS 对象存储,从准备资源、安装客户端、创建卷、挂载文件系统,到状态查看、卸载与开机自动挂载的全过程。读完本文,你将掌握在阿里云上快速搭建一套可用于生产或评估的 JuiceFS 文件系统的完整实操方案,并理解其"元数据与数据分离"架构在成本与性能上的设计考量。
架构基础:为什么 JuiceFS 需要数据库 + 对象存储
在开始部署之前,先理解 JuiceFS 的核心架构。如下图所示,JuiceFS 存储由数据库和对象存储共同驱动:存入 JuiceFS 的文件会按照一定规则被拆分成固定大小的数据块(Block)存储在对象存储中,而数据对应的元数据(目录结构、文件属性、权限等)则独立存储在数据库中。
这个设计带来的两个关键优势:
- 元数据与数据完全分离:对文件的检索和处理不会直接操作对象存储中的数据,而是先在数据库中操作元数据,只有当数据发生变化时才与对象存储交互。这意味着目录列举、
stat、ls等高频元数据操作都在低延迟的数据库(如内存型 Redis)中完成。 - 降低对象存储请求费用:对象存储按请求次数计费,元数据独立存储的设计可有效缩减对象存储在请求数量上的开销,同时显著提升整体性能体验。
从源码角度印证:JuiceFS 客户端通过 pkg/meta/redis.go 等元数据引擎实现与数据库交互,而数据块的上传下载则经由 pkg/object/object_storage.go 定义的统一对象存储接口完成,两者在逻辑上完全解耦。
准备云资源
JuiceFS 需要搭配数据库和对象存储一起使用,这里直接使用阿里云的 ECS 云服务器,结合云数据库和 OSS 对象存储。
区域规划:在创建云计算资源时,尽量将 ECS、云数据库、OSS Bucket 选择在相同的区域,这样资源之间可以通过内网线路相互访问,避免走公网线路产生额外的流量费用。
一、云服务器 ECS
JuiceFS 对服务器硬件没有特殊要求,云平台上最低配的云服务器也能稳定使用。通常只需要选择能满足自身业务的配置即可。
特别说明:
- 无需额外购买服务器或重装系统:JuiceFS 没有业务侵入性,不会对现有系统和程序造成干扰,完全可以在正在运行的服务器上安装和使用。
- 默认占用约 1GB 缓存空间:该缓存是客户端与对象存储之间的数据缓冲层,可根据需要调整大小;选择性能更好的云盘可以获得更好的缓存读写性能。
- 操作系统兼容性:阿里云 ECS 提供的所有操作系统都可以安装 JuiceFS。
本文使用的 ECS 配置如下:
| 实例规格 | ecs.t5-lc1m1.small |
|---|---|
| CPU | 1 核 |
| 内存 | 1 GB |
| 存储 | 40 GB |
| 操作系统 | Ubuntu Server 20.04 64 位 |
| 地域及可用区 | 华东 2(上海) |
二、云数据库
JuiceFS 将元数据全部存储在独立的数据库中。目前支持的元数据引擎包括 Redis、MySQL、PostgreSQL、SQLite 以及 OceanBase。不同数据库在元数据性能与可靠性上表现各异:
- Redis:完全运行在内存上,能提供极致的性能,但运维难度较高、可靠性相对较低。
- MySQL / PostgreSQL:关系型数据库,性能不如 Redis,但运维难度不高、可靠性有保障。
- SQLite:单机单文件关系型数据库,性能较低,不适合大规模数据存储,但免配置,适合单机少量数据存储。
- OceanBase:分布式关系型数据库,能在提供高性能的同时确保数据的一致性和高可靠性(RTO < 8s),适合金融、零售、电信等对事务一致性和分布式能力要求较高的场景。
| 数据库 | Redis | MySQL、PostgreSQL | SQLite | OceanBase |
|---|---|---|---|---|
| 性能 | 强 | 适中 | 弱 | 强 |
| 运维门槛 | 高 | 适中 | 低 | 适中 |
| 可靠性 | 低 | 适中 | 低 | 高 |
| 应用场景 | 海量数据、分布式高频读写 | 海量数据、分布式中低频读写 | 少量数据单机中低频读写 | 分布式场景、强事务一致性、高可靠性要求 |
选型建议:如果只是为了评估 JuiceFS 的功能,可以在 ECS 上手动搭建数据库使用;生产环境使用且没有专业数据库运维团队时,阿里云的云数据库服务通常是更好的选择。若使用其他云平台的云数据库,只能通过公网访问,必须向公网暴露数据库端口,存在极大安全风险;如确需公网访问,应通过云数据库控制台的白名单功能严格限制允许访问的 IP,这也是公网连接失败时优先排查的点。
本文使用了云数据库 Redis 版(以下连接地址仅为演示目的的伪地址):
| Redis 版本 | 5.0 社区版 |
|---|---|
| 实例规格 | 256M 标准版 - 单副本 |
| 连接地址 | herald-sh-abc.redis.rds.aliyuncs.com |
| 可用区 | 上海 |
Redis 内存淘汰策略提醒:在
format和mount的日志中都会出现maxmemory_policy is "volatile-lru", please set it to 'noeviction'的警告。这是因为 JuiceFS 依赖 Redis 持久保存元数据,若启用 LRU 等淘汰策略可能导致元数据被意外驱逐。从源码看,pkg/meta/redis.go#L4629-L4638 会尝试自动将maxmemory-policy重配置为noeviction,但仍建议在云数据库控制台手动确认该配置。
三、对象存储 OSS
JuiceFS 会将所有数据存储到对象存储中,它支持几乎所有的对象存储服务。为了获得最佳性能,使用阿里云 ECS 时应搭配阿里云 OSS:
- 同区域部署:将 ECS 与 OSS Bucket 选择在相同地区,可通过阿里云内网线路访问,延时低且不需要额外的流量费用。
- 存储级别选择:OSS 有不同的存储级别,由于 JuiceFS 需要与对象存储频繁交互,建议使用标准存储;可搭配 OSS 资源包降低使用成本。
- 跨云不推荐:通过 ECS 访问其他云平台的对象存储要走公网线路,产生流量费用且延时更高,可能影响 JuiceFS 性能发挥。
API 访问密钥
阿里云 OSS 通过 API 访问,需要准备Access Key ID和Access Key Secret密钥对。
安全建议:显式使用 API 访问密钥可能导致密钥泄露,推荐为云服务器分配 RAM 服务角色。当一台 ECS 被授予 OSS 操作权限以后,无需使用 API 访问密钥即可访问 OSS。这一机制在源码中有直接体现:pkg/object/oss.go#L376-L399 在未显式提供
access-key时,会依次回退到环境变量(ALICLOUD_ACCESS_KEY_ID/ALICLOUD_ACCESS_KEY_SECRET/SECURITY_TOKEN)以及阿里云默认凭据链(RAM 角色),实现免密钥访问。
安装 JuiceFS 客户端
本文使用 Ubuntu Server 20.04 64 位系统,依次执行以下命令可安装最新版本客户端:
curl -sSL https://d.juicefs.com/install | sh -也可以访问 JuiceFS 官方 Releases 页面选择其他版本安装。执行juicefs命令,看到命令帮助信息即代表安装成功:
$ juicefs NAME: juicefs - A POSIX file system built on Redis and object storage. USAGE: juicefs [global options] command [command options] [arguments...] COMMANDS: format format a volume mount mount a volume umount unmount a volume gateway S3-compatible gateway sync sync between two storage rmr remove directories recursively info show internal information for paths or inodes bench run benchmark to read/write/stat big/small files gc collect any leaked objects fsck Check consistency of file system profile analyze access log status show status of JuiceFS warmup build cache for target directories/files dump dump metadata into a JSON file load load metadata from a previously dumped JSON file help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --verbose, --debug, -v enable debug log (default: false) --quiet, -q only warning and errors (default: false) --trace enable trace log (default: false) --no-agent disable pprof (:6060) agent (default: false) --help, -h show help (default: false) --version, -V print only the version (default: false) COPYRIGHT: Apache License 2.0JuiceFS 具有良好的跨平台兼容性,支持在 Linux、Windows 和 macOS 上使用。本文着重介绍 Linux 系统上的安装与使用,其他系统的安装方法可参考 安装文档。
创建 JuiceFS 存储(Format a Volume)
客户端安装好后,就可以使用前面准备好的 Redis 数据库和 OSS 对象存储创建 JuiceFS 存储了。
严格意义上,这一步应称为 "Format a volume"(格式化一个卷)。以下命令使用format子命令创建了一个名为mystor的存储,即文件系统:
$ juicefs format \ --storage oss \ --bucket https://<your-bucket-name> \ --access-key <your-access-key-id> \ --secret-key <your-access-key-secret> \ redis://:<your-redis-password>@herald-sh-abc.redis.rds.aliyuncs.com:6379/1 \ mystor选项说明:
--storage:指定对象存储类型,例如oss、s3、gs、cos等,完整支持列表见 对象存储配置文档。--bucket:对象存储的 Bucket 域名。使用阿里云 OSS 时只需填写 bucket 名称即可,无需填写完整域名,JuiceFS 会自动识别并补全地址(源码实现见 pkg/object/oss.go#L401-L406 的autoOSSEndpoint,会优先探测 OSS 内网 endpoint)。--access-key和--secret-key:访问对象存储 API 的密钥对。
Redis 地址格式:Redis 6.0 身份认证需要用户名和密码两个参数,地址格式为
redis://username:password@redis-server-url:6379/1。目前阿里云数据库 Redis 版只提供 4.0 和 5.0 两个版本,认证只需要密码,设置地址时留空用户名即可,例如redis://:password@redis-server-url:6379/1。
使用 RAM 角色绑定 ECS 时,创建存储只需指定--storage和--bucket两个选项,无需提供 API 访问密钥:
$ juicefs format \ --storage oss \ --bucket https://mytest.oss-cn-shanghai.aliyuncs.com \ redis://:<your-redis-password>@herald-sh-abc.redis.rds.aliyuncs.com:6379/1 \ mystor看到类似下面的输出,代表文件系统创建成功:
2021/07/13 16:37:14.264445 juicefs[22290] <INFO>: Meta address: redis://@herald-sh-abc.redis.rds.aliyuncs.com:6379/1 2021/07/13 16:37:14.277632 juicefs[22290] <WARNING>: maxmemory_policy is "volatile-lru", please set it to 'noeviction'. 2021/07/13 16:37:14.281432 juicefs[22290] <INFO>: Ping redis: 3.609453ms 2021/07/13 16:37:14.527879 juicefs[22290] <INFO>: Data uses oss://mytest/mystor/ 2021/07/13 16:37:14.593450 juicefs[22290] <INFO>: Volume is formatted as {Name:mystor UUID:4ad0bb86-6ef5-4861-9ce2-a16ac5dea81b Storage:oss Bucket:https://mytest340 AccessKey:LTAI4G4v6ioGzQXy56m3XDkG SecretKey:removed BlockSize:4096 Compression:none Shards:0 Partitions:0 Capacity:0 Inodes:0 EncryptKey:}从源码理解 format 做了什么:查看 cmd/format.go 可以发现,format命令的核心流程(func format,cmd/format.go#L436-L623)包括:
- 连接元数据引擎并校验卷名(仅允许字母、数字和
-,长度 3~63 字符); - 将卷配置(存储类型、Bucket、密钥、块大小、压缩算法、容量与 inode 配额等)写入数据库;
- 通过 createStorage 创建对象存储客户端,并以
卷名/作为对象前缀(object.WithPrefix); - 对对象存储做写入/读取/删除的连通性自检(doTesting),确保 Bucket 配置正确后才完成格式化。
日志中的BlockSize:4096表示数据块大小(KiB,即 4 MiB),Compression:none表示未启用压缩;format支持通过--block-size、--compress(lz4/zstd)、--capacity(GiB 硬配额)、--inodes(inode 硬配额)、--shards、--hash-prefix等选项调整数据格式与配额。
挂载 JuiceFS 存储
文件系统创建完成后,对象存储相关的信息已存入数据库,挂载时无需再输入对象存储的 Bucket 和密钥等信息。
使用mount子命令,将文件系统挂载到/mnt/jfs目录:
sudo juicefs mount -d redis://:<your-redis-password>@herald-sh-abc.redis.rds.aliyuncs.com:6379/1 /mnt/jfs注意:挂载文件系统时只需填写 Redis 数据库地址,不需要文件系统名称。默认缓存路径为
/var/jfsCache,请确保当前用户有足够的读写权限。
看到类似下面的输出,代表文件系统挂载成功:
2021/07/13 16:40:37.088847 juicefs[22307] <INFO>: Meta address: redis://@herald-sh-abc.redis.rds.aliyuncs.com/1 2021/07/13 16:40:37.101279 juicefs[22307] <WARNING>: maxmemory_policy is "volatile-lru", please set it to 'noeviction'. 2021/07/13 16:40:37.104870 juicefs[22307] <INFO>: Ping redis: 3.408807ms 2021/07/13 16:40:37.384977 juicefs[22307] <INFO>: Data use oss://mytest/mystor/ 2021/07/13 16:40:37.387412 juicefs[22307] <INFO>: Disk cache (/var/jfsCache/4ad0bb86-6ef5-4861-9ce2-a16ac5dea81b/): capacity (1024 MB), free ratio (10%), max pending pages (15) .2021/07/13 16:40:38.410742 juicefs[22307] <INFO>: OK, mystor is ready at /mnt/jfs挂载成功后,使用df命令可以看到文件系统的挂载情况:
$ df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 JuiceFS:mystor fuse.juicefs 1.0P 64K 1.0P 1% /mnt/jfs文件系统挂载成功以后,就可以像使用本地硬盘那样,在/mnt/jfs目录中存储数据了。
多主机共享:JuiceFS 存储支持被多台云服务器同时挂载使用。你可以在其他 ECS 上安装 JuiceFS 客户端,然后使用同一个数据库地址挂载文件系统到每一台主机上,实现多机共享同一文件系统。
关于缓存参数的补充说明:日志中capacity (1024 MB)即默认的磁盘缓存容量。从 cmd/flags.go#L225-L253 可以看到,--cache-dir(默认/var/jfsCache,冒号分隔可配置多个目录)、--cache-size(默认100G,旧版本默认约为 1GB)、--free-space-ratio(默认0.1,缓存目录最小空闲空间比例)等参数均可按需调整;--max-uploads(默认 20,上传并发连接数)和--writeback(写回模式)则影响数据上传的并发与时机。
查看文件系统状态
使用status子命令可以查看一个文件系统的基本信息和连接状态:
$ juicefs status redis://:<your-redis-password>@herald-sh-abc.redis.rds.aliyuncs.com:6379/1 2021/07/13 16:56:17.143503 juicefs[22415] <INFO>: Meta address: redis://@herald-sh-abc.redis.rds.aliyuncs.com:6379/1 2021/07/13 16:56:17.157972 juicefs[22415] <WARNING>: maxmemory_policy is "volatile-lru", please set it to 'noeviction'. 2021/07/13 16:56:17.161533 juicefs[22415] <INFO>: Ping redis: 3.392906ms { "Setting": { "Name": "mystor", "UUID": "4ad0bb86-6ef5-4861-9ce2-a16ac5dea81b", "Storage": "oss", "Bucket": "https://mytest", "AccessKey": "<your-access-key-id>", "BlockSize": 4096, "Compression": "none", "Shards": 0, "Partitions": 0, "Capacity": 0, "Inodes": 0 }, "Sessions": [ { "Sid": 3, "Heartbeat": "2021-07-13T16:55:38+08:00", "Version": "0.15.2 (2021-07-07T05:51:36Z 4c16847)", "Hostname": "demo-test-sh", "MountPoint": "/mnt/jfs", "ProcessID": 22330 } ] }输出中的Setting展示了卷的格式化配置(与format日志一致),Sessions则列出了当前挂载该卷的客户端会话,包括会话 ID、心跳时间、客户端版本、主机名、挂载点与进程 ID,可用于排查"哪些主机正在使用该卷"。
卸载 JuiceFS 存储
使用umount命令即可卸载文件系统:
sudo juicefs umount /mnt/jfs注意:强制卸载使用中的文件系统可能导致数据损坏或丢失,请务必谨慎操作。
开机自动挂载
如需在 ECS 重启后自动挂载 JuiceFS,请参考 启动时自动挂载 JuiceFS。核心做法包括:
从 JuiceFS v1.1.0 开始,可直接使用挂载命令的
--update-fstab选项自动写入/etc/fstab,例如:$ sudo juicefs mount --update-fstab --max-uploads=50 --writeback --cache-size 204800 <META-URL> <MOUNTPOINT>手动配置时,需要创建
/sbin/mount.juicefs到 JuiceFS 可执行文件的软链接(如ln -s /usr/local/bin/juicefs /sbin/mount.juicefs),并在 fstab 的 options 列声明挂载选项(去掉-前缀、取值以=连接)。由于数据库密码、对象存储密钥等敏感信息不宜直接写入
/etc/fstab,可以使用 systemd mount 单元(/etc/systemd/system/juicefs.mount),通过Environment设置META_PASSWORD、ALICLOUD_ACCESS_KEY_ID、ALICLOUD_ACCESS_KEY_SECRET等环境变量,再用systemctl enable juicefs.mount启用。
小结与生产建议
至此,你已经在阿里云上完成了 JuiceFS 的完整部署闭环:ECS 安装客户端 → format 创建卷(数据库存元数据、OSS 存数据)→ mount 挂载使用 → status 查看状态 → umount 卸载 → 开机自动挂载。生产环境部署时,建议重点关注:
- 资源同区域:ECS、云数据库、OSS 尽量同区域,走内网降低延时与流量费用;
- 元数据引擎选型:按性能/可靠性/运维成本权衡选择 Redis、MySQL/PostgreSQL、SQLite 或 OceanBase;
- 密钥安全:优先使用 RAM 角色代替显式 AccessKey;
- 缓存与并发调优:根据业务读写模式调整
--cache-size、--cache-dir、--max-uploads、--writeback等参数(详见 缓存文档); - 确认 Redis 淘汰策略为
noeviction,避免元数据被驱逐导致数据异常。
【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考