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 哟! (00✿)