ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

在 DigitalOcean 上快速搭建 JuiceFS 云上文件系统:Spaces 对象存储与托管 Redis 实战指南

2026/9/14 10:08:39 拓冰建站 浏览量
在 DigitalOcean 上快速搭建 JuiceFS 云上文件系统:Spaces 对象存储与托管 Redis 实战指南 在 DigitalOcean 上快速搭建 JuiceFS 云上文件系统Spaces 对象存储与托管 Redis 实战指南【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefsJuiceFS 是一款面向云原生环境设计的分布式 POSIX 文件系统它把数据内容与元数据解耦数据存放于对象存储元数据存放于独立数据库从而可以直接复用云平台开箱即用的存储与数据库服务几分钟内即可完成配置并投入使用。本文以 DigitalOcean 云平台为例完整演示如何在 Droplet 云服务器上安装 JuiceFS 客户端使用 Spaces 对象存储与托管 Redis 数据库创建并挂载文件系统覆盖从准备工作、format建卷、mount挂载到status巡检、umount卸载、开机自启与多主机共享的完整链路。读完本文你将掌握在 DigitalOcean或其他同类云平台上从零部署一个可用于生产的多机共享 JuiceFS 文件系统的全套技能。JuiceFS 的云端架构对象存储 数据库JuiceFS 的设计初衷就是为云而生。它由两部分能力驱动对象存储负责存放文件内容数据数据块。本文使用 DigitalOcean 的 Spaces 服务它是 S3 兼容的对象存储开箱即用。元数据引擎数据库负责存放所有文件的元数据目录结构、文件属性、权限等。JuiceFS 目前支持 Redis、TiKV、MySQL/MariaDB、PostgreSQL、SQLite 等常见数据库其他数据库的支持仍在持续开发中。每种数据库在性能、容量规模与可靠性上各有取舍应当根据实际场景选择。不必担心选错——JuiceFS 客户端提供了元数据迁移能力可以随时把元数据从一个数据库导出并迁移到另一个数据库。正因如此在云平台上使用 JuiceFS 时你不需要自建任何存储服务只需要把云厂商现成的对象存储与数据库拼装起来即可。准备工作1. 云服务器DropletDigitalOcean 的云服务器被称为 Droplet。如果你已经拥有一台 Droplet无需为使用 JuiceFS 单独购买新机器——哪台云服务器需要在 JuiceFS 上存取数据就在哪台上安装 JuiceFS 客户端。硬件规格JuiceFS 没有特殊硬件要求任意规格的 Droplet 都能稳定运行。建议选择性能更好的 SSD并为本地缓存预留至少 1GB 空间。操作系统JuiceFS 支持 Linux、BSD、macOS 和 Windows。本文以 Ubuntu Server 20.04 为例进行演示。2. 对象存储Spaces在本文的演示环境中我们在新加坡区域sgp1创建了一个名为juicefs的 Spaces 存储桶其访问地址为https://juicefs.sgp1.digitaloceanspaces.com创建时建议选择与 Droplet 相同的区域以获得最佳访问速度同时避免额外的跨区域流量费用。此外还需要在 API 菜单中创建Spaces access keys访问密钥JuiceFS 客户端将通过它调用 Spaces 的 API 读写数据。当然你也可以使用其他平台的对象存储服务或用 Ceph、MinIO 自行搭建。总之只要 JuiceFS 客户端能够访问到的对象存储都可以自由选择。3. 数据库托管 Redis本文使用 DigitalOcean 的 Redis 6 托管数据库服务选择新加坡区域并选择与现有 Droplet 相同的 VPC 私有网络。创建 Redis 实例大约需要 5 分钟随后按照设置向导完成数据库初始化在设置过程中需要注意两个关键点访问控制默认情况下 Redis 允许所有入站连接。出于安全考虑应在设置向导的Add trusted sources信任来源选项中只勾选允许访问 Redis 的 Droplet即仅允许选定的主机访问该 Redis。驱逐策略eviction policy建议选择noeviction即内存耗尽时仅报错、不驱逐任何数据。注意为保证元数据的安全与完整性请勿选择allkeys-lru和allkey-random作为驱逐策略。Redis 的访问地址可以在控制台的Connection Details连接详情中找到。如果所有计算资源都在 DigitalOcean 内建议优先使用 VPC 私有网络地址进行连接以最大化安全性关于rediss://协议的底层原理参见下文创建文件系统一节中对 pkg/meta/redis.go 的源码分析。安装 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...] 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以上输出来自 0.16.2 版本客户端2021-08-25 构建。如果你希望选择其他版本也可以从 JuiceFS 官方发布渠道手动下载对应平台的二进制文件并放入PATH。创建文件系统format创建文件系统使用format子命令其格式为juicefs format [command options] 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-passwordprivate-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 \ mystor参数说明参数说明--storage指定数据存储引擎这里为space。可查看支持的存储类型获取完整列表s3、gs、oss、cos 等。--bucket指定存储桶访问地址。--access-key/--secret-key指定访问对象存储 API 的密钥。rediss://.../1DigitalOcean 托管的 Redis 需要通过 TLS/SSL 加密访问因此必须使用rediss://协议头链接末尾的/1表示使用 Redis 的 1 号数据库。源码视角space存储与rediss://协议是如何工作的space存储本质上是 S3 客户端。在 pkg/object/space.go 中newSpace从传入的 endpoint 解析出存储桶名bucket与区域region然后基于 AWS SDK for Go 构建一个标准的 S3 客户端设置BaseEndpoint、Region、禁用路径风格寻址等最后通过Register(space, newSpace)注册到对象存储工厂。也就是说JuiceFS 是通过 S3 兼容协议与 Spaces 通信的。rediss://是 Redis 元数据引擎的 TLS 变体。在 pkg/meta/redis.go 中redis、rediss、unix三个协议前缀统一注册到newRedisMeta构造器其中rediss://会触发 TLS 配置pkg/meta/redis.go。除了 URL 中直接携带密码还可以使用REDIS_PASSWORD、META_PASSWORD或META_PASSWORD_FILE环境变量注入密码并支持tls-cert-file、tls-key-file、tls-ca-cert-file、tls-server-name、insecure-skip-verify等查询参数进行双向 TLS 与证书校验。format 的内部流程从 cmd/format.go 的format函数可以看出创建文件系统时客户端会依次完成以下步骤校验卷名卷名必须匹配^[a-z0-9][a-z0-9\-]{1,61}[a-z0-9]$仅允许字母、数字和连字符长度 363。加载元数据连接 META-URL若数据库提示 database is not formatted 则进入新建流程生成 UUID 并记录存储类型、桶地址、密钥、块大小、压缩算法、容量与 inode 配额等配置。测试对象存储调用test()在对象存储上执行写入、读取、删除一轮往返验证cmd/format.go确保密钥与桶配置正确若桶不存在且支持自动创建则尝试创建。写入卷标记向对象存储写入juicefs_uuid对象防止同名卷误用同一存储空间。初始化元数据调用m.Init(format, force)把卷配置写入数据库。若看到类似下面的输出说明文件系统创建成功2021/08/23 16:36:28.450686 juicefs[2869028] INFO: Meta address: rediss://defaultprivate-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:}从输出可以看到JuiceFS 会把数据存放在space://juicefs/mystor/前缀下juicefs是存储桶名mystor是卷名所有数据对象都会带上卷名前缀这正是它支持多个卷共享同一存储桶的实现基础参见 cmd/format.go 中的object.WithPrefix。挂载文件系统mount挂载文件系统使用mount子命令-d参数表示以后台守护进程方式挂载。以下命令把刚创建的文件系统挂载到当前目录下的mnt目录sudo juicefs mount -d \ rediss://default:your-passwordprivate-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://defaultprivate-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 File system type capacity used usable used% mount point JuiceFS:mystor fuse.juicefs 1.0P 64K 1.0P 1% /home/herald/mnt关于本地缓存从上面的挂载日志可以看到JuiceFS 默认把缓存目录放在/var/jfsCache/UUID/下并以capacity (1024 MB)的容量上限作为本地缓存该日志来自 0.16.2 版本当前仓库 cmd/flags.go 中--cache-size的默认值已调整为100G实际默认值以你所安装客户端版本为准。设置更大的缓存可以让 JuiceFS 获得更好的读性能。缓存大小通过--cache-size选项指定单位为 MiB。例如设置 20GB 本地缓存sudo juicefs mount -d --cache-size 20000 \ rediss://default:your-passwordprivate-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 mnt与本地缓存相关的常用参数还有均定义于 cmd/flags.go--cache-dir本地缓存目录路径支持用冒号分隔多个路径默认值随操作系统而变Linux 上通常为/var/jfsCache。--free-space-ratio缓存目录所在磁盘需要保留的最小空闲空间比例默认0.110%达到阈值后会自动清理缓存。--cache-items最大缓存对象数量默认0根据free-space-ratio自动计算。--cache-partial-only仅缓存随机/小文件读取不缓存整块顺序读。这些参数在 cmd/mount.go 的getChunkConf中被解析进 chunk 层的缓存配置CacheDir、CacheSize、FreeSpace等最终由 pkg/chunk 的磁盘缓存模块执行实际的读写与淘汰。文件系统挂载完成后你就可以像使用本地硬盘一样在~/mnt目录中存取数据了。查看文件系统状态status使用status子命令查看文件系统的基本信息与连接状态只需指定数据库 URL$ juicefs status rediss://default:bn8l7ui2cun4iajiprivate-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://defaultprivate-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:1408: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:5908:00, Version: 0.16.2 (2021-08-25T04:01:15Z 29d6fee), Hostname: ubuntu-s-1vcpu-1gb-sgp1-01, MountPoint: /home/herald/mnt, ProcessID: 2869146 } ] }输出的 JSON 分为两部分Setting卷的基础配置包括名称、UUID、存储类型、存储桶地址、块大小、压缩算法、容量与 inode 配额等与format时写入的配置一一对应结构体定义参见 pkg/meta/config.go。Sessions当前连接到该元数据引擎的活动会话列表包括 mount、SDK、S3 gateway 和 WebDAV 客户端每条记录包含会话 ID、心跳时间、客户端版本、主机名、挂载点与进程 ID。从源码看status命令cmd/status.go还支持两个扩展参数--session sid查看指定会话的详细信息持有的 inode、锁等--more展示更多统计信息注意可能耗时较长。只读会话不会出现在列表中因为它无法在元数据中注册自己。卸载文件系统umount使用umount子命令卸载文件系统例如sudo juicefs umount ~/mnt注意强制卸载正在使用中的文件系统可能导致数据损坏或丢失请谨慎操作。开机自动挂载让 JuiceFS 在系统启动时自动挂载请参考 Mount JuiceFS at Boot Time 一文。核心要点包括Linux 一键配置从 JuiceFS v1.1.0 起mount命令的--update-fstab选项会自动完成开机挂载配置——它会创建/sbin/mount.juicefs软链接并写入/etc/fstab之后即可通过mount MOUNTPOINT直接挂载。手动配置 fstab需要手动创建/sbin/mount.juicefs - juicefs 可执行文件软链接并把所有挂载选项以keyvalue形式写入 fstab 的 options 字段去掉命令行中的前导连字符。systemd.mount 方案当数据库密码、对象存储密钥等敏感信息需要通过环境变量注入而不适合写在 fstab 中时可以创建/etc/systemd/system/juicefs.mount单元文件在[Mount]段设置Environment、What、Where、Typejuicefs再执行systemctl enable juicefs.mount与systemctl start juicefs.mount。macOS 方案在~/Library/LaunchAgents下创建io.juicefs.NAME.plistLaunchAgent配置ProgramArguments与RunAtLoad用launchctl load加载即可。多主机共享挂载JuiceFS 文件系统支持被多台云服务器同时挂载且对云服务器的地理位置没有任何要求可以轻松实现同平台服务器之间、跨云平台之间、公有云与私有云之间的实时数据共享。不仅如此JuiceFS 的共享挂载还能提供强数据一致性保证当多台服务器挂载同一文件系统时任何主机上已确认的写入在所有主机上都会实时可见。使用共享挂载时关键前提是构成文件系统的数据库与对象存储服务必须能被每一台参与挂载的主机访问到。在本文的演示环境中Spaces 对象存储对整个互联网开放只要持有正确的访问密钥即可通过 API 读写但对于 DigitalOcean 托管的 Redis需要合理配置访问策略确保平台外部的主机也具备访问权限。在多台主机上挂载同一文件系统的操作步骤如下在任意一台主机上创建文件系统仅需创建一次在每一台主机上都安装 JuiceFS 客户端使用相同的数据库地址通过mount命令挂载。需要特别注意的是文件系统只需要创建一次其他主机上不要重复执行创建操作直接挂载即可。总结本文以 DigitalOcean 为示例走完了 JuiceFS 云端部署的完整流程准备 Droplet、Spaces 对象存储与托管 Redis安装客户端用format创建卷用mount挂载并配置本地缓存用status巡检用umount卸载并延伸介绍了开机自启与多主机共享方案。JuiceFS 的核心优势在于把云上现成的对象存储 数据库直接组合成一个具备强一致性的分布式 POSIX 文件系统这一模式同样适用于 AWS S3、阿里云 OSS、腾讯云 COS 等各类云平台——只需更换对应的--storage值与存储桶地址即可。更完整的存储类型清单可参考对象存储配置指南元数据引擎的搭建方式可参考元数据引擎配置指南。【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考