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

浅析 SeaweedFS 与 JuiceFS 架构异同相关推荐

  1. 大型网站数据库优化及浅析大型网站的架构

    千万人同时访问的网站,一般是有很多个数据库同时工作,说明白一点就是数据库集群和并发控制,这样的网站实时性也是相对的.这些网站都有一些共同的特点:数据量大,在线人数多,并发请求多,pageview高,响 ...

  2. 浅析云计算的六种架构

    浅析云计算的六种架构 云计算要求基础设施具有良好的弹性.扩展性.自动化.数据移动.多租户.空间效率和对虚拟化的支持.那么,云计算环境下的数据中心基础设施各部分的架构应该是什么样的呢? AD: 云计算要 ...

  3. 浅析云平台底层架构 进行云原生应用开发 系列课程-薛海涛-专题视频课程

    浅析云平台底层架构 进行云原生应用开发 系列课程-2892人已学习 课程介绍         如何依托Bluemix的PaaS服务,开发云原生应用,并深入的讲解cloudfoundry app生命周期 ...

  4. 浅析 vSAN 磁盘组架构和缓存盘的“消亡”

    一.vSAN 中的 DiskGroup 架构的问题与应对思路回顾 如何将分散在多个服务器中的本地盘资源整合成集群范围可用的"共享存储资源池",是超融合架构中的一项关键技术.在 vS ...

  5. 浅析开源数据库MySQL架构

    数据库是所有应用系统的核心,故保证数据库稳定.高效.安全地运行是所有企业日常工作的重中之重.数据库系统一旦出现问题无法提供服务,有可能导致整个系统都无法继续工作.所以,一个成功的数据库架构在高可用设计 ...

  6. 浅析大规模DDOS防御架构:应对T级攻防

    目录 DDOS分类 网络层攻击 应用层攻击 攻击方式 混合型 反射型 流量放大型 脉冲型 链路泛洪 多层防御结构 ISP/WAN层 CDN/Internet层 DC层 链路带宽 不同类型的企业 大型平 ...

  7. b/s结构中ajax技术浅析,B/S架构WEB程序中AJAX异步传输技术的应用研究

    第2 1卷第 6期 2 0 1 3年 1 2月 文章编号: 1 0 0 5- 1 2 2 8 ( 2 0 1 3 ) 0 6- 0 0 4 1- 0 3 电 脑 与 信 息技 术 V o l I 2 ...

  8. 浅析大规模DDOS防御架构-应对T级攻防

    ayazero · 2015/09/18 0:57 文章转载自:www.ayazero.com/?p=75 0x00 导读 0x01 DDOS分类 在讲防御之前简单介绍一下各类攻击,因为DDOS是一类 ...

  9. 浅析低延迟Camera架构

    本文系微信公众号<大话成像>,知乎专栏<all in camera>原创文章,转载请注明出处. 大话成像读者QQ 交流群 :237427716 大话成像技术论坛:www.dah ...

最新文章

  1. 可突破任意ARP防火墙,以限制流量为目标的简单网络管理软件
  2. 企业不要求工程师资格认证_谁说工程师不能成为企业家?
  3. vb子程序未定义怎么改怎么办_提示子程序或函数未定义怎么修改。。。
  4. 资源推荐 | TensorFlow电子书《FIRST CONTACT WITH TENSORFLOW》
  5. 零基础30分钟开启你的快速开发之旅
  6. pC机OracLe库磁盘坏如何恢复,电脑硬盘坏了数据能恢复吗(6步教你自己在家轻松恢复数据)...
  7. FusionCharts 的XML标签属性
  8. 【华为大咖分享】10.DevOps敏捷测试之道(后附PPT下载地址)
  9. 20155332 如何获取新技能+c语言学习调查
  10. Java文件编码自动转换工具类(只改变编码,不会改变文件内容)
  11. JAVA随机抽取一名幸运观众(手动输入观众)小实例
  12. JS实现FlyBird
  13. 本学期数据结构学习总结
  14. linux 延迟 10 ms,网络延迟10ms怎么做到(增加网络延迟软件)
  15. Java注解处理器使用详解
  16. 推荐几个不错的黑科技网站
  17. Flash在线文档阅读器::pdf、doc、docx、xls、xlsx、ppt、pptx、htm、txt、rtf、epub、csv、xdoc等
  18. SpringBoot整合MongoDB实现ResultFul风格接口
  19. C++ 九阴真经之单例模式
  20. ROS启动失败的一个ip错误坑

热门文章

  1. Python基础之基本结构
  2. RPM(软件包管理器)和YUM 软件仓库
  3. 一起打造自己的自动驾驶小车mycar - 4.手柄控制小车移动
  4. linux 内核启动Initramfs与initrd 及其挂载
  5. 计算机毕业设计Java醋坊定制销售平台(源码+系统+mysql数据库+lw文档)
  6. C++ COM组件编写初探
  7. 跨境电商和淘宝哪个好
  8. jdbc是啥?为什么使用jdbc?jdbc的原理是什么?
  9. TopK Question
  10. 在需要密码的情况,卸载symantec endpoint protection 。可以不用密码删除symantec endpoint protection...