SeaweedFS 是一款高效的分布式文件存储体系,最早的规划原型参阅了 Facebook 的 Haystack,具有快速读写小数据块的才能。本文将经过比照 SeaweedFS 与 JuiceFS 在规划与功用上的差异,以协助读者进行更适合自己的挑选。

SeaweedFS 体系结构

SeaweedFS 由 3 部分组成,底层存储文件的 Volume Server,用于办理集群的 Master Server,以及一个向上供给更多特性的 Filer 可选组件。

浅析 SeaweedFS 与 JuiceFS 架构异同

Volume Server 与 Master Server

在体系运作上,Volume Server 与 Master Server 一并服务于文件的存储。Volume Server 专心于数据的写入与读取,而 Master Server 则偏向是一个集群与 Volumes 的办理服务。

在读写数据时,SeaweedFS 的完成与 Haystack 相似,用户创立的一个 Volume 即是一个大磁盘文件(下图的 Superblock)。在此 Volume 中,用户写入的一切文件(下图的 Needle)都会被兼并到该大磁盘文件中。

在开始写入数据之前,调用者需求向 SeaweedFS(Master Server)进行写入恳求,随后 SeaweedFS 会依据当时的数据量回来一个 File ID(由 Volume ID 与 offset 组成),在写入的过程中,一并被写入的还有根底的元数据信息(文件长度与 Chunk 等信息);当写入完结之后,调用者需求在一个外部体系(例如 MySQL)中对该文件与回来的 File ID 进行关联保存。在读取数据时,因为 File ID 已经包括了核算文件方位(偏移)的一切信息,因而能够高效地将文件的内容读取出来。

浅析 SeaweedFS 与 JuiceFS 架构异同

Filer

在上述的底层存储单元之上,SeaweedFS 供给了一个名为 Filer 的组件。经过向下对接 Volume Server 与 Master Server,对外供给丰富的功用与特性(如 POSIX 支撑、WebDAV、S3 接口等)。与 JuiceFS 相同,Filer 也需求对接一个外部数据库以保存元数据信息。

为了便利阐述,下文中所指的 SeaweedFS,皆包括了 Filer 组件。

JuiceFS 体系结构

浅析 SeaweedFS 与 JuiceFS 架构异同

JuiceFS 选用「数据」与「元数据」分离存储的架构,文件数据本身会被切分保存在目标存储(如 Amazon S3)傍边,而元数据则是会被保存在用户自行挑选的数据库里(如 Redis、MySQL)。经过同享同一个份数据库与目标存储,JuiceFS 完成了一个强一致性确保的分布式文件体系,一起还具有「POSIX 彻底兼容」、「高功用」等许多特性。

元数据比照

SeaweedFS 与 JuiceFS 都支撑经过外部数据库以存储文件体系的元数据信息。在数据库支撑层面,SeaweedFS 支撑多达 24 种数据库。 JuiceFS 对数据库业务才能要求高(见下文),当时支撑了 3 类共 10 种业务型数据库。

原子性操作

为了确保一切元数据操作的原子性,JuiceFS 在完成层面需求运用有业务处理才能的数据库。而 SeaweedFS仅在履行 rename 操作时启用了部分数据库(SQL、ArangoDB 和 TiKV)的业务, 关于数据库的业务才能要求较低。一起,因为Seaweed FS 在 rename 操作中仿制元数据时,未对原目录或文件进行加锁,可能会导致过程中更新的数据丢掉。

改变日志(changelog)

SeaweedFS 会为一切的元数据操作生成改变日志,此日志可被进一步用于数据仿制(见下文)、操作审计等功用,而 JuiceFS 则暂未完成此特性。

存储比照

如前文所述,SeaweedFS 的数据存储由 Volume Server + Master Server 完成,支撑小数据块的「兼并存储」、「纠删码」等特性。而 JuiceFS 的数据存储则是依托于目标存储服务服务,相关的特性也都由用户挑选的目标存储供给。

文件拆分

在存储数据时,SeaweedFS 与 JuiceFS 都会将文件拆分红若干个小块再持久化到底层的数据体系中。SeaweedFS 将文件拆分红 8MB 的块,关于超大文件(超越 8GB),它会将 Chunk 索引也保存到底层的数据体系中。而 JuiceFS 则是先拆成 64MB 的 Chunk,再拆成 4MB 的 Object,经过内部一个 Slice 的概念对随机写、次序读、重复写等功用进行了优化。(概况见读取清求处理流程)

分层存储

关于新创立的 Volume,SeaweedFS 会把数据存储在本地,而关于较旧的 Volume,SeaweedFS 支撑将他们上传至云端以达到冷热数据的分离。在此方面,JuiceFS 则需求依靠外部的服务。

数据压缩

JuiceFS 支撑运用 LZ4 或许 ZStandard 来为一切写入的数据进行压缩,而 SeaweedFS 则是依据写入文件的扩展名、文件类型等信息来挑选是否进行压缩。

存储加密

JuiceFS 支撑传输中加密(encryption in transit)及静态加密(encryption at rest),在用户敞开了静态加密时,需求用户传递一个自行办理的密钥,一切写入的数据都会根据此密钥进行数据的加密。概况见 《数据加密》。

