十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

JuiceFS 对比 GlusterFS:架构、元数据、数据管理与访问协议全维度解析

JuiceFS 对比 GlusterFS:架构、元数据、数据管理与访问协议全维度解析 JuiceFS 对比 GlusterFS架构、元数据、数据管理与访问协议全维度解析【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefsJuiceFS 是专为云端设计的开源高性能分布式文件系统采用数据与元数据分离架构以低成本提供大规模、弹性的存储能力GlusterFS 则是经典的软件定义分布式存储方案可在单个集群中支撑 PiB 级数据。本文以一份速查表切入从系统架构、元数据管理、数据管理、访问协议与扩展功能五个维度对两者进行逐一拆解并结合 JuiceFS 当前仓库的源码实现pkg/与cmd/深入说明关键机制帮助读者在选型时做出有依据的判断。JuiceFS 和 GlusterFS 对比一览下表快速概述了 GlusterFS 和 JuiceFS 之间的差异可作为全文的速查索引对比项GlusterFSJuiceFS元数据纯分布式独立数据库服务数据存储自主管理依赖对象存储服务大文件拆分不拆分拆分冗余保护副本、纠删码依赖对象存储服务数据压缩部分支持支持数据加密部分支持支持POSIX 兼容性完整完整NFS 协议不直接支持不直接支持CIFS 协议不直接支持不直接支持S3 协议支持久未更新支持HDFS 兼容性支持久未更新支持CSI 驱动支持支持POSIX ACLs支持支持跨域复制支持依赖外部服务目录配额支持支持快照支持不支持但支持克隆回收站支持支持主要维护者Red Hat, IncJuicedata, Inc开发语言CGo开源协议GPLv2 and LGPLv3Apache License 2.0系统架构对比GlusterFS 的架构GlusterFS 采用全分布式架构没有中心化节点。集群主要由服务端和客户端两大部分组成服务端负责管理和存储数据通常被称为可信存储池Trusted Storage Pool由一系列对等的 Server 节点组成一般运行两类进程glusterd每个节点一个负责配置管理和分发等glusterfsd每个 Brick 一个负责处理数据请求和对接底层文件系统。每个 Brick 上的所有文件可以看成是 GlusterFS 的一个子集就文件内容而言通过 Brick 直接访问和通过 GlusterFS 客户端访问看到的结果通常一致。因此在异常情况下用户通过整合多个 Bricks 的内容就能在一定程度上恢复出原有数据。为了确保某台机器故障时整个文件系统的访问不受影响通常会对数据做冗余保护多个 Bricks 组成冗余组通过副本或纠删码实现数据保护。当某个节点故障时只能在冗余组内做恢复恢复时间较长集群扩容时也需要以冗余组为单位整体扩容。客户端则是挂载了 GlusterFS 的节点负责对应用程序展示统一的命名空间。JuiceFS 的架构JuiceFS 采用「数据」与「元数据」分离存储的架构文件数据本身会被切分保存在对象存储如 Amazon S3中元数据则保存在用户自行选择的数据库里如 Redis、MySQL。通过共享同一份数据库与对象存储JuiceFS 实现了强一致性保证的分布式文件系统同时还具备「POSIX 完全兼容」「高性能」等特性。更详细的介绍参见技术架构文档。从仓库结构看JuiceFS 的核心代码分化为三条清晰的实现路径客户端读写路径在 pkg/chunk 与 pkg/vfs元数据引擎抽象在 pkg/meta对象存储适配在 pkg/object与「客户端 元数据引擎 数据存储」的三段式架构一一对应。元数据管理对比GlusterFSGlusterFS 元数据是纯分布式的没有集中的元数据服务。客户端通过对文件名哈希确定其所属的 Brick当请求需要跨多个 Bricks 访问如mv、ls等时由客户端负责协调。这种设计架构上比较简单但当系统规模扩大时往往会带来性能瓶颈。比如ls一个大目录时可能需要访问多个 Bricks 来获得完整结果其中任何一个卡顿都会导致整个请求变慢。另外跨 Bricks 修改操作在途中遇到故障时元数据一致性也比较难保证严重故障时还可能出现脑裂需要手动恢复数据到统一版本。JuiceFSJuiceFS 的元数据存储在一个独立的数据库称为元数据引擎中客户端会将文件元数据操作转换成该数据库的一个事务借助数据库的事务能力保证操作的原子性。这种设计使 JuiceFS 的实现变得简单但对元数据引擎提出了较高要求。JuiceFS 支持三大类共 10 种事务型数据库具体可参见元数据引擎文档。从源码看pkg/meta 目录下的实现印证了这一分类键值类TKVRedispkg/meta/redis.go 中通过Register(redis, newRedisMeta)注册、TiKVpkg/meta/tkv_tikv.go、BadgerDBpkg/meta/tkv_badger.go、etcdpkg/meta/tkv_etcd.go、FoundationDBpkg/meta/tkv_fdb.go、内存版pkg/meta/tkv_mem.go关系型SQLMySQL/MariaDBpkg/meta/sql_mysql.go、PostgreSQLpkg/meta/sql_pg.go、SQLitepkg/meta/sql_sqlite.go。元数据所需的存储空间与文件名长度、文件类型和长度及扩展属性等相关可按无扩展属性的单个小文件近似估算键值数据库约 300 字节/文件关系型数据库约 600 字节/文件。当平均文件更大超过 64MB、文件被频繁修改产生大量碎片、存在大量扩展属性或平均文件名很长超过 50 字节时所需空间会进一步增加。在键值型与关系型引擎之间迁移时可据此估算目标引擎容量。数据管理对比GlusterFS 通过整合多个服务端节点的 Bricks一般构建在本地文件系统之上如 XFS来存储数据因此本身提供了一定的数据管理功能如分布管理、冗余保护、故障切换、静默错误检测等。JuiceFS 则不直接使用硬盘而是通过对接各种对象存储来管理数据大部分特性都依赖于对象存储自身的实现。大文件拆分在分布式系统中将大文件拆分成多个小块散列存储在不同节点是一种常见优化手段这往往能让应用在访问此文件时有更高的并发度和整体带宽。GlusterFS不拆分曾有过 Striped Volume 会拆分大文件现已不再支持。JuiceFS文件先按大小拆成 64 MiB 的 Chunks每个 Chunk 再根据写入模式进一步拆成默认 4 MiB 的 Blocks具体可参见架构文档。从源码结构看这一设计落实在 pkg/chunk 模块Chunk 用于优化查找定位每个 Chunk 最大 64M无论文件多大读写都会根据偏移量定位到对应 Chunk实际写入发生在 Slice 上一次连续写入不能跨越 Chunk 边界持久化时再将 Slice 拆分为一个个默认最大 4M 的 Block多线程并发写入以提升写性能pkg/chunk/cached_store.go 中Config.BlockSize即用于控制该粒度测试用例 pkg/chunk/cached_store_test.go 也以4 20验证默认块大小。Chunk、Slice 是逻辑数据结构Block 是最终物理存储形式也是对象存储与磁盘缓存的最小存储单元。冗余保护GlusterFS支持副本Replicated Volume和纠删码Dispersed Volume两种类型。JuiceFS依赖于使用的对象存储自身提供的冗余能力。数据压缩GlusterFS仅支持传输层压缩——文件由客户端压缩传输到服务端后由 Brick 解压缩不直接实现存储层压缩而是依赖 Brick 使用的底层文件系统如 ZFS。JuiceFS同时支持传输层压缩和存储层压缩数据的压缩和解压缩都在客户端执行。压缩算法实现在 pkg/compress/compress.go并通过format/config命令的压缩参数配置默认none可选lz4、zstd等对象存储中保存的是压缩后的数据。数据加密GlusterFS仅支持传输层加密依赖 SSL/TLS曾支持过存储层加密但现已不再支持。JuiceFS同时支持传输层加密和存储层加密数据的加密和解密都在客户端进行。传输层方面客户端默认使用 HTTPS 与对象存储连接也可显式指定http://协议头对支持 TLS/SSL 的元数据引擎可使用rediss://等加密协议头连接存储层方面静态数据加密实现在 pkg/object/encrypt.go 与 pkg/object/encrypt_chunked.go加密后的数据块才会上传到对象存储即使存储端数据泄露也无法还原明文。访问协议POSIX 兼容性GlusterFS 和 JuiceFS 都提供 POSIX 兼容性JuiceFS 的兼容性细节与限制可参考 POSIX 兼容性文档。JuiceFS 通过 FUSE 向应用暴露 POSIX 接口其 VFS 层实现在 pkg/vfsFUSE 适配层在 pkg/fuse读写路径覆盖 open/read/write/fsync/truncate 等标准系统调用语义。NFS 协议GlusterFS 曾有内嵌服务支持 NFSv3但现已不再推荐使用官方建议用 NFS server 将挂载点导出。JuiceFS 不直接支持 NFS 协议需要挂载后通过其他 NFS server 导出。CIFS 协议GlusterFS 内嵌支持 Windows、Linux Samba client 和 macOS 的 CLI 访问但不支持 macOS Finder官方文档同样建议通过 Samba 将挂载点导出。JuiceFS 不直接支持 CIFS/SMB 协议需要挂载后通过 Samba 导出。S3 协议GlusterFS 通过gluster-swift项目支持 S3 协议但其最近更新停留在 2017 年 11 月。JuiceFS 通过内置的 S3 网关 支持——网关实现在 cmd/gateway.go以单进程方式对外提供 S3 兼容接口使用 AWS CLI、s3cmd、MinIO client 等工具即可访问 JuiceFS 文件系统适合让已有的 S3 应用无缝接入。HDFS 兼容性GlusterFS 通过glusterfs-hadoop项目支持 HDFS 兼容访问但其最近更新停留在 2015 年 5 月。JuiceFS 提供完整的 HDFS API 兼容通过 sdk/java 下的 Hadoop Java SDK 实现可直接替代 HDFS 为 Hadoop 生态提供低成本海量存储相关读写逻辑封装在 sdk/java/libjfs 中。CSI 驱动GlusterFS 曾支持过 CSI 驱动但最近版本发布于 2018 年 11 月且仓库已被标记 DEPRECATED。JuiceFS 提供官方 CSI 驱动可为 Kubernetes 集群提供动态供给的持久化存储卷方便容器化应用直接使用 JuiceFS。扩展功能POSIX ACLsLinux 下对文件的访问权限控制一般有三类实体即文件拥有者owner、拥有组group和其他other。当有更复杂的需求比如要给本属于 other 的某个特定用户单独赋予权限时这套机制就做不到了。POSIX Access Control ListsACLs提供增强的权限管理功能可用来为任意用户/用户组指定权限。GlusterFS支持且支持 access ACLs 和 default ACLs。JuiceFS从 v1.2 版本开始支持 POSIX ACLs实现在 pkg/acl 模块pkg/acl/acl.go 负责 ACL 规则的解析与校验pkg/acl/cache.go 提供访问控制缓存以降低元数据引擎压力。跨域复制跨域复制是指在两套独立的集群间进行数据复制一般被用来实现异地灾备。GlusterFS支持单向的异步增量复制但要求两边是同版本的 Gluster 集群。JuiceFS依赖元数据引擎和对象存储自身的复制能力可以做单向复制此外也可以借助 sync 工具实现于 pkg/sync在文件系统之间同步数据。目录配额GlusterFS 和 JuiceFS 都支持目录配额包括容量和/或文件数限制。JuiceFS 的配额能力在 存储配额文档 中有完整说明并包含三类文件系统配额从 v1.0 起支持通过juicefs format --capacity单位 GiB与--inodes在创建时设定或通过juicefs config $METAURL --capacity 100、--inodes修改配额用尽时写入返回ENOSPC。目录配额从 v1.1 起支持通过juicefs quota set $METAURL --path $DIR --capacity $N或--inodes $N设置也可组合使用如--capacity 10 --inodes 1000查询用juicefs quota get列出用juicefs quota ls目录配额是硬限制超限写入返回EDQUOT并支持配额嵌套、子目录挂载--subdir时df直接显示目录配额、用量检查与修复juicefs quota check --repair。用户/组配额支持按 UID/GID 设置容量与 inode 配额juicefs quota set $METAURL --uid 1000 --capacity 2 --inodes 200等同样可get/delete/list/check --repair。配额相关 CLI 实现在 cmd/quota.go底层用量统计与限额校验在 pkg/meta/quota.go 中完成。快照GlusterFS仅支持存储卷级别的快照且需要所有 Bricks 部署在 LVM 精简卷Thinly-Provisioned LVM上。JuiceFS不支持快照但支持目录级别的克隆。克隆只拷贝元数据而不实际拷贝对象存储数据因此无论多大文件或目录的克隆都非常快命令juicefs clone SRC DST实现在 cmd/clone.go。克隆结果与源文件引用相同的数据块任何一方数据被实际修改时数据块变更以写入时重定向ROWRedirect on Write方式写入新数据块并更新指针未修改区域保持共享引用。一致性方面clone对文件保证原子性对目录不保证克隆产生的元数据同样占用元数据引擎与文件系统存储空间对庞大目录克隆需谨慎失败或被中断的克隆可能造成元数据与对象存储泄露可用juicefs gc --delete清理。回收站GlusterFS支持回收站但默认关闭。JuiceFS支持回收站且默认开启。删除的文件保存在根目录下的.trash目录中格式为.trash/YYYY-MM-DD-HH/[parent inode]-[file inode]-[file name]保留指定时间后才真正清理期间df显示的使用量不会减少。保留时长由--trash-days控制# 初始化新的文件系统回收站保留 7 天 juicefs format META-URL myjfs --trash-days7 # 修改已有文件系统的回收站保留时长 juicefs config META-URL --trash-days7 # 设置为 0 以禁用回收站 juicefs config META-URL --trash-days0回收站的自动清理依赖客户端后台任务bgjob需要至少 1 个在线挂载点且挂载时不可使用--no-bgjob。误删文件可通过mv从.trash恢复复杂目录可用juicefs restore $META_URL 2023-08-14-05 --put-back重建目录结构并放回原位实现在 cmd/restore.go如需提前彻底删除可用 root 身份执行juicefs rmrcmd/rmr.go。此外覆写产生的失效文件碎片也按回收站设置的时间保留可用juicefs status --more观测规模必要时用juicefs gc --compact与juicefs gc --delete清理。总结与选型参考综合以上对比可以提炼出两条清晰的选型主线GlusterFS是传统的自管存储集群方案数据由自身冗余组副本/纠删码保护扩容以冗余组为单位元数据采用去中心化的哈希定位。它适合希望完全掌控底层存储硬件、不依赖公有云对象存储的私有化场景但跨 Bricks 的元数据操作在大规模下容易出现性能瓶颈脑裂恢复与按组扩容也带来运维成本。JuiceFS是云原生架构数据与元数据分离数据落对象存储、元数据落独立数据库借助对象存储与数据库的成熟能力获得冗余保护、弹性和强一致性。它对大文件拆分、压缩、加密、配额、克隆、回收站、POSIX ACL 等特性均有完整实现并通过 FUSE、Hadoop Java SDK、S3 网关、CSI 驱动、Python SDK 等多种接入方式覆盖不同生态。适合以对象存储为底座、需要弹性伸缩与多协议接入的云上场景其局限也很明确——冗余保护、跨域复制等能力依赖所选择的对象存储与元数据引擎。最终选择取决于基础设施现状、对数据冗余的掌控粒度以及部署环境的云原生程度可结合本文各维度以及仓库中的架构文档、元数据引擎文档与各功能模块文档进一步评估。【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表