ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JuiceFS 分布式模式上手指南:用 Redis 与对象存储构建多机共享的 POSIX 文件系统

JuiceFS 分布式模式上手指南:用 Redis 与对象存储构建多机共享的 POSIX 文件系统 JuiceFS 分布式模式上手指南用 Redis 与对象存储构建多机共享的 POSIX 文件系统【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs本文是一份基于 JuiceFS 开源仓库的实战指南目标是把上一篇文章「JuiceFS 单机模式快速上手指南」中基于 SQLite 的单机文件系统升级为基于「云数据库 对象存储」的分布式文件系统——任何一台安装过 JuiceFS 客户端的计算机只要能访问数据库和对象存储就可以同时挂载读写同一个文件系统。读完本文你将掌握基于网络的元数据引擎的选型思路、juicefs format/juicefs mount的完整命令行用法、close-to-open 一致性保证、本地缓存调优以及开机自动挂载和卸载排障等日常运维技巧。为什么单机模式无法支撑分布式共享在单机模式指南中JuiceFS 使用「对象存储 SQLite」的组合实现了可以在任意主机上挂载的文件系统对象存储本身可被网络上任何有权限的计算机访问而 SQLite 数据库是一个单文件数据库把它复制到另一台计算机上就可以在那台计算机上挂载同一个文件系统。但这种复制数据库文件的做法有两个天然缺陷实时性无法保证数据库文件被复制时源端可能仍在写入副本与源端数据不一致无法并发访问SQLite 是单文件数据库不支持被多台计算机同时读写。多台机器各自挂载后元数据会互相覆盖、产生冲突。因此要让一个文件系统在分布式环境中被多台计算机同时挂载、并发读写就必须把元数据存储换成支持网络并发访问的数据库例如 Redis、PostgreSQL、MySQL 等。这正是本文「分布式模式」的核心思路保留对象存储作为数据层把元数据层从单机的 SQLite 替换为基于网络的数据库。基于网络的数据库所谓「基于网络的数据库」是指允许多个用户通过网络同时访问的数据库。从这个角度出发可以简单地把数据库分为两类单机数据库数据库是单个文件通常只能单机访问如 SQLite、Microsoft Access 等基于网络的数据库数据库通常是复杂的多文件结构提供基于网络的访问接口支持多用户同时访问如 Redis、PostgreSQL 等。JuiceFS 目前支持的基于网络的数据库包括键值数据库Redis、TiKV、etcd、FoundationDB关系型数据库PostgreSQL、MySQL、MariaDB不同数据库的性能和稳定性表现各不相同。例如 Redis 是内存型键值数据库性能极为出色但可靠性相对较弱PostgreSQL 是关系型数据库性能不如内存型强悍但可靠性更强。详细的元数据引擎选型、性能对比和设置方法可以参考「如何设置元数据引擎」及「元数据引擎基准测试」文档。值得关注的是不同类型的元数据引擎在存储占用上差异明显「如何设置元数据引擎」给出了近似估算单个小文件无扩展属性大约需要300 字节键值数据库如 Redis、TiKV或600 字节关系型数据库如 SQLite、MySQL、PostgreSQL的元数据空间。当平均文件更大、文件被频繁修改产生碎片、扩展属性多或文件名很长时所需空间会进一步增加。这意味着当你计划把元数据引擎从关系型数据库迁移到键值数据库时可以据此预估容量例如 MySQL 用量为 30GB 时目标 Redis 至少需要准备 15GB 以上的内存。云数据库云计算平台通常提供种类丰富的云数据库产品例如 Amazon RDS 提供各类关系型数据库的托管版本Amazon ElastiCache 提供兼容 Redis 的内存型数据库产品。经过简单的初始化设置就可以创建出多副本、高可用的数据库集群。当然你也可以在自己的服务器上自行搭建数据库。对于基于网络的数据库来说最基本的信息只有以下 2 项数据库地址数据库的访问地址云平台可能会针对内外网提供不同的链接用户名和密码访问数据库时的身份验证信息。云平台创建的数据库默认可能只允许内网访问从本地或跨地域主机挂载时需要确认是否开通了公网访问、白名单等配置。上手实践用阿里云 OSS 云数据库 Redis 版搭建分布式文件系统下面以「阿里云 OSS 对象存储 阿里云数据库 Redis 版」为例完整演示从创建到验证、卸载的七个步骤。你可以将示例中的存储与数据库替换为其他云厂商的产品JuiceFS 支持的存储介质清单见「如何设置对象存储」支持的元数据引擎见「如何设置元数据引擎」。1. 安装客户端在所有需要挂载文件系统的计算机上安装 JuiceFS 客户端。Linux 与 macOS 用户可用一键脚本安装其他操作系统及安装方式详见「安装」。安装完成后在终端执行juicefs能显示帮助信息即表示安装成功。2. 准备对象存储以下是以阿里云 OSS 为例的伪样本创建对象存储通常需要两个环节创建Bucket拿到 Endpoint 地址再创建Access Key ID和Access Key Secret访问密钥。Bucket Endpointhttps://myjfs.oss-cn-shanghai.aliyuncs.comAccess Key IDABCDEFGHIJKLMNopqXYZAccess Key SecretZYXwvutsrqpoNMLkJiHgfeDCBA注意不同平台创建对象存储的过程略有差别建议参考云平台帮助手册。部分平台会针对内外网提供不同的 Endpoint 地址由于客户端要从本地访问对象存储请选择面向外网访问的地址。3. 准备数据库以下是以阿里云数据库 Redis 版为例的伪样本数据库地址myjfs-sh-abc.redis.rds.aliyuncs.com:6379数据库用户名tom数据库密码mypassword在 JuiceFS 中使用 Redis 数据库的 URL 格式如下redis://username:passwordDatabase-IP-or-URL:6379/1URL 中[]括起来的部分为可选项其余为必选项几个关键点需要留意Redis 6.0 之前的版本没有用户名请省略username部分但密码前面的冒号是分隔符需要保留例如redis://:mypasswordmyjfs-sh-abc.redis.rds.aliyuncs.com:6379/1Redis 监听默认端口为6379若未改动默认端口可以省略不写URL 末尾的/1是 Redis 的逻辑数据库编号。一个 Redis 实例默认可以创建 16 个逻辑数据库一个逻辑数据库可创建一个 JuiceFS 文件系统也就是说默认情况下一个 Redis 实例最多可以承载 16 个文件系统。用于 JuiceFS 的逻辑数据库不要与其他应用共享否则可能造成数据混乱如果开启了 Redis 的 TLS 特性协议头需使用rediss://如果用户名或密码包含特殊字符请用单引号包裹整个 URL避免被 shell 解释。安全建议密码可以放在 URL 中也可以使用环境变量META_PASSWORD或REDIS_PASSWORD传递JuiceFS v1.0 起支持。例如先执行export META_PASSWORDmypassword再把 URL 写为redis://myjfs-sh-abc.redis.rds.aliyuncs.com:6379/1避免密码出现在命令行历史中。更详细的信息参见「如何设置元数据引擎」。4. 创建文件系统以下命令使用「对象存储 Redis」的组合创建一个支持跨网络、多机同时挂载、共享读写的文件系统juicefs format \ --storage oss \ --bucket https://myjfs.oss-cn-shanghai.aliyuncs.com \ --access-key ABCDEFGHIJKLMNopqXYZ \ --secret-key ZYXwvutsrqpoNMLkJiHgfeDCBA \ redis://tom:mypasswordmyjfs-sh-abc.redis.rds.aliyuncs.com:6379/1 \ myjfsjuicefs format命令的通用格式为juicefs format [command options] META-URL NAME定义见 cmd/format.go其中--storage对象存储类型如oss、s3、cos等默认为file本地磁盘--bucket对象存储 Bucket 的 Endpoint 地址--access-key/--secret-key对象存储 API 访问密钥也可以通过环境变量ACCESS_KEY/SECRET_KEY传入见 cmd/format.goMETA-URL元数据引擎地址即本文的 Redis URLNAME文件系统名称同时也是对象存储中数据对象的前缀。文件系统创建完成后终端将返回类似下面的内容2021/12/16 16:37:14.264445 juicefs[22290] INFO: Meta address: redis://myjfs-sh-abc.redis.rds.aliyuncs.com:6379/1 2021/12/16 16:37:14.277632 juicefs[22290] WARNING: maxmemory_policy is volatile-lru, please set it to noeviction. 2021/12/16 16:37:14.281432 juicefs[22290] INFO: Ping redis: 3.609453ms 2021/12/16 16:37:14.527879 juicefs[22290] INFO: Data uses oss://myjfs/myjfs/ 2021/12/16 16:37:14.593450 juicefs[22290] INFO: Volume is formatted as {Name:myjfs UUID:4ad0bb86-6ef5-4861-9ce2-a16ac5dea81b Storage:oss Bucket:https://myjfs AccessKey:ABCDEFGHIJKLMNopqXYZ SecretKey:removed BlockSize:4096 Compression:none Shards:0 Partitions:0 Capacity:0 Inodes:0 EncryptKey:}日志中值得注意的两点maxmemory_policy告警为保证元数据安全JuiceFS 要求 Redis 的maxmemory-policy为noeviction即内存写满时拒绝写入而不是淘汰已有数据防止元数据丢失。从源码看如果策略不是noeviction客户端启动时会尝试通过CONFIG SET maxmemory-policy noeviction自动改写改写失败则打印告警见 pkg/meta/redis.go。建议在创建 Redis 实例时就手动把内存淘汰策略设置为noeviction卷信息持久化Volume is formatted as {...}中记录了存储类型、Bucket、AccessKey 等完整配置说明文件系统创建完毕后对象存储密钥等信息会完整记录到元数据数据库中。因此 JuiceFS 客户端只要拥有数据库地址、用户名和密码就可以挂载读写该文件系统——JuiceFS 客户端没有本地配置文件作为对比JuiceFS 云服务用juicefs auth命令进行认证并获取配置文件。5. 挂载文件系统由于这个文件系统的「数据」和「元数据」都存储在基于网络的云服务中因此在任何安装了 JuiceFS 客户端的计算机上都可以同时挂载该文件系统进行共享读写。例如juicefs mount redis://tom:mypasswordmyjfs-sh-abc.redis.rds.aliyuncs.com:6379/1 ~/jfsjuicefs mount命令的通用格式为juicefs mount [command options] META-URL MOUNTPOINT其中-d/--background选项可以让文件系统在后台守护进程方式挂载MOUNTPOINT为本地挂载点Windows 下应使用尚未占用的盘符如Z:、Y:。数据强一致性保证对于多客户端同时挂载读写同一个文件系统的情况JuiceFS 提供「关闭再打开close-to-open」一致性保证当两个及以上客户端同时读写相同的文件时客户端 A 的修改在客户端 B 不一定能立即看到但是一旦文件在客户端 A 写入完成并关闭之后在任何一个客户端重新打开该文件都可以保证访问到最新写入的数据不论是否在同一个节点。这意味着 JuiceFS 非常适合多机共享读写的大数据、AI 训练等场景但不适合强实时同步协作如多人同时编辑同一文档的用例。调大缓存提升性能由于对象存储是基于网络的存储服务不可避免会产生访问延时。为此JuiceFS 提供并默认启用了本地缓存机制划拨一部分本地存储作为数据与对象存储之间的缓冲层读取文件时会异步地将数据缓存到本地存储详情请查阅「缓存」。缓存机制让 JuiceFS 可以高效处理海量数据的读写任务。默认情况下JuiceFS 会在$HOME/.juicefs/cache或/var/jfsCache目录设置100GiB的缓存对应源码 cmd/flags.go 中cache-dir的默认值和cache-size的默认值100G。在速度更快的 SSD 上设置更大的缓存空间可以有效提升 JuiceFS 的读写性能。你可以使用--cache-dir调整缓存目录的位置多个目录用冒号分隔使用--cache-size调整缓存空间的大小单位为 MiB例如juicefs mount --background \ --cache-dir /mycache \ --cache-size 512000 \ redis://tom:mypasswordmyjfs-sh-abc.redis.rds.aliyuncs.com:6379/1 \ ~/jfs注意JuiceFS 进程需要具有读写--cache-dir目录的权限。上述命令将缓存目录设置在/mycache并指定缓存空间为 500GiB512000 MiB。另外源码中还有--cache-mode缓存文件权限默认0600、--free-space-ratio保留的最小空闲空间比例默认 0.1等参数进一步细化缓存行为可参考「缓存」文档。开机自动挂载在 Linux 环境中可以在挂载文件系统时通过--update-fstab选项设置开机自动挂载。该选项会把挂载 JuiceFS 所需的选项添加到/etc/fstab中对应 cmd/mount.go 中更新 fstab 的逻辑且要求以 root 权限运行。注意此特性需要使用 1.1.0 及以上版本的 JuiceFS。$ sudo juicefs mount --update-fstab --max-uploads50 --writeback --cache-size 204800 redis://tom:mypasswordmyjfs-sh-abc.apse1.cache.amazonaws.com:6379/1 MOUNTPOINT $ grep MOUNTPOINT /etc/fstab redis://tom:mypasswordmyjfs-sh-abc.apse1.cache.amazonaws.com:6379/1 MOUNTPOINT juicefs _netdev,max-uploads50,writeback,cache-size204800 0 0 $ ls -l /sbin/mount.juicefs lrwxrwxrwx 1 root root 29 Aug 11 16:43 /sbin/mount.juicefs - /usr/local/bin/juicefs示例中--max-uploads50限制并发上传数、--writeback启用写缓存先在本地落盘再异步上传提升写性能、--cache-size 204800表示 200GiB 缓存。更详细的自动挂载配置请参考「启动时自动挂载 JuiceFS」。6. 验证文件系统挂载好文件系统后可以通过juicefs bench命令对文件系统进行基础的性能测试和功能验证确保文件系统能够正常访问且性能符合预期juicefs bench ~/jfsjuicefs bench会根据指定的并发度默认 1往文件系统中写入并读取 N 个大文件默认 1及 N 个小文件默认 100并统计读写的吞吐、单次操作的延迟以及访问元数据引擎的延迟。它还支持--block-size、--big-file-size、--small-file-size等参数调整测试负载见 cmd/bench.go。说明juicefs bench只能完成基础的性能测试若需对 JuiceFS 进行更完整的评估请参考「JuiceFS 性能评估指南」。如果在验证文件系统的过程中遇到任何问题请先参考「故障诊断和分析」文档进行排查。7. 卸载文件系统可以通过juicefs umount命令卸载 JuiceFS 文件系统假设挂载点路径是~/jfsjuicefs umount ~/jfs如果执行命令后卸载失败提示Device or resource busy2021-05-09 22:42:55.757097 I | fusermount: failed to unmount ~/jfs: Device or resource busy exit status 1发生这种情况通常是因为某些程序正在读写文件系统中的文件。为了确保数据安全你应该先排查是哪些程序正在与文件系统中的文件进行交互例如通过lsof命令并结束它们之间的交互然后再重新执行卸载命令。⚠️ 以下命令可能导致文件损坏、丢失请务必谨慎操作当然在能够确保数据安全的前提下也可以在卸载命令中添加--force或-f参数强制卸载juicefs umount --force ~/jfs进阶更多元数据引擎与生产化考量本文以 Redis 为例展开但分布式模式下 JuiceFS 的元数据引擎选择远不止于此。综合「如何设置元数据引擎」文档可以在生产环境中按需选择Redis / Valkey / KeyDB内存型键值数据库性能极佳。JuiceFS 要求 Redis 4.0同样支持 Redis Cluster此时 URL 中的数据库编号会作为{N}形式的键前缀借助哈希标签将同一卷的键路由到同一槽位而非选择实际数据库通过哨兵Sentinel可实现高可用通过 mTLS 可开启双向加密认证1.1.0TiKV分布式事务型键值数据库URL 格式为tikv://pd_addr[,pd_addr...]/prefix多个文件系统共用集群时用prefix区分etcd高可用的键值数据库URL 格式为etcd://[user:password]addr[,addr...]/prefixFoundationDB分布式数据库因需先安装其客户端库JuiceFS 发布版本默认不支持需自行编译make juicefs.fdbURL 格式为fdb://cluster_file_path?prefixprefixMySQL / MariaDB / OceanBase关系型数据库需提前手动创建数据库URL 格式为mysql://username[:password](host:3306)/database-name支持tlstrue、timeout5s等 query 参数从 1.3 版本起可通过table_prefix参数让多个文件系统共享同一数据库PostgreSQL关系型数据库URL 格式为postgres://[username][:password]host[:5432]/database-name默认使用publicschema可通过search_path参数指定其他 schema密码中的特殊字符需要进行 URL 编码。在从单机模式迈向分布式模式时还有两点生产化建议可靠性规划内存型数据库如 Redis性能好但数据易丢失生产环境应结合 Sentinel、持久化RDB/AOF或多副本云数据库服务保证元数据不丢容量规划根据前文提到的元数据占用估算键值库约 300 字节/文件关系库约 600 字节/文件为元数据引擎预留足够空间并定期通过「元数据备份」等手段保护元数据安全。总结从单机模式的「SQLite 本地磁盘/对象存储」到分布式模式的「云数据库 对象存储」JuiceFS 用同一套客户端命令完成了文件系统的分布式化升级数据层继续使用可被任意主机访问的对象存储元数据层替换为 Redis、PostgreSQL、MySQL 等支持网络并发访问的数据库。至此任何安装了 JuiceFS 客户端的计算机只要掌握数据库的地址、用户名和密码就可以挂载读写同一个文件系统配合 close-to-open 一致性保证、本地缓存加速与开机自动挂载即可搭建一套可供多机共享读写的分布式 POSIX 文件系统。【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表