JuiceFS 在 DigitalOcean 上的完整部署指南:Spaces 对象存储 + 托管 Redis 快速上云
【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs
导读
本文以 DigitalOcean 云平台为例,完整演示如何在云端几分钟内完成 JuiceFS 分布式文件系统的安装与使用:使用 Spaces(S3 兼容对象存储)保存数据、使用 DigitalOcean 托管的 Redis 保存元数据,并通过format、mount、status、umount等命令完成文件系统的创建、挂载、查看与卸载。读完本文,你将掌握 JuiceFS 在任意云计算平台上"开箱即用"的部署思路,包括硬件选型、TLS 加密元数据引擎的连接方式、本地缓存调优,以及多主机共享挂载的强一致用法。
JuiceFS 从设计之初就是面向云环境的:数据与元数据分离,数据放对象存储、元数据放独立数据库,全部复用云平台已有的托管服务,因此无需自建基础设施即可获得一个 POSIX 语义的共享文件系统。本文演示环境基于 Ubuntu Server 20.04 的 Droplet,全部步骤同样适用于其他 Linux 发行版及 macOS、Windows 客户端。
一、准备工作:三个必选项
JuiceFS 由"存储"与"数据库"组合驱动,要在一个云平台上落地,需要准备以下三样东西:
- 云服务器(计算节点):安装 JuiceFS 客户端并挂载文件系统。
- 对象存储(数据层):存放文件内容与切片数据。
- 数据库(元数据层):存放文件系统的目录树、文件属性等元信息。
下面逐一说明在 DigitalOcean 上如何选择与配置。
1. 云服务器(Droplet)
DigitalOcean 上的云服务器被称为 Droplet。你不需要为使用 JuiceFS 单独购买新的 Droplet——哪台服务器上需要使用 JuiceFS 存储,就在它上面安装 JuiceFS 客户端即可,这与自建 NFS 时需要一台专门的存储服务器完全不同。
硬件配置:JuiceFS 对硬件没有特殊要求,任何规格的 Droplet 都能稳定运行。但建议选择性能更好的 SSD,并预留至少 1GB 容量给 JuiceFS 作为本地缓存使用(本地缓存的作用详见下文"挂载文件系统"一节)。
操作系统:JuiceFS 客户端支持 Linux、BSD、macOS 和 Windows,本文以 Ubuntu Server 20.04 为例。
2. 对象存储:DigitalOcean Spaces
JuiceFS 使用对象存储保存全部数据。在 DigitalOcean 上使用Spaces是最简便的方案,它是一款 S3 兼容的对象存储服务,开箱即用。
创建 Spaces 存储桶时有两点建议:
- 区域与 Droplet 保持一致(例如都选新加坡
sgp1),这样能获得最佳访问速度,同时避免跨区域流量带来的额外开销; - 在 API 菜单中创建Spaces access keys,JuiceFS 客户端需要用这对密钥访问 Spaces 的 API。
本文演示创建了一个名为juicefs的存储桶,区域为sgp1,访问地址为:
https://juicefs.sgp1.digitaloceanspaces.com从源码看,Spaces 本质上是基于 AWS S3 SDK 实现的对象存储接入,其 endpoint 采用bucket.region.digitaloceanspaces.com的域名结构,客户端会从 URL 的 host 中自动解析出 bucket 名与 region,并据此构造 S3 客户端(见 pkg/object/space.go)。这也是为什么--bucket必须严格填写完整域名地址。
当然,Spaces 并非唯一选择。你可以使用其他平台的对象存储,或在 Droplet 上用 Ceph、MinIO 自建,甚至使用本地磁盘(--storage file)。唯一的要求是:JuiceFS 客户端能够访问到对象存储的 API 即可。JuiceFS 支持的全部存储后端可参阅「如何设置对象存储」。
3. 数据库:DigitalOcean 托管 Redis
与普通文件系统不同,JuiceFS 将全部元数据存放在独立数据库中。目前支持 Redis、TiKV、MySQL/MariaDB、PostgreSQL、SQLite 等常见数据库,并在持续扩展支持范围。每种数据库在性能、规模、可靠性上各有取舍,应按实际场景选择。
关于迁移不必顾虑:JuiceFS 客户端内置元数据迁移能力,可以将元数据从一种数据库导出并迁移到另一种数据库,因此初期选型可以大胆一些。
本文使用 DigitalOcean 的Redis 6 托管数据库服务:
- 区域选择新加坡,并选择与 Droplet 相同的VPC 私有网络;
- 创建过程约需 5 分钟,期间跟随设置向导完成初始化配置。
创建向导中有两个安全相关的关键设置值得特别注意:
① 入站访问控制:默认情况下 Redis 允许所有入站连接,出于安全考虑,应在设置向导的安全设置环节,于Add trusted sources中选中有权访问 Redis 的 Droplet,即仅允许被选中的主机访问。
② 数据回收策略:建议选择noeviction(内存耗尽时仅报告错误,不回收任何数据)。
注意:为了确保元数据的安全与完整,回收策略切勿选择
allkeys-lru或allkeys-random。因为这两类策略会在内存紧张时主动淘汰键,导致元数据被意外清除,直接危及文件系统的完整性。
Redis 的访问地址可在控制台的Connection Details中找到。若所有计算资源都在 DigitalOcean,建议优先通过VPC 私有网络连接 Redis,安全性最佳(私有网络地址不会暴露在公网)。
二、安装 JuiceFS 客户端
在 Ubuntu Server 20.04 上,执行以下命令即可安装最新版本客户端:
curl -sSL https://d.juicefs.com/install | sh -执行后输入juicefs,看到类似下面的命令帮助信息即代表安装成功:
$ juicefs NAME: juicefs - A POSIX file system built on Redis and object storage. USAGE: juicefs [global options] command [command options] [arguments...] VERSION: 0.16.2 (2021-08-25T04:01:15Z 29d6fee) 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 stats show runtime stats 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.0三、创建文件系统:format
创建文件系统使用format子命令,通用格式为:
juicefs format [command options] META-URL NAME其中META-URL是元数据引擎地址,NAME是文件系统名称(同时也是对象存储中数据对象的名称前缀)。以下命令创建了一个名为mystor的文件系统:
$ juicefs format \ --storage space \ --bucket https://juicefs.sgp1.digitaloceanspaces.com \ --access-key <your-access-key-id> \ --secret-key <your-access-key-secret> \ rediss://default:your-password@private-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 \ mystor参数说明:
| 参数 | 说明 |
|---|---|
--storage | 指定数据存储引擎,这里使用space(DigitalOcean Spaces),所有受支持的存储类型见「如何设置对象存储」 |
--bucket | 指定存储桶访问地址 |
--access-key/--secret-key | 指定访问对象存储 API 的密钥对 |
META-URL | 元数据引擎地址;DigitalOcean 托管 Redis 要求 TLS/SSL 加密访问,因此协议头必须使用rediss://;链接末尾的/1表示使用 Redis 的 1 号数据库 |
补充说明:
--access-key与--secret-key除命令行直接传入外,还可以通过环境变量ACCESS_KEY、SECRET_KEY传递,避免密钥出现在 shell 历史中;format命令还支持--session-token传入 STS 临时凭证。详见「如何设置对象存储」中"Access Key 和 Secret Key"与"使用临时访问凭证"两节。
format命令在源码中属于 ADMIN 类别命令,其数据存储相关选项由 cmd/format.go 中的formatStorageFlags()定义,包括--storage(默认file)、--bucket、--access-key、--secret-key、--session-token等;数据格式选项(--block-size默认 4M、--compress默认 none、--shards等)则由formatFlags()定义(cmd/format.go)。
看到类似下面的输出,代表文件系统创建成功:
2021/08/23 16:36:28.450686 juicefs[2869028] <INFO>: Meta address: rediss://default@private-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 2021/08/23 16:36:28.481251 juicefs[2869028] <WARNING>: AOF is not enabled, you may lose data if Redis is not shutdown properly. 2021/08/23 16:36:28.481763 juicefs[2869028] <INFO>: Ping redis: 331.706µs 2021/08/23 16:36:28.482266 juicefs[2869028] <INFO>: Data uses space://juicefs/mystor/ 2021/08/23 16:36:28.534677 juicefs[2869028] <INFO>: Volume is formatted as {Name:mystor UUID:6b0452fc-0502-404c-b163-c9ab577ec766 Storage:space Bucket:https://juicefs.sgp1.digitaloceanspaces.com AccessKey:7G7WQBY2QUCBQC5H2DGK SecretKey:removed BlockSize:4096 Compression:none Shards:0 Partitions:0 Capacity:0 Inodes:0 EncryptKey:}输出中值得留意的几个关键信息:
Data uses space://juicefs/mystor/:数据将存放在 Spaces 存储桶的juicefs/前缀下(space://是 Spaces 存储引擎在源码中的字符串表示,见 pkg/object/space.go);AOF is not enabled警告:若托管 Redis 未开启 AOF 持久化,Redis 异常关机时可能丢失数据,进而损坏元数据。建议在 DigitalOcean 控制台开启 AOF,或接受该风险;Volume is formatted as {...}:展示了卷的完整配置(UUID、存储引擎、桶地址、块大小、压缩算法等),这些配置会持久化保存在元数据引擎中,后续挂载时自动读取。
四、挂载文件系统:mount
挂载使用mount子命令,-d参数表示以守护进程(后台)方式运行。以下命令把刚创建的mystor挂载到当前目录下的mnt目录:
$ sudo juicefs mount -d \ rediss://default:your-password@private-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 mnt使用sudo执行挂载,是为了让 JuiceFS 有权限在/var/下创建缓存目录。注意:挂载时只需指定数据库地址和挂载点,不需要指定文件系统名称——因为文件系统的全部配置(名称、存储引擎、桶地址等)都已保存在元数据引擎中,客户端连接数据库后会自动读取。
看到类似下面的输出,代表挂载成功:
2021/08/23 16:39:14.202151 juicefs[2869081] <INFO>: Meta address: rediss://default@private-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 2021/08/23 16:39:14.234925 juicefs[2869081] <WARNING>: AOF is not enabled, you may lose data if Redis is not shutdown properly. 2021/08/23 16:39:14.235536 juicefs[2869081] <INFO>: Ping redis: 446.247µs 2021/08/23 16:39:14.236231 juicefs[2869081] <INFO>: Data use space://juicefs/mystor/ 2021/08/23 16:39:14.236540 juicefs[2869081] <INFO>: Disk cache (/var/jfsCache/6b0452fc-0502-404c-b163-c9ab577ec766/): capacity (1024 MB), free ratio (10%), max pending pages (15) 2021/08/23 16:39:14.738416 juicefs[2869081] <INFO>: OK, mystor is ready at mnt用df命令可以看到文件系统的挂载情况:
$ df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 JuiceFS:mystor fuse.juicefs 1.0P 64K 1.0P 1% /home/herald/mnt可以看到 JuiceFS 表现为一个容量 1.0P 的 POSIX 文件系统,实际数据按需写入对象存储,容量近乎无限。
本地缓存与性能调优
从挂载日志可以看到,JuiceFS 默认在/var/jfsCache/<UUID>/下设置了1024 MB(1GB)本地缓存。本地缓存是 JuiceFS 高性能的关键:读操作命中缓存可避免访问对象存储的网络开销,写操作可异步批量刷入对象存储。
设置更大的缓存能让 JuiceFS 有更好的性能表现,通过--cache-size选项调整(单位 MiB)。例如设置 20GB 本地缓存:
$ sudo juicefs mount -d --cache-size 20000 \ rediss://default:your-password@private-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 mnt在 cmd/mount.go 中可以看到挂载选项与缓存配置的对应关系:--cache-dir(默认/var/jfsCache,可设为memory使用内存缓存)、--cache-size(通过utils.ParseBytes解析,支持 MiB 等单位)、--free-space-ratio(缓存目录剩余空间比例阈值,默认 10%)等。这提醒我们:本地缓存目录所在的磁盘应有足够剩余空间,并注意 SSD 性能直接影响缓存读写速度。
文件系统挂载成功后,就可以像使用本地硬盘一样在mnt目录中存储数据了。
五、查看文件系统:status
使用status子命令查看文件系统的基本信息与连接状态,只需指定数据库访问地址:
$ juicefs status rediss://default:bn8l7ui2cun4iaji@private-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 2021/08/23 16:48:48.567046 juicefs[2869156] <INFO>: Meta address: rediss://default@private-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 2021/08/23 16:48:48.597513 juicefs[2869156] <WARNING>: AOF is not enabled, you may lose data if Redis is not shutdown properly. 2021/08/23 16:48:48.598193 juicefs[2869156] <INFO>: Ping redis: 491.003µs { "Setting": { "Name": "mystor", "UUID": "6b0452fc-0502-404c-b163-c9ab577ec766", "Storage": "space", "Bucket": "https://juicefs.sgp1.digitaloceanspaces.com", "AccessKey": "7G7WQBY2QUCBQC5H2DGK", "SecretKey": "removed", "BlockSize": 4096, "Compression": "none", "Shards": 0, "Partitions": 0, "Capacity": 0, "Inodes": 0 }, "Sessions": [ { "Sid": 1, "Heartbeat": "2021-08-23T16:46:14+08:00", "Version": "0.16.2 (2021-08-25T04:01:15Z 29d6fee)", "Hostname": "ubuntu-s-1vcpu-1gb-sgp1-01", "MountPoint": "/home/herald/mnt", "ProcessID": 2869091 }, { "Sid": 2, "Heartbeat": "2021-08-23T16:47:59+08:00", "Version": "0.16.2 (2021-08-25T04:01:15Z 29d6fee)", "Hostname": "ubuntu-s-1vcpu-1gb-sgp1-01", "MountPoint": "/home/herald/mnt", "ProcessID": 2869146 } ] }Setting段展示文件系统的持久化配置,Sessions段则列出当前所有活跃的挂载会话(Session ID、心跳时间、客户端版本、主机名、挂载点、进程 ID),通过它可以直接观察到是否有其他主机正在挂载该文件系统。
六、卸载文件系统:umount
使用umount子命令卸载:
sudo juicefs umount ~/mnt注意:强制卸载使用中的文件系统可能导致数据损坏或丢失,请务必谨慎操作,确保没有进程正在使用挂载点。
七、开机自动挂载
生产环境通常需要服务器重启后文件系统自动恢复挂载,完整方案请参考「启动时自动挂载 JuiceFS」。这里简述 Linux 上最便捷的方式:从 JuiceFS v1.1.0 开始,mount命令提供--update-fstab选项,可自动写入/etc/fstab并创建/sbin/mount.juicefs软链接:
$ sudo juicefs mount --update-fstab --max-uploads=50 --writeback --cache-size 204800 <META-URL> <MOUNTPOINT> $ grep <MOUNTPOINT> /etc/fstab <META-URL> <MOUNTPOINT> juicefs _netdev,max-uploads=50,writeback,cache-size=204800 0 0如果希望自行控制,需手动创建从/sbin/mount.juicefs到 JuiceFS 可执行文件的软链接(ln -s /usr/local/bin/juicefs /sbin/mount.juicefs),并把挂载选项以去掉-前缀、=连接取值的形式写入 fstab 的 options 列。若涉及数据库密码、对象存储密钥等敏感信息,可以改用 systemd 挂载单元(/etc/systemd/system/juicefs.mount),通过Environment=注入密钥。
八、多主机共享挂载
JuiceFS 文件系统支持被多台云服务器同时挂载,且对服务器地理位置没有要求,可以轻松实现:
- 同一云平台内多台服务器之间;
- 跨云平台之间;
- 公有云与私有云之间。
的数据实时共享。更重要的是,JuiceFS 的共享挂载提供强一致性保证:文件系统上确认的写入,在所有挂载了同一文件系统的主机上实时可见。
使用共享挂载功能,必须确保组成文件系统的数据库和对象存储服务能被每一台要挂载它的主机正常访问。在本文的演示环境中:
- Spaces 对象存储对整个互联网开放访问,只要使用正确的密钥即可通过 API 读写;
- 但平台托管的 Redis 数据库需要合理配置访问策略,确保平台外的主机有访问权限(例如在
Add trusted sources中把公网 IP 加入白名单)。
共享挂载的正确流程是:在任意一台主机上创建文件系统(format只需执行一次),然后在其他主机上安装 JuiceFS 客户端,使用同一个数据库地址通过mount命令挂载即可。
特别注意:文件系统只需创建一次,不应该也不需要在其他主机上重复执行
format操作,否则可能覆盖已有配置。
九、安全加固要点回顾
综合 DigitalOcean 的托管特性与 JuiceFS 的连接方式,部署时应重点落实以下安全措施:
- Redis 仅允许受信任主机访问:在托管数据库的
Add trusted sources中显式配置可访问的 Droplet 或 IP; - 回收策略选
noeviction:避免 Redis 内存淘汰导致元数据键丢失; - 优先 VPC 私有网络连接:同平台内使用私有网络地址访问 Redis 与对象存储,降低暴露面、提升性能;
- 使用
rediss://TLS 加密:DigitalOcean 托管 Redis 默认要求 TLS/SSL 连接。从源码看(pkg/meta/redis.go),redis与rediss两个协议头均注册到同一实现,rediss://会触发 go-redis 的 TLS 配置(pkg/meta/redis.go),还支持insecure-skip-verify、tls-cert-file、tls-key-file、tls-ca-cert-file等 URL 参数以应对 mTLS 等场景,更多细节见「如何设置元数据引擎」; - 对象存储密钥最小化:Spaces access keys 应仅授予所需桶的读写权限,并可通过环境变量
ACCESS_KEY/SECRET_KEY传递,避免写入 shell 历史。
结语
至此,你已经在 DigitalOcean 上完成了 JuiceFS 的完整落地:Spaces 存数据、托管 Redis 存元数据、Droplet 上挂载使用,并掌握了缓存调优、状态查看、多主机共享与安全加固等生产级用法。这套"云平台托管服务 + JuiceFS 客户端"的组合模式同样适用于 AWS(S3 + ElastiCache)、阿里云(OSS + Redis)等平台——只需按各平台的 endpoint 与认证方式调整format参数即可。更深入的技术原理可继续阅读「JuiceFS 技术架构」与「JuiceFS 如何存储文件」,命令全集见「命令参考」。
【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考