ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

在阿里云上部署 JuiceFS:ECS + 云数据库 + OSS 从零搭建分布式 POSIX 文件系统

在阿里云上部署 JuiceFS:ECS + 云数据库 + OSS 从零搭建分布式 POSIX 文件系统 在阿里云上部署 JuiceFSECS 云数据库 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 选择在相同的区域这样资源之间可以通过内网线路相互访问避免走公网线路产生额外的流量费用。一、云服务器 ECSJuiceFS 对服务器硬件没有特殊要求云平台上最低配的云服务器也能稳定使用。通常只需要选择能满足自身业务的配置即可。特别说明无需额外购买服务器或重装系统JuiceFS 没有业务侵入性不会对现有系统和程序造成干扰完全可以在正在运行的服务器上安装和使用。默认占用约 1GB 缓存空间该缓存是客户端与对象存储之间的数据缓冲层可根据需要调整大小选择性能更好的云盘可以获得更好的缓存读写性能。操作系统兼容性阿里云 ECS 提供的所有操作系统都可以安装 JuiceFS。本文使用的 ECS 配置如下实例规格ecs.t5-lc1m1.smallCPU1 核内存1 GB存储40 GB操作系统Ubuntu Server 20.04 64 位地域及可用区华东 2上海二、云数据库JuiceFS 将元数据全部存储在独立的数据库中。目前支持的元数据引擎包括 Redis、MySQL、PostgreSQL、SQLite 以及 OceanBase。不同数据库在元数据性能与可靠性上表现各异Redis完全运行在内存上能提供极致的性能但运维难度较高、可靠性相对较低。MySQL / PostgreSQL关系型数据库性能不如 Redis但运维难度不高、可靠性有保障。SQLite单机单文件关系型数据库性能较低不适合大规模数据存储但免配置适合单机少量数据存储。OceanBase分布式关系型数据库能在提供高性能的同时确保数据的一致性和高可靠性RTO 8s适合金融、零售、电信等对事务一致性和分布式能力要求较高的场景。数据库RedisMySQL、PostgreSQLSQLiteOceanBase性能强适中弱强运维门槛高适中低适中可靠性低适中低高应用场景海量数据、分布式高频读写海量数据、分布式中低频读写少量数据单机中低频读写分布式场景、强事务一致性、高可靠性要求选型建议如果只是为了评估 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但仍建议在云数据库控制台手动确认该配置。三、对象存储 OSSJuiceFS 会将所有数据存储到对象存储中它支持几乎所有的对象存储服务。为了获得最佳性能使用阿里云 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-passwordherald-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:passwordredis-server-url:6379/1。目前阿里云数据库 Redis 版只提供 4.0 和 5.0 两个版本认证只需要密码设置地址时留空用户名即可例如redis://:passwordredis-server-url:6379/1。使用 RAM 角色绑定 ECS 时创建存储只需指定--storage和--bucket两个选项无需提供 API 访问密钥$ juicefs format \ --storage oss \ --bucket https://mytest.oss-cn-shanghai.aliyuncs.com \ redis://:your-redis-passwordherald-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 formatcmd/format.go#L436-L623包括连接元数据引擎并校验卷名仅允许字母、数字和-长度 3~63 字符将卷配置存储类型、Bucket、密钥、块大小、压缩算法、容量与 inode 配额等写入数据库通过 createStorage 创建对象存储客户端并以卷名/作为对象前缀object.WithPrefix对对象存储做写入/读取/删除的连通性自检doTesting确保 Bucket 配置正确后才完成格式化。日志中的BlockSize:4096表示数据块大小KiB即 4 MiBCompression:none表示未启用压缩format支持通过--block-size、--compresslz4/zstd、--capacityGiB 硬配额、--inodesinode 硬配额、--shards、--hash-prefix等选项调整数据格式与配额。挂载 JuiceFS 存储文件系统创建完成后对象存储相关的信息已存入数据库挂载时无需再输入对象存储的 Bucket 和密钥等信息。使用mount子命令将文件系统挂载到/mnt/jfs目录sudo juicefs mount -d redis://:your-redis-passwordherald-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-passwordherald-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:3808: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-uploads50 --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),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进