SeaweedFS 是一款高效的分布式文件存储体系,最早的规划原型参阅了 Facebook 的 Haystack,具有快速读写小数据块的才能。本文将经过比照 SeaweedFS 与 JuiceFS 在规划与功用上的差异,以协助读者进行更适合自己的挑选。
SeaweedFS 体系结构
SeaweedFS 由 3 部分组成,底层存储文件的 Volume Server,用于办理集群的 Master Server,以及一个向上供给更多特性的 Filer 可选组件。
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 已经包括了核算文件方位(偏移)的一切信息,因而能够高效地将文件的内容读取出来。
Filer
在上述的底层存储单元之上,SeaweedFS 供给了一个名为 Filer 的组件。经过向下对接 Volume Server 与 Master Server,对外供给丰富的功用与特性(如 POSIX 支撑、WebDAV、S3 接口等)。与 JuiceFS 相同,Filer 也需求对接一个外部数据库以保存元数据信息。
为了便利阐述,下文中所指的 SeaweedFS,皆包括了 Filer 组件。
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✿)