docs/zh_cn/introduction/comparison/juicefs_vs_cephfs.md
两者都是高可靠,高性能的弹性分布式文件系统,且均有良好的 POSIX 兼容性,在各种文件系统使用场景都可一试。
两者都采用了数据和元数据分离的架构,但在组件实现上有很大区别。
是一套完整且独立的系统,倾向于私有云部署;所有数据和元数据都会持久化在 Ceph 自己的存储池(RADOS Pool)中。
kcephfs),用户态客户端(ceph-fuse)以及基于 libcephfs 实现的 C++、Python 等 SDK;近来社区也提供了 Windows 客户端(ceph-dokan)。同时生态中也有与 Samba 对接的 VFS object 和与 NFS-Ganesha 对接的 FSAL 模块可供考虑。JuiceFS 主要实现一个 libjfs 库和 FUSE 客户端程序、Java SDK 等,支持对接多种元数据引擎和对象存储,适合在公有云、私有云或混合云环境下部署。
| CephFS | JuiceFS | |
|---|---|---|
| 文件分块<sup> [1]</sup> | ✓ | ✓ |
| 元数据事务 | ✓ | ✓ |
| 强一致性 | ✓ | ✓ |
| Kubernetes CSI Driver | ✓ | ✓ |
| Hadoop 兼容 | ✓ | ✓ |
| 数据压缩<sup> [2]</sup> | ✓ | ✓ |
| 数据加密<sup> [3]</sup> | ✓ | ✓ |
| 快照 | ✓ | ✕ |
| 客户端数据缓存 | ✕ | ✓ |
| Hadoop 数据本地性 | ✕ | ✓ |
| S3 兼容 | ✕ | ✓ |
| 配额 | 目录级配额 | 目录级配额 |
| 开发语言 | C++ | Go |
| 开源协议 | LGPLv2.1 & LGPLv3 | Apache License 2.0 |
虽然两者都做了大文件的分块,但在实现原理上有本质区别。CephFS 会将文件按 object_size(默认为 4MiB)拆分,每个分块对应一个 RADOS object。而 JuiceFS 则将文件先按 64MiB Chunk 拆分,每个 Chunk 在写入时根据实际情况进一步拆分成一个或多个逻辑 Slice,每个 Slice 在写入对象存储时再拆分成默认 4MiB 的 Block,Block 与对象存储中 object 一一对应。在处理覆盖写时,CephFS 需要直接修改对应的 objects,流程较为复杂;尤其是冗余策略为 EC 或者开启数据压缩时,往往需要先读取部分 object 内容,在内存中修改后再写入,这个流程会带来很大的性能开销。而 JuiceFS 在覆盖写时将更新数据作为新 objects 写入并修改元数据即可,性能大幅提升;此外,过程中出现的冗余数据会异步完成垃圾回收。
严格来讲,CephFS 本身并未提供数据压缩功能,其实际依赖的是 RADOS 层 BlueStore 的压缩。而 JuiceFS 则可以在 Block 上传到对象存储之前就进行一次数据压缩,以减少对象存储中的容量使用。换言之,如果用 JuiceFS 对接 RADOS,是能做到在 Block 进 RADOS 前后各进行一次压缩。另外,就像在文件分块中提到的,出于对覆盖写的性能保障,CephFS 一般不会开启 BlueStore 的压缩功能。
Ceph Messenger v2 支持网络传输层的数据加密,存储层则与压缩类似,依赖于 OSD 创建时提供的加密功能。JuiceFS 是在上传对象前和下载后执行加解密,在对象存储侧完全透明。