SeaweedFS 与 JuiceFS 的设计和特性
SeaweedFS是一种高效的分布式文件存储系统,其灵感来自 Facebook 的 Haystack。它擅长对小数据块进行快速读写操作。JuiceFS是一个云原生分布式文件系统,以低成本提供海量、弹性、高性能的存储。
本文旨在比较 SeaweedFS 和 JuiceFS 的设计和功能,帮助用户在选择文件存储系统时做出明智的决定。比较将侧重于它们的体系结构、元数据存储、数据存储、访问协议和扩展功能。为了汇总信息,将在文章末尾提供一个表格。
架构比较
SeaweedFS 架构
SeaweedFS由三部分组成:
-
卷服务器在底层存储文件。
-
主服务器管理集群。
-
一个可选的文件管理器组件,向上提供更多的功能。
SeaweedFS 架构
卷服务器和主服务器
在系统运行中,卷服务器和主服务器都用于文件存储:
-
卷服务器专注于数据读写操作。
-
主服务器主要用作集群和卷的管理服务。
在数据访问方面,SeaweedFS 实现了与 Haystack 类似的方法。SeaweedFS 中用户创建的卷对应于一个大磁盘文件(下图中的 Superblock)。在此卷中,用户写入的所有文件(图中的针)都合并到大磁盘文件中。
SeaweedFS中的数据读写流程:
-
在写入操作之前,调用者向 SeaweedFS(主服务器)请求写入分配。
-
SeaweedFS 根据当前数据量返回一个File ID(由Volume ID 和offset 组成)。在写入过程中,文件长度和块详细信息等基本元数据信息也与数据一起写入。
-
写入完成后,调用者需要将文件与返回的File ID关联起来,并将这个映射存储在外部系统中,比如MySQL。
-
在读取数据时,由于文件 ID 已经包含了计算文件位置(偏移量)所需的所有信息,因此可以高效地检索文件内容。
卷服务器
文件管理器
在上面提到的底层存储单元之上,SeaweedFS 提供了一个名为 filer 的组件。通过与卷服务器和主服务器集成,它提供了广泛的外部功能和特性,例如 POSIX 支持、WebDAV 和 S3 接口。与 JuiceFS 类似,filer 也需要集成外部数据库来存储元数据信息。
请注意,在以下文本中,SeaweedFS 包含文件管理器组件。
JuiceFS 架构
下图是社区版JuiceFS 的架构:
JuiceFS 架构
JuiceFS 由三个组件组成:
-
JuiceFS 客户端,所有文件 I/O 都在其中发生。
-
数据存储器存储文件数据。
-
元数据引擎存储文件元数据。
JuiceFS 采用了数据和元数据存储分离的架构:
-
文件数据被拆分并存储在对象存储系统中,例如 Amazon S3。
-
元数据存储在用户选择的数据库中,例如 Redis 或 MySQL。
JuiceFS 通过共享同一个数据库和对象存储,实现了强一致的分布式文件系统,同时提供了完整的 POSIX 兼容性和高性能等特性。
元数据存储比较
在元数据存储方面,SeaweedFS 和 JuiceFS 都支持使用外部数据库来存储文件系统的元数据信息。在数据库支持方面,SeaweedFS 最多支持24 个不同的数据库。JuiceFS 对数据库事务能力要求很高,目前支持三大类 10 个事务数据库。
原子操作
为了保证所有元数据操作的原子性,JuiceFS 在实现层面依赖于具有事务处理能力的数据库。相比之下,SeaweedFS 在 Rename 操作时只使用部分数据库(SQL、ArangoDB、TiKV)的事务,对数据库事务能力的要求较低。此外,在 Rename 操作期间,SeaweedFS 不会在元数据复制过程中锁定原始目录或文件,这可能会导致该过程中所做的更新数据丢失。
变更日志
SeaweedFS 为所有元数据操作生成变更日志,可以进一步用于数据复制和操作审计等功能。不过 JuiceFS 目前还没有实现这个功能。
存储比较
前面提到,SeaweedFS通过卷服务器和主服务器实现数据存储,支持小数据块的“组合存储”和“纠删码”等特性。
另一方面,JuiceFS 依赖对象存储服务进行数据存储,相关特性由用户选择的对象存储提供。
文件分割
SeaweedFS 和 JuiceFS 都将文件拆分成更小的块,然后再将它们持久化到底层数据系统中。SeaweedFS 将文件拆分为 8 MB 的块。对于非常大的文件(超过 8 GB),它还会将块索引保存到底层数据系统。
JuiceFS 首先将文件拆分为 64 MB 的块,这些块进一步划分为 4 MB 的对象。它通过切片的内部概念优化随机写入、顺序读取和重复写入的性能。有关详细信息,请参阅数据处理工作流程。
分层存储
对于新创建的卷,SeaweedFS 在本地存储数据。对于老卷,支持上传到云端,实现冷热数据分离。在这方面,JuiceFS 依赖于外部服务。
数据压缩
JuiceFS 支持对所有写入的数据使用 LZ4 或 ZStandard 进行压缩,而 SeaweedFS 根据文件扩展名和文件类型等因素来决定是否压缩数据。
存储加密
JuiceFS 支持传输中加密和静态加密。当启用静态加密时,用户需要提供一个自我管理的密钥,所有写入的数据都使用这个密钥进行加密。有关详细信息,请参阅数据加密。
SeaweedFS 还支持传输中加密和静态加密。启用数据加密后,写入卷服务器的所有数据都使用随机密钥加密。相应的密钥信息由维护元数据的文件管理器管理。
访问协议比较
POSIX 兼容性
JuiceFS完全兼容 POSIX,而 SeaweedFS 支持与 POSIX 的基本兼容(参见Issue 1558和Wiki),目前还在完善中。
S3协议
JuiceFS 利用 MinIO S3 网关提供S3 网关功能。它提供与 S3 兼容的 RESTful API,允许用户使用 s3cmd、AWS CLI 和 MinIO Client (mc) 等工具管理存储在 JuiceFS 中的文件,即使直接挂载不方便。
SeaweedFS 支持大约 20 个 S3 API,涵盖读取、写入、搜索和删除请求等常见操作。它还具有针对特定请求(如读取)的扩展功能。有关详细信息,请参阅Amazon-S3-API。
WebDAV协议
JuiceFS 和 SeaweedFS 都支持 WebDAV 协议。
HDFS 兼容性
JuiceFS 提供与 HDFS API 的完全兼容。它支持 Hadoop 2.x 和 Hadoop 3.x,以及 Hadoop 生态系统中的各种组件。
SeaweedFS 提供与 HDFS API 的基本兼容性。它不支持某些操作,如截断、连接、校验和以及扩展属性。
CSI驱动程序
JuiceFS和SeaweedFS都提供了 Kubernetes CSI 驱动,帮助用户在 Kubernetes 生态中使用相应的文件系统。
扩展功能比较
客户端缓存
JuiceFS 提供了多种客户端缓存策略,涵盖元数据和数据缓存。它允许用户根据他们的应用场景进行优化。但是,SeaweedFS 没有客户端缓存功能。
集群数据复制
SeaweedFS 支持 Active-Active 和 Active-Passive 两种异步复制模式,用于多个集群之间的数据复制。这些模式通过应用带有签名的变更日志来防止重复修改,从而确保不同集群数据之间的一致性。在超过两个集群节点的Active-Active模式下,SeaweedFS对目录重命名等操作有一定的限制。
JuiceFS 本身不支持集群间的数据复制。它依赖于元数据引擎和对象存储本身的数据复制能力。
基于云的数据缓存
SeaweedFS 可用作基于云的对象存储的缓存,并支持通过命令手动缓存预热。修改后的缓存数据异步同步回对象存储。
JuiceFS 将文件分块存储在对象存储中,不对对象存储中已有的数据提供缓存加速。
垃圾
JuiceFS 默认开启Trash功能,自动将删除的文件移至 JuiceFS 根目录下的“.trash”目录,并保留指定时间后永久删除。
但是,SeaweedFS 不支持此功能。
运维工具
JuiceFS 提供了juicefs stats和juicefs profile子命令,允许用户查看特定时间段的实时性能指标和回放性能指标。此外,JuiceFS 提供了一个指标接口,可以方便地将监控数据与 Prometheus 和 Grafana 集成。
SeaweedFS 实现了Push 和 Pull方法来与 Prometheus 和 Grafana 集成。它还提供了用于执行各种维护任务的交互式工具weed shell,例如检查当前集群状态和列出文件目录。
其他比较
-
从发布日期来看,SeaweedFS 于 2015 年 4 月发布,目前已积累 域名 star,而 JuiceFS 于 2021 年 1 月发布开源版本,截至目前已积累 域名 star。
-
JuiceFS 和 SeaweedFS 均采用 Apache License 2.0,对商业用途友好。SeaweedFS 主要由 Chris Lu 个人维护,而 JuiceFS 主要由 Juicedata 公司维护。
-
JuiceFS 和 SeaweedFS 都是使用 Go 编程语言实现的。
作为结论的比较表
SeaweedFS |
JuiceFS |
|
Metadata engine |
Multi-engine |
Multi-engine |
Atomicity of metadata operations |
Not guaranteed |
Guaranteed through database transactions |
Changelogs |
Yes |
No |
Data storage |
Included |
Reliance on external services |
Code correction |
Supported |
Reliance on external services |
Data merge |
Supported |
Reliance on external services |
File splitting |
8 MB |
64 MB + 4 MB |
Tiered storage |
Supported |
Reliance on external services |
Data compression |
Supported (extension-based) |
Supported (global settings) |
Storage encryption |
Supported |
Supported |
POSIX compatibility |
Basic |
Full |
S3 protocol |
Basic |
Basic |
WebDAV protocol |
Supported |
Supported |
HDFS compatibility |
Basic |
Full |
CSI driver |
Supported |
Supported |
Client cache |
Not supported |
Supported |
Cluster data replication |
Bidirectional asynchronous, multi-mode |
Not supported |
Cloud-based data caching |
Supported(manual synchronization) |
Not supported |
Trash |
Not supported |
Supported |
Operation and maintenance tools |
Provided |
Provided |
Release date |
April 2015 |
January 2021 |
Maintainer |
Individually (Chris Lu) |
By company (Juicedata) |
Language |
Go |
Go |
Open source protocol |
Apache License 2.0 |
Apache License 2.0 |