1. JuiceFS 概述
JuiceFS 是一个高性能的 POSIX 文件系统,基于 Apache License 2.0 发布,专为云原生环境设计。通过 JuiceFS 存储的数据将持久化在对象存储(例如 Amazon S3)中,而相应的元数据可以根据场景和需求持久化在各种兼容的数据库引擎中,例如 Redis、MySQL 和 TiKV。
JuiceFS 由三部分组成:
- JuiceFS 客户端:协调对象存储和元数据存储引擎,以及实现 POSIX、Hadoop、Kubernetes 和 S3 网关等文件系统接口。
- 数据存储:存储数据,支持各种数据存储介质,例如本地磁盘、公共或私有云对象存储和 HDFS。
- 元数据引擎:存储相应的元数据,其中包含文件名、文件大小、权限组、创建和修改时间以及目录结构等信息,支持不同的元数据引擎,例如 Redis、MySQL、SQLite 和 TiKV。
JuiceFS 可以将文件系统的元数据存储在不同的元数据引擎上,例如 Redis,它是一个快速、开源、内存中的键值数据存储,特别适合存储元数据;同时,所有数据都将通过 JuiceFS 客户端存储在对象存储中。
存储在 JuiceFS 中的每个文件都以固定大小(默认上限为 64 MiB)拆分为“Chunk”。每个 Chunk 由一个或多个“Slice”组成,Slice 的长度根据文件的写入方式而异。每个 Slice 由固定大小的“Block”组成,默认大小为 4 MiB。这些 Block 最终将存储在对象存储中;同时,文件及其 Chunk、Slice 和 Block 的元数据信息将通过 JuiceFS 存储在元数据引擎中。
主要特性:
- 完全 POSIX 兼容:作为本地文件系统使用,与现有应用程序无缝对接,不中断业务流程。
- 完全 Hadoop 兼容:JuiceFS 的 Hadoop Java SDK 兼容 Hadoop 2.x 和 Hadoop 3.x 以及 Hadoop 生态系统中的各种组件。
- S3 兼容:JuiceFS 的 S3 Gateway 提供 S3 兼容接口。
- 云原生:提供 Kubernetes CSI 驱动,便于在 Kubernetes 中使用 JuiceFS。
- 可共享:JuiceFS 是一个共享文件存储,可由数千个客户端读写。
- 强一致性:确认的修改将立即在所有挂载相同文件系统的服务器上可见。
- 卓越性能:延迟可低至几毫秒,吞吐量可近乎无限扩展(取决于对象存储的大小)。
- 数据加密:支持传输中和静态数据加密。
- 全局文件锁:JuiceFS 支持 BSD 锁 (flock) 和 POSIX 记录锁 (fcntl)。
- 数据压缩:JuiceFS 支持 LZ4 或 Zstandard 压缩所有数据。
2. JuiceFS 架构设计与核心代码分析
2.1. 概述
JuiceFS 的核心设计理念是将文件系统的元数据和数据分离存储。元数据存储在各种数据库引擎中(如 Redis, MySQL, TiKV, ETCD 等),而数据则存储在对象存储中(如 S3, Azure Blob, SeaweedFS 等)。这种分离架构使得 JuiceFS 能够充分利用对象存储的弹性伸缩能力和元数据引擎的高性能。