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✿)