docs/zh_cn/introduction/comparison/juicefs_vs_seaweedfs.md
SeaweedFS 与 JuiceFS 皆是开源的高性能分布式文件存储系统,但二者存在诸多设计区别与功能差异,本章将会详述他们的区别和各自适用场景,帮助你的团队进行技术选型。
SeaweedFS 和 JuiceFS 都采用了对商用更友好的 Apache License 2.0,但 JuiceFS 分为社区版和企业版,企业版提供多种交付形式,例如私有部署和云服务。JuiceFS 企业版使用自研的闭源元数据引擎,其客户端则与社区版大量共享代码。你可以通过下表速查两者的关键特性对比,然后在本文中选取感兴趣的话题详细阅读。
| 对比项 | 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 |
系统由 3 部分组成:
Volume Server 与 Master Server 一并构成文件存储服务:
在读写数据时,SeaweedFS 的实现与 Haystack 相似,用户创建的文件系统(Volume)实际上是一个大磁盘文件,也就是下图的 Superblock。在此 Volume 中,用户写入的所有文件都会被合并到该大磁盘文件中,借用 Haystack 的术语,每一个文件都是“一根针”,needle。
SeaweedFS 中数据写入和读取流程:
在上述的底层存储服务之上,SeaweedFS 提供了一个名为 Filer 的组件,他对接 Volume Server 与 Master Server,对外提供丰富的功能与特性,如 POSIX 支持、WebDAV、S3 API。与 JuiceFS 相同,Filer 也需要对接一个外部数据库以保存元数据信息。
JuiceFS 采用元数据与数据分离存储的架构:
客户端连接元数据引擎获取元数据服务,然后将实际数据写入对象存储,实现强一致性分布式文件系统。
JuiceFS 的架构在「技术架构」有更详细的介绍。
SeaweedFS 与 JuiceFS 都支持通过外部数据库以存储文件系统的元数据信息:
rename 操作时启用了部分数据库(SQL、ArangoDB 和 TiKV)的事务,因此对于数据库的事务能力要求较低。同时,由于 SeaweedFS 在 rename 操作中拷贝元数据时,未对原目录或文件进行加锁,高负载下可能造成数据丢失。SeaweedFS 会为所有的元数据操作生成变更日志(changelog),日志可以被传输、重放,保证数据安全的同时,还能用来实现文件系统数据复制、操作审计等功能。
SeaweedFS 支持在多个集群之间进行文件系统数据复制,存在两种异步数据复制模式:
这两种模式都是通过传递 changelog 再应用的机制实现了不同集群数据间的一致性,对于每一条 changelog,其中会有一个签名信息以保证同一个修改不会被循环多次。
JuiceFS 社区版没有实现变更日志,但可以自行使用元数据引擎和对象存储自身的数据复制能力实现文件系统镜像功能,比方说 MySQL 或 Redis 仅支持数据复制,配合上 S3 的复制对象功能,就能脱离 JuiceFS 实现类似 SeaweedFS 的 Active-Passive 模式。
顺带一提,JuiceFS 企业版的元数据引擎也是基于变更日志实现,支持数据复制、镜像文件系统,可以点击对应文档链接以了解更多。
如前文所述,SeaweedFS 的数据存储由 Volume Server + Master Server 实现,支持小数据块的合并存储、纠删码等特性。而 JuiceFS 的数据存储则是依托于对象存储服务服务,相关的特性也都由对象存储提供。
SeaweedFS 与 JuiceFS 都会将文件拆分成若干个小块再持久化到底层的数据系统中:
对于新创建的 Volume,SeaweedFS 会把数据存储在本地,而对于较旧的 Volume,SeaweedFS 支持将他们上传至云端以达到冷热数据的分离。JuiceFS 自身并没有实现分层存储的功能,而是直接使用对象存储提供的分层管理服务,比如 S3 存储类。
JuiceFS 支持使用 LZ4 或者 Zstandard 来为所有写入的数据进行压缩,而 SeaweedFS 则是根据写入文件的扩展名、文件类型等信息来选择是否进行压缩。
二者均支持加密,包括传输中加密及静态加密:
JuiceFS 完全兼容 POSIX,而 SeaweedFS 目前实现了部分的 POSIX 兼容),功能还持续完善中。
JuiceFS 实现了 S3 网关,因此如果有需要,可以通过 S3 API 直接访问文件系统,也能使用 s3cmd、AWS CLI、MinIO Client(mc)等工具直接管理文件系统。
SeaweedFS 当前支持部分 S3 API,覆盖了常用的读写查删等请求,对一些特定的请求(如 Read)还做了功能上的扩展。
JuiceFS 完整兼容 HDFS API。包括 Hadoop 2.x 和 Hadoop 3.x,以及 Hadoop 生态系统中的各种组件。SeaweedFS 则是提供了对 HDFS API 的基础兼容,一些更加高级的操作如如 truncate、concat、checksum 和扩展属性等则尚未支持。
二者均支持 CSI 驱动,详见:
二者均支持 WebDAV 协议,详见:
SeaweedFS 客户端具备简单客户端缓存能力,由于在写作期间未能找到具体文档,可以直接在其源码中搜索 cache 相关字样。
JuiceFS 客户端支持元数据以及数据缓存,提供更丰富的定制空间,允许用户根据自己的应用场景进行调优。
SeaweedFS 可以作为对象存储的网关(Gateway)来使用,可以将对象存储中指定的数据预热到本地,在本地发生的数据修改也会异步同步到对象存储中。
由于 JuiceFS 使用对象存储的方式是将文件进行切分存储,因架构所限,不支持直接作为对象存储的网关或者缓存层。但是在 JuiceFS 企业版,我们开发了单独的功能,为对象存储中已有的数据提供缓存服务,功能类似 SeaweedFS。
JuiceFS 支持并默认开启回收站功能,删除的文件会保留指定的时间才删除,避免数据误删,保证数据安全。SeaweedFS 暂不支持此功能。
二者均提供完善的运维和排查调优方案:
juicefs stats,juicefs profile 来实时观测文件系统性能。也可以通过 metrics API 将监控数据接入到 Prometheus,用 Grafana 进行可视化和监控告警。weed shell 来交互式执行运维工作,例如查看当前集群状态、列举文件列表。SeaweedFS 同时支持 push 和 pull 方式 对接 Prometheus。