juicedata/juicefs
GitHub: juicedata/juicefs
JuiceFS 是一款基于对象存储和独立元数据引擎的高性能分布式 POSIX 文件系统,为云原生环境提供强一致性的共享存储解决方案。
Stars: 13318 | Forks: 1177
**JuiceFS** 是一款基于 Apache License 2.0 协议发布的高性能 [POSIX](https://en.wikipedia.org/wiki/POSIX) 文件系统,专为云原生环境设计。通过 JuiceFS 存储的数据将被持久化到对象存储(Object Storage)*(例如 Amazon S3)* 中,而对应的元数据则可以根据场景和需求持久化到 Redis、MySQL 和 TiKV 等多种兼容的数据库引擎中。
借助 JuiceFS,海量云存储可以直接连接到大数据、机器学习、人工智能以及生产环境中的各种应用平台。无需修改代码,即可像使用本地存储一样高效地使用海量云存储。
📖 **文档**:[快速入门指南](https://juicefs.com/docs/community/quick_start_guide)
## 核心特性
1. **完全兼容 POSIX**:像本地文件系统一样使用,与现有应用无缝对接,不破坏业务工作流。
2. **完全兼容 Hadoop**:JuiceFS 的 [Hadoop Java SDK](https://juicefs.com/docs/community/hadoop_java_sdk) 兼容 Hadoop 2.x 和 Hadoop 3.x 以及 Hadoop 生态系统中的多种组件。
3. **兼容 S3**:JuiceFS 的 [S3 网关](https://juicefs.com/docs/community/s3_gateway) 提供兼容 S3 的接口。
4. **云原生**:提供 [Kubernetes CSI 驱动](https://juicefs.com/docs/community/how_to_use_on_kubernetes),便于在 Kubernetes 中使用 JuiceFS。
5. **可共享**:JuiceFS 是一种共享文件存储,可供成千上万的客户端进行读写。
6. **强一致性**:确认的修改将在所有挂载了同一文件系统的服务器上立即可见。
7. **卓越性能**:延迟可低至几毫秒,吞吐量几乎可以无限扩展*(取决于对象存储的容量)*。[测试结果](https://juicefs.com/docs/community/benchmark)
8. **数据加密**:支持传输中和静态数据加密(详情请参阅[指南](https://juicefs.com/docs/community/security/encrypt))。
9. **全局文件锁**:JuiceFS 同时支持 BSD 锁(flock)和 POSIX 记录锁(fcntl)。
10. **数据压缩**:JuiceFS 支持 [LZ4](https://lz4.github.io/lz4) 或 [Zstandard](https://facebook.github.io/zstd) 来压缩您的所有数据。
[架构](#architecture) | [快速开始](#getting-started) | [进阶主题](#advanced-topics) | [POSIX 兼容性](#posix-compatibility) | [性能基准测试](#performance-benchmark) | [支持的对象存储](#supported-object-storage) | [谁在使用](#who-is-using) | [路线图](#roadmap) | [报告问题](#reporting-issues) | [社区贡献](#contributing) | [社区](#community) | [使用情况追踪](#usage-tracking) | [许可证](#license) | [致谢](#credits) | [常见问题](#faq)
## 架构
JuiceFS 由三个部分组成:
1. **JuiceFS Client**:协调对象存储和元数据存储引擎,并实现 POSIX、Hadoop、Kubernetes 和 S3 网关等文件系统接口。
2. **数据存储(Data Storage)**:存储数据,支持多种数据存储介质,例如本地磁盘、公有云或私有云对象存储以及 HDFS。
3. **元数据引擎(Metadata Engine)**:存储相应的元数据,包含文件名、文件大小、权限组、创建和修改时间以及目录结构等信息,支持 Redis、MySQL、SQLite 和 TiKV 等不同的元数据引擎。

JuiceFS 可以将文件系统的元数据存储在不同的元数据引擎中,例如 Redis,它是一个快速、开源的内存键值数据存储,特别适合存储元数据;同时,所有数据将通过 JuiceFS 客户端存储在对象存储中。[了解更多](https://juicefs.com/docs/community/architecture)

存储在 JuiceFS 中的每个文件都被按固定大小分割成 **"Chunk"**,默认上限为 64 MiB。每个 Chunk 由一个或多个 **"Slice"** 组成,切片的长度取决于文件的写入方式。每个切片由固定大小的 **"Block"** 组成,默认为 4 MiB。这些 Block 最终会被存储在对象存储中;同时,文件及其 Chunk、Slice 和 Block 的元数据信息将通过 JuiceFS 存储在元数据引擎中。[了解更多](https://juicefs.com/docs/community/architecture/#how-juicefs-store-files)

在使用 JuiceFS 时,文件最终会被拆分为 Chunk、Slice 和 Block 并存储在对象存储中。因此,在对象存储平台的文件浏览器中找不到存储在 JuiceFS 中的源文件;相反,存储桶(bucket)中只有一个 chunks 目录和一堆数字编号的目录和文件。别慌!这正是 JuiceFS 高性能运行的秘密!
## 快速开始
在开始之前,请确保您具备以下条件:
1. 一个受支持的元数据引擎,请参阅[如何设置元数据引擎](https://juicefs.com/docs/community/databases_for_metadata)
2. 一个用于存储数据块的受支持的对象存储,请参阅[支持的对象存储](https://juicefs.com/docs/community/how_to_setup_object_storage)
3. 下载并安装 [JuiceFS 客户端](https://juicefs.com/docs/community/installation)
请参考[快速入门指南](https://juicefs.com/docs/community/quick_start_guide)立即开始使用 JuiceFS!
### 命令参考
在[命令参考](https://juicefs.com/docs/community/command_reference)中查看所有命令行选项。
### 容器
JuiceFS 可以作为 Docker 和 Podman 的持久化卷使用,详情请查看[这里](https://juicefs.com/docs/community/juicefs_on_docker)。
### Kubernetes
在 Kubernetes 上使用 JuiceFS 也非常容易。请在[这里](https://juicefs.com/docs/community/how_to_use_on_kubernetes)查找更多信息。
### Hadoop Java SDK
如果您想在 Hadoop 中使用 JuiceFS,请查看 [Hadoop Java SDK](https://juicefs.com/docs/community/hadoop_java_sdk)。
## 进阶主题
- [Redis 最佳实践](https://juicefs.com/docs/community/redis_best_practices)
- [如何设置对象存储](https://juicefs.com/docs/community/how_to_setup_object_storage)
- [缓存](https://juicefs.com/docs/community/cache)
- [故障诊断与分析](https://juicefs.com/docs/community/fault_diagnosis_and_analysis)
- [FUSE 挂载选项](https://juicefs.com/docs/community/fuse_mount_options)
- [在 Windows 上使用 JuiceFS](https://juicefs.com/docs/community/installation#windows)
- [S3 网关](https://juicefs.com/docs/community/s3_gateway)
更多信息请参考 [JuiceFS 文档中心](https://juicefs.com/docs/community/introduction)。
## POSIX 兼容性
JuiceFS 已通过最新 [pjdfstest](https://github.com/pjd/pjdfstest) 中的所有兼容性测试(共 8813 项)。
```
All tests successful.
Test Summary Report
-------------------
/root/soft/pjdfstest/tests/chown/00.t (Wstat: 0 Tests: 1323 Failed: 0)
TODO passed: 693, 697, 708-709, 714-715, 729, 733
Files=235, Tests=8813, 233 wallclock secs ( 2.77 usr 0.38 sys + 2.57 cusr 3.93 csys = 9.65 CPU)
Result: PASS
```
除了 pjdfstest 覆盖的 POSIX 特性外,JuiceFS 还提供:
- **关闭到打开一致性**。一旦文件被写入*并*关闭,在随后的任何客户端打开和读取中,都能保证看到写入的数据。在同一个挂载点内,所有写入的数据都可以被立即读取。
- 重命名和所有其他元数据操作都是原子的,由受支持的元数据引擎事务保证。
- 从同一挂载点取消链接后,已打开的文件仍可访问。
- Mmap(已通过 FSx 测试)。
- 支持 punch hole 的 Fallocate。
- 扩展属性(xattr)。
- BSD 锁(flock)。
- POSIX 记录锁(fcntl)。
## 性能基准测试
### 基本测试
JuiceFS 提供了一个子命令,可以运行一些基本测试来帮助您了解它在您的环境中的工作情况:

### 吞吐量
使用 [fio](https://github.com/axboe/fio) 对 JuiceFS、[EFS](https://aws.amazon.com/efs) 和 [S3FS](https://github.com/s3fs-fuse/s3fs-fuse) 进行了顺序读写测试。

上面的结果显示,JuiceFS 可以提供比其他两者高 10 倍以上的吞吐量(查看[更多详情](https://juicefs.com/docs/community/fio))。
### 元数据 IOPS
使用 [mdtest](https://github.com/hpc/ior) 对 JuiceFS、[EFS](https://aws.amazon.com/efs) 和 [S3FS](https://github.com/s3fs-fuse/s3fs-fuse) 进行了简单的 mdtest 测试。

结果显示,JuiceFS 可以提供比其他两者显著更高的元数据 IOPS(查看[更多详情](https://juicefs.com/docs/community/mdtest))。
### 分析性能
如果您遇到性能问题,请参阅[实时性能监控](https://juicefs.com/docs/community/fault_diagnosis_and_analysis#performance-monitor)。
## 支持的对象存储
- Amazon S3 *(以及其他兼容 S3 的对象存储服务)*
- Google Cloud Storage
- Azure Blob Storage
- 阿里云对象存储服务(OSS)
- 腾讯云对象存储(COS)
- 七牛云对象存储(Kodo)
- QingStor 对象存储
- Ceph RGW
- MinIO
- 本地磁盘
- Redis
- ...
JuiceFS 支持众多对象存储服务。[了解更多](https://juicefs.com/docs/community/how_to_setup_object_storage#supported-object-storage)。
## 谁在使用
JuiceFS 已具备生产环境可用性,并在生产环境中被数千台机器使用。我们汇总并记录了一份用户列表,请见[这里](https://juicefs.com/docs/community/adopters)。此外,JuiceFS 还有几个与其他开源项目集成的合作项目,记录在[这里](https://juicefs.com/docs/community/integrations)。如果您也在使用 JuiceFS,请随时告诉我们,也欢迎大家分享您的具体使用经验。
存储格式稳定,并将被所有未来版本支持。
## 路线图
- 网关优化
- 断点续传同步
- 预读优化
- 大规模场景优化
- 快照
## 报告问题
我们使用 [GitHub Issues](https://github.com/juicedata/juicefs/issues) 来跟踪社区报告的问题。如有任何疑问,您也可以[联系](#community)社区。
## 使用情况追踪
JuiceFS 默认收集**匿名**使用情况数据,以帮助我们更好地了解社区如何使用 JuiceFS。仅报告核心指标(如版本号),不包括用户数据或任何其他敏感数据。相关代码可以在[这里](pkg/usage/usage.go)查看。
您也可以通过命令行选项 `--no-usage-report` 轻松禁用报告:
```
juicefs mount --no-usage-report
```
## 许可证
JuiceFS 基于 Apache License 2.0 开源,请参阅 [LICENSE](LICENSE)。
## 常见问题
### 为什么 JuiceFS 不支持 XXX 对象存储?
JuiceFS 支持许多对象存储服务。请先查看[此列表](https://juicefs.com/docs/community/how_to_setup_object_storage#supported-object-storage)。如果您想使用的对象存储兼容 S3,您可以将其视为 S3。否则,请尝试报告问题。
### 我可以使用 Redis 集群作为元数据引擎吗?
可以。自 [v1.0.0 Beta3](https://github.com/juicedata/juicefs/releases/tag/v1.0.0-beta3) 起,JuiceFS 支持使用 [Redis 集群](https://redis.io/docs/manual/scaling)作为元数据引擎,但需要注意的是,Redis 集群要求事务中所有操作的键必须位于同一个哈希槽(hash slot)中,因此一个 JuiceFS 文件系统只能使用一个哈希槽。
更多信息请参阅 [“Redis 最佳实践”](https://juicefs.com/docs/community/redis_best_practices)。
### JuiceFS 和 XXX 有什么区别?
更多信息请参阅 [“与其他文件系统的对比”](https://juicefs.com/docs/community/comparison/juicefs_vs_alluxio)。
更多常见问题,请参阅[完整列表](https://juicefs.com/docs/community/faq)。
## Stargazers 趋势
[](https://star-history.com/#juicedata/juicefs&Date)
标签:Apex, EVTX分析, Go语言, Gradle集成, JuiceFS, POSIX, Redis, S3, TiKV, 云存储, 人工智能, 元数据管理, 分布式存储, 分布式文件系统, 大数据, 存储接口, 存储解决方案, 容器存储, 对象存储, 开源, 搜索引擎查询, 数据持久化, 数据湖, 文件存储, 日志审计, 机器学习, 漏洞探索, 用户模式Hook绕过, 目录扫描, 程序破解, 请求拦截