JuiceFS 在 DigitalOcean 上的完整部署指南:Spaces 对象存储 + 托管 Redis 快速上云

JuiceFS 在 DigitalOcean 上的完整部署指南:Spaces 对象存储 + 托管 Redis 快速上云 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 分布式文件系统的安装与使用使用 SpacesS3 兼容对象存储保存数据、使用 DigitalOcean 托管的 Redis 保存元数据并通过format、mount、status、umount等命令完成文件系统的创建、挂载、查看与卸载。读完本文你将掌握 JuiceFS 在任意云计算平台上开箱即用的部署思路包括硬件选型、TLS 加密元数据引擎的连接方式、本地缓存调优以及多主机共享挂载的强一致用法。JuiceFS 从设计之初就是面向云环境的数据与元数据分离数据放对象存储、元数据放独立数据库全部复用云平台已有的托管服务因此无需自建基础设施即可获得一个 POSIX 语义的共享文件系统。本文演示环境基于 Ubuntu Server 20.04 的 Droplet全部步骤同样适用于其他 Linux 发行版及 macOS、Windows 客户端。一、准备工作三个必选项JuiceFS 由存储与数据库组合驱动要在一个云平台上落地需要准备以下三样东西云服务器计算节点安装 JuiceFS 客户端并挂载文件系统。对象存储数据层存放文件内容与切片数据。数据库元数据层存放文件系统的目录树、文件属性等元信息。下面逐一说明在 DigitalOcean 上如何选择与配置。1. 云服务器DropletDigitalOcean 上的云服务器被称为 Droplet。你不需要为使用 JuiceFS 单独购买新的 Droplet——哪台服务器上需要使用 JuiceFS 存储就在它上面安装 JuiceFS 客户端即可这与自建 NFS 时需要一台专门的存储服务器完全不同。硬件配置JuiceFS 对硬件没有特殊要求任何规格的 Droplet 都能稳定运行。但建议选择性能更好的 SSD并预留至少 1GB 容量给 JuiceFS 作为本地缓存使用本地缓存的作用详见下文挂载文件系统一节。操作系统JuiceFS 客户端支持 Linux、BSD、macOS 和 Windows本文以 Ubuntu Server 20.04 为例。2. 对象存储DigitalOcean SpacesJuiceFS 使用对象存储保存全部数据。在 DigitalOcean 上使用Spaces是最简便的方案它是一款 S3 兼容的对象存储服务开箱即用。创建 Spaces 存储桶时有两点建议区域与 Droplet 保持一致例如都选新加坡sgp1这样能获得最佳访问速度同时避免跨区域流量带来的额外开销在 API 菜单中创建Spaces access keysJuiceFS 客户端需要用这对密钥访问 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-passwordprivate-db-redis-sgp1-03138-do-user-2500071-0.b.db.ondigitalocean.com:25061/1 \ mystor参数说明参数说明--storage指定数据存储引擎这里使用spaceDigitalOcean 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://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:}输出中值得留意的几个关键信息Data uses space://juicefs/mystor/数据将存放在 Spaces 存储桶的juicefs/前缀下space://是 Spaces 存储引擎在源码中的字符串表示见 pkg/object/space.goAOF 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-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 文件系统 类型 容量 已用 可用 已用% 挂载点 JuiceFS:mystor fuse.juicefs 1.0P 64K 1.0P 1% /home/herald/mnt可以看到 JuiceFS 表现为一个容量 1.0P 的 POSIX 文件系统实际数据按需写入对象存储容量近乎无限。本地缓存与性能调优从挂载日志可以看到JuiceFS 默认在/var/jfsCache/UUID/下设置了1024 MB1GB本地缓存。本地缓存是 JuiceFS 高性能的关键读操作命中缓存可避免访问对象存储的网络开销写操作可异步批量刷入对象存储。设置更大的缓存能让 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/mount.go 中可以看到挂载选项与缓存配置的对应关系--cache-dir默认/var/jfsCache可设为memory使用内存缓存、--cache-size通过utils.ParseBytes解析支持 MiB 等单位、--free-space-ratio缓存目录剩余空间比例阈值默认 10%等。这提醒我们本地缓存目录所在的磁盘应有足够剩余空间并注意 SSD 性能直接影响缓存读写速度。文件系统挂载成功后就可以像使用本地硬盘一样在mnt目录中存储数据了。五、查看文件系统status使用status子命令查看文件系统的基本信息与连接状态只需指定数据库访问地址$ 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 } ] }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-uploads50 --writeback --cache-size 204800 META-URL MOUNTPOINT $ grep MOUNTPOINT /etc/fstab META-URL MOUNTPOINT juicefs _netdev,max-uploads50,writeback,cache-size204800 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.goredis与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 客户端的组合模式同样适用于 AWSS3 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),仅供参考