SeaweedFS 同样支撑传输中加密与静态加密。在敞开了数据加密后,一切写入 Volume Server 的数据都会运用随机的密钥进行加密,而这些对应的随机密钥信息则由保护「metadata」的「Filer」进行办理。

拜访协议

POSIX 兼容性

JuiceFS 彻底兼容 POSIX, 而 SeaweedFS 现在只完成了部分的 POSIX 兼容(「Issue 1558」 与 Wiki),功用还持续完善中。

S3 协议

JuiceFS 经过 MinIO S3 网关完成了 S3 网关的功用。它为 JuiceFS 中的文件供给跟 S3 兼容的 RESTful API,在不便利挂载的情况下能够用 s3cmd、AWS CLI、MinIO Client(mc)等工具办理 JuiceFS 上存储的文件。

SeaweedFS 当时支撑了约 20 个 S3 API,覆盖了常用的读写查删等恳求,对一些特定的恳求(如 Read)还做了功用上的扩展,详细见 Amazon-S3-API。

WebDAV 协议

JuiceFS 与 SeaweedFS 皆支撑 WebDAV 协议。

HDFS 兼容性

JuiceFS 完好兼容 HDFS API。不只兼容 Hadoop 2.x 和 Hadoop 3.x,还兼容 Hadoop 生态体系中的各种组件。SeaweedFS 则是供给了对 HDFS API 的根底兼容,关于部分操作(如 turncate、concat、checksum 和扩展特点等)则没有支撑。

CSI 驱动

JuiceFS 与 SeaweedFS 皆供给了 「Kubernetes CSI Driver」 以协助用户在 Kubernetes 生态中运用对应的文件体系。

扩展功用

客户端缓存

JuiceFS 有着多种客户端缓存战略,包括从元数据到数据缓存的各个部分,允许用户依据自己的使用场景进行调优(概况),而 SeaweedFS 不具备客户端缓存才能。

集群数据仿制

关于多个集群之间的数据仿制,SeaweedFS 支撑「Active-Active」与「Active-Passive」两种异步的仿制形式,2 种形式都是经过传递 changelog 再使用的机制完成了不同集群数据间的一致性,关于每一条 changelog,其中会有一个签名信息以确保同一个修正不会被循环屡次。在集群节点数量超越 2 个节点的 Active-Active 形式下,SeaweedFS 的一些操作(如重命名目录)会受到一些限制。

JuiceFS 没有原生支撑集群之间的数据同步功用,需求依靠元数据引擎和目标存储本身的数据仿制才能。

云上数据缓存

SeaweedFS 能够作为云上目标存储的缓存来运用,支撑经过指令手动预热数据。关于缓存数据的修正,会异步同步到目标存储中。JuiceFS 需求将文件分块存储到目标存储中,尚不支撑为目标存储中已有的数据供给缓存加速。

回收站

JuiceFS 默认敞开回收站功用,会自动将用户删去的文件移动到 JuiceFS 根目录下的 .trash 目录内,保存指定时刻后才将数据真正清理。 SeaweedFS 暂不支撑此功用。

运维工具

JuiceFS 供给了 juciefs stats 以及 juicefs profile 两种子指令,允许用户实时检查当时或回放某一时刻段的功用指标。一起,JuiceFS 还对外开发 metrics 接口,用户能够便利地将监控数据接入到 Prometheus 与 Grafana 中。

SeaweedFS 则一起完成了 Push 与 Pull 2种方法对接 Prometheus 与Grafana ,一起供给了 weed shell 的交互式工具便利运用者进行一系列运维作业(如检查当时集群状况、列举文件列表等)。

其它

  • 在发布时刻上,SeaweedFS 于 2015 年 4 月发布,现在累计 stars 为 16.4K,而 JuiceFS 于 2021 年 1 月发布,截止现在累计 7.3K stars。

  • 在项目上,JuiceFS 与 SeaweedFS 皆选用了对商用更友爱的 Apache License 2.0,SeaweedFS 主要由 Chris Lu 个人进行保护,而 JuiceFS 则主要由 Juicedata 公司进行保护。

  • JuiceFS 与 SeaweedFS 皆选用 Go 言语进行编写。

比照清单

SeaweedFS JuiceFS
元数据 多引擎 多引擎
元数据操作原子性 未确保 经过数据库业务确保
改变日志
数据存储 包括 外部服务
纠删码 支撑 依靠外部服务
数据兼并 支撑 依靠外部服务
文件拆分 8MB 64MB + 4MB
分层存储 支撑 依靠外部服务
数据压缩 支撑(根据扩展名) 支撑(大局设置)
存储加密 支撑 支撑
POSIX 兼容性 基本 完好
S3 协议 基本 基本
WebDAV 协议 支撑 支撑
HDFS 兼容性 基本 完好
CSI 驱动 支撑 支撑
客户端缓存 不支撑 支撑
集群数据仿制 双向异步、多形式 不支撑
云上数据缓存 支撑(手动同步) 不支撑
回收站 不支撑 支撑
运维工具 供给 供给
发布时刻 2015.4 2021.1
主要保护者 个人(Chris Lu) 公司(Juicedata Inc)
言语 Go Go
开源协议 Apache License 2.0 Apache License 2.0

如有协助的话欢迎重视我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)