浅析 GlusterFS 与 JuiceFS 的架构异同
在进行分布式文件存储解决方案的选型时,GlusterFS 无疑是一个不可忽视的考虑对象。作为一款开源的软件定义分布式存储解决方案,GlusterFS 能够在单个集群中支持高达 PiB 级别的数据存储。自从首次发布以来,已经有超过十年的发展历程。目前,该项目主要由 Red Hat 负责维护,并且在全球范围内拥有庞大的用户群体。本文旨在通过对比分析的方式,介绍 GlusterFS 与 JuiceFS 的区别,为您的团队在技术选型过程中提供一些参考。
系统架构对比
GlusterFS
GlusterFS 采用的是全分布式的架构,没有中心化节点。GlusterFS 集群主要由服务端和客户端两大部分组成。其中服务端负责管理和存储数据,通常被称为可信存储池(Trusted Storage Pool)。这个存储池由一系列对等的 Server 节点组成,一般会运行两类进程:
- glusterd:每个节点一个,负责配置管理和分发等。
- glusterfsd:每个 Brick 一个,负责处理数据请求和对接底层文件系统。
每个 Brick 上的所有文件可以看成是 GlusterFS 的一个子集,就文件内容而言,通过 Brick 直接访问和通过 GlusterFS 客户端访问看到的结果通常是一致的。因此,在 GlusterFS 异常情况下,用户通过整合多个 Bricks 内容就能一定程度上恢复出原有数据。另外在部署时,为了确保某台机器故障时,整个文件系统的访问不受影响,通常会对数据做冗余保护。在 GlusterFS 中,多个 Bricks 会组成一个冗余组,互相之间通过副本或纠删码的方式实现数据保护。当某个节点故障时,只能在冗余组内做恢复,恢复的时间会比较长。在 GlusterFS 集群扩容时,需要以冗余组为单位整体扩容。
客户端是挂载了 GlusterFS 的节点,负责对应用程序展示统一的命名空间。其架构图如下(来自 https://docs.gluster.org/en/latest/Quick-Start-Guide/Architecture/):

JuiceFS
JuiceFS 采用「数据」与「元数据」分离存储的架构,文件数据本身会被切分保存在对象存储(如 Amazon S3)当中,而元数据则是会被保存在用户自行选择的数据库里(如 Redis、MySQL)。通过共享同一个份数据库与对象存储,JuiceFS 实现了一个强一致性保证的分布式文件系统,同时还具有「POSIX 完全兼容」、「高性能」等诸多特性。JuiceFS 的架构,在其文档有更详细的介绍。
元数据管理对比
GlusterFS 元数据是纯分布式的,没有集中的元数据服务。客户端通过对文件名哈希确定其所属的 Brick;当请求需要跨多个 Bricks 访问(如 mv,ls 等)时,由客户端负责协调。这种设计架构上比较简单,但当系统规模扩大时,往往会带来性能瓶颈。比如,ls 一个大目录时可能会需要访问多个 Bricks 来获得完整的结果,其中任何一个的卡顿都会导致整个请求变慢。另外,跨 Bricks 修改操作在途中遇到故障时,元数据一致性也比较难保证。在严重故障时,还可能出现脑裂,需要手动恢复数据到统一版本。
JuiceFS 的元数据存储在一个独立的数据库(称为元数据引擎)中,客户端会将文件元数据操作转换成此数据库的一个事务,借助数据库的事务能力来保证操作的原子性。这种设计使得 JuiceFS 的实现变得简单,但对元数据引擎提出了较高的要求。目前 JuiceFS 支持三大类 10 种事务型数据库,具体可参见元数据引擎文档。
数据管理对比
GlusterFS 通过整合多个服务端节点的 Bricks(一般构建在本地文件系统之上,如 XFS)来存储数据。因此,它本身提供了一定的数据管理功能,如分布管理、冗余保护、故障切换、静默错误检测等。JuiceFS 则不直接使用硬盘,而是通过对接各种对象存储来管理数据,大部分特性都依赖于对象存储自身的实现。
大文件拆分
在分布式系统中,将大文件拆分成多个小块散列存储在不同节点中是一种常见的优化手段。这往往能让应用在访问此文件时有更高的并发度和整体带宽。
- GlusterFS:不拆分(曾有过 Striped Volume 会拆分大文件,现已不再支持)。
- JuiceFS:文件先按大小拆成 64 MiB 的 Chunks,每个 Chunk 再根据写入模式进一步拆成默认 4 MiB 的 Blocks;具体可参见架构文档。
冗余保护
- GlusterFS:支持**副本(Replicated Volume)和纠删码(Dispersed Volume)**两种类型。
- JuiceFS:依赖于使用的对象存储。
数据压缩
-
GlusterFS:
- 仅支持传输层压缩,文件由客户端执行压缩,传输到服务端后再由 Brick 负责解压缩。
- 不直接实现存储层压缩,而是依赖于 Brick 使用的底层文件系统,如 ZFS。
-
JuiceFS:同时支持传输层压缩和存储层压缩,数据的压缩和解压缩都在客户端执行。
数据加密
-
GlusterFS:
- 仅支持传输层加密,依赖于 SSL/TLS。
- 曾支持过存储层加密,但现已不再支持。
-
JuiceFS:同时支持传输层加密和存储层加密,数据的加密和解密都在客户端进行。
访问协议
POSIX 兼容性
- GlusterFS:兼容。
- JuiceFS:兼容。
NFS 协议
- GlusterFS:曾有内嵌服务来支持 NFSv3,但现已不再推荐使用,而是建议用 NFS server 将挂载点导出。
- JuiceFS:不直接支持,需要挂载后通过其他 NFS server 导出。
CIFS 协议
- GlusterFS:内嵌支持 Windows,Linux Samba client 和 macOS 的 CLI 访问,不支持 macOS Finder。然而,文档中建议用通过 Samba 将挂载点导出的方式使用。
- JuiceFS:不直接支持,需要挂载后通过 Samba 导出。
S3 协议
- GlusterFS:通过 gluster-swift 项目支持,但其最近更新停留在 2017年11月。
- JuiceFS:通过结合 MinIO S3 网关支持。
HDFS 兼容性
- GlusterFS:通过 glusterfs-hadoop 项目支持,但其最近更新停留在 2015 年 5月。
- JuiceFS:完整兼容 HDFS API。
CSI 驱动
- GlusterFS:曾支持过,但最近版本发布于 2018 年 11 月,且仓库已被标记 DEPRECATED。
- JuiceFS:支持,具体可参见 JuiceFS CSI 驱动文档。
扩展功能
POSIX ACLs
Linux 下对文件的访问权限控制一般有三类实体,即文件拥有者(owner)、拥有组(group)和其他(other)。当我们有更复杂的需求,比如要给本属于 other 的某个特定用户单独赋予权限时,这套机制就做不到了。POSIX Access Control Lists (ACLs) 提供增强的权限管理功能,可用来为任意用户/用户组指定权限。
- GlusterFS:支持,且支持 access ACLs 和 default ACLs。
- JuiceFS:不支持。
跨域复制
跨域复制是指在两套独立的集群间进行数据复制,一般被用来实现异地灾备。
- GlusterFS:支持单向的异步增量复制,但需要两边是同版本的 Gluster 集群。
- JuiceFS:依赖元数据引擎和对象存储自身的复制能力,可以做单向复制。
目录配额
- GlusterFS:支持,且支持限制容量和/或文件数。
- JuiceFS:支持,且支持限制容量和/或文件数。
快照
- GlusterFS:仅支持存储卷级别的快照,而且需要所有 Bricks 部署在 LVM 精简卷(Thinly-Provisioned LVM)上。
- JuiceFS:不支持快照,但支持目录级别的克隆。
回收站
- GlusterFS:支持,且默认关闭。
- JuiceFS:支持,且默认打开。
对比清单
| GlusterFS | JuiceFS | |
|---|---|---|
| 元数据 | 纯分布式 | 独立数据库服务 |
| 数据存储 | 自主管理 | 依赖对象存储服务 |
| 大文件拆分 | 不拆分 | 拆分 |
| 冗余保护 | 副本、纠删码 | 依赖对象存储服务 |
| 数据压缩 | 部分支持 | 支持 |
| 数据加密 | 部分支持 | 支持 |
| POSIX 兼容性 | 完整 | 完整 |
| NFS 协议 | 不直接支持 | 不直接支持 |
| CIFS 协议 | 不直接支持 | 不直接支持 |
| S3 协议 | 支持(久未更新) | 支持 |
| HDFS 兼容性 | 支持(久未更新) | 支持 |
| CSI 驱动 | 支持 | 支持 |
| POSIX ACLs | 支持 | 不支持 |
| 跨域复制 | 支持 | 依赖外部服务 |
| 目录配额 | 支持 | 支持 |
| 快照 | 支持 | 不支持(但支持克隆) |
| 回收站 | 支持 | 支持 |
| 主要维护者 | Red Hat, Inc | Juicedata, Inc |
| 开发语言 | C | Go |
| 开源协议 | GPLV2 and LGPLV3+ | Apache License 2.0 |
更多阅读
-
浅析 SeaweedFS 与 JuiceFS 架构异同
-
云上大数据存储:探究 JuiceFS 与 HDFS 的异同
-
浅析三款大规模分布式文件系统架构设计:GFS、Tectonic、JuiceFS
相关文章:
浅析 GlusterFS 与 JuiceFS 的架构异同
在进行分布式文件存储解决方案的选型时,GlusterFS 无疑是一个不可忽视的考虑对象。作为一款开源的软件定义分布式存储解决方案,GlusterFS 能够在单个集群中支持高达 PiB 级别的数据存储。自从首次发布以来,已经有超过十年的发展历程。目前&am…...
ARM开发,stm32mp157a-A7核PWM实验(驱动蜂鸣器,风扇,马达工作)
1.分析框图; 2.比较捕获寄存器(产生PWM方波); 工作原理: 1、系统提供一个时钟源209MHZ,需要通过分频器进行分频,设置分频器值为209分频; 2、当定时器启动之后,自动重载…...
群狼调研(长沙眼镜店神秘顾客)|消费者需求研究方案
本文由群狼调研(长沙品牌调研)出品,欢迎转载,请注明出处。消费者需求研究方案是在开展研究之前制定的计划,用于指导研究的设计、实施和分析。以下是一个可能的消费者需求研究方案的大致框架: 1. 研究目标和问题: • …...
电脑入门:宽带路由器常见故障排除技巧
宽带路由器在企业网络中的应用是相当广泛的,在运行的过程中出现故障是在所难免的,虽然故障现象多种多样,引起故障发生的原因也不尽相同,但从大体上可以把这些故障分为硬件故障和软件故障,具体来说就是一些网络连接性问题、配置文件选项问题以及网络协议问题等。 由于路由器…...
基于云原生网关的流量防护实践
作者:涂鸦 背景 在分布式系统架构中,每个请求都会经过很多层处理,比如从入口网关再到 Web Server 再到服务之间的调用,再到服务访问缓存或 DB 等存储。在下图流量防护体系中,我们通常遵循流量漏斗原则进行流量防护。…...
开源与云计算:新的合作模式
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
前端需要理解的跨平台知识
混合开发是指使用多种开发模开发App的一种开发模式,涉及到两大类技术:原生 Native、Web H5。原生 Native 主要指 iOS(Objective C)、Android(Java),原生开发效率较低,开发完成需要重…...
《基于 Vue 组件库 的 Webpack5 配置》3.将 CSS 提取到单独的文件
使用 webpack 插件 mini-css-extract-plugin 需要额外安装 npm i mini-css-extract-pluginlatest -D; 同时打包 js 和 css 文件时,可参考 entry 高级用法; package.json 的配置如下 const { VueLoaderPlugin } require(vue-loader); // 可…...
2023CCF图形学启明星计划夏令营感想记录
这篇就是纯日记了,想记录一下参加这个夏令营的感想,中间的一些过程,毕竟这对我来说算是一段难忘的经历。 一、了解到的渠道 我个人是比较喜欢图形渲染的,之前也学过GAMES的课程,然后偶然的一天,GAMES101里…...
如何解决“缺失msvcp110.dll”错误,msvcp110.dll丢失要怎样才能修复
今天,我将为大家分享关于电脑提示msvcp110.dll丢失的3种修复方法。希望这些方法能帮助到正在遇到这个问题的朋友们。 首先,我们来了解一下msvcp110.dll文件的作用。msvcp110.dll是Microsoft Visual C 2010 Redistributable Package的一部分,…...
激活函数总结(二十):激活函数补充(SQNL、PLU)
激活函数总结(二十):激活函数补充 1 引言2 激活函数2.1 Square nonlinearity (SQNL)激活函数2.2 Piecewise Linear Unit (PLU)激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PR…...
Docker【部署 04】Docker Compose下载安装及实例Milvus Docker compose(CPU)使用说明分享
Docker Compose 下载安装使用说明 1.Compose说明1.1 Overview of installing Docker Compose1.2 Installation scenarios1.2.1 Scenario one: Install Docker Desktop1.2.2 Scenario two: Install the Compose plugin1.2.3 Scenario three: Install the Compose standalone 2.C…...
23种设计模式-7种结构模式
结构型模式简述 把类或对象结合在一起形成一个更大的结构。 装饰器模式:动态的给对象添加新的功能。 代理模式:为其它对象提供一个代理以便控制这个对象的访问。 桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变…...
大数据Flink(六十七):SQL Table 简介及运行环境
文章目录 SQL & Table 简介及运行环境 一、简介 二、案例...
WPF使用依赖注入
现在依赖注入在.Net里面已经普及,自己常写一些简单的demo倒是无所谓,但偶尔写一点正式的工程,也免不了要使用一下,于是总结了一下在WPF里面使用依赖注入。 在写简单Demo时候,通常是在MainWindow的构造函数里面直接做初…...
玩转科技|了解AI平台桌面客户端—ChatBox
目录 前言 特性 编辑 为什么需要 ChatBox? ChatGPT Plus 平替? 下载 支持系统 功能图 使用教程 感受 展示 前言 今天小编又来了,推荐给大家一款开源的OpenAI API桌面客户端ChatBox,它支持 Windows、Mac 和 Linux。…...
visual studio 2022.NET Core 3.1 未显示在目标框架下拉列表中
问题描述 在Visual Studio 2022我已经安装了 .NET core 3.1 并验证可以运行 .NET core 3.1 应用程序,但当创建一个新项目时,目标框架的下拉列表只允许 .NET 6.0和7.0。而我在之前用的 Visual Studio 2019,可以正确地添加 .NET 核心项目。 …...
人工智能项目集合推荐(数据集 模型训练 C++和Android部署)
人工智能项目集合推荐(数据集 模型训练 C和Android部署) 目录 人工智能项目集合推荐(数据集 模型训练 C和Android部署) 1.三维重建项目集合 ★双目三维重建 ★结构光三维重建 2.AI CV项目集合 ★人脸检测和人体检测 ★人体姿态估计(人体关键点检测) ★头部朝向估计 …...
C# 服务HTTPS 对 请求被中止: 未能创建 SSL/TLS 安全通道报错
1.如果windows支持HTTPS的TLS协议,则可以直接跳过 (Tls12) [WebMethod(Description "获取HttpsPost加密服务.")] public string HTTPSPOST(String input,String sUrl) { Log.Add("ReceiveNotice", &qu…...
二级MySQL(七)——表格数据修改
1、修改表格中部分数据 将表格某一行的数据修改,这里用的UPDATE语句: UPDATE tb_student SET studentName 黄涛,native湖北,nation汉 WHERE studentNo 2014210103; 结果: 2、修改表格某一列全部数据 比如性别全部设置为‘女’ UPDATE…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
以太网PHY布局布线指南
1. 简介 对于以太网布局布线遵循以下准则很重要,因为这将有助于减少信号发射,最大程度地减少噪声,确保器件作用,最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确,然…...
