1 Star 0 Fork 38

hornsey / JuiceFS

forked from Juicedata / JuiceFS 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README_CN.md 12.58 KB
一键复制 编辑 原始数据 按行查看 历史

JuiceFS Logo

Build Status Join Slack Go Report English Docs

JuiceFS 是一个建立在 Redis 和 S3 等对象存储之上的开源 POSIX 文件系统。它是为云原生环境设计,通过把元数据和数据分别持久化到 Redis 和对象存储中,它相当于一个无状态的中间件,帮助各种应用通过标准的文件系统接口来共享数据。

主要特性有:

  • 完整 POSIX 兼容:已有应用可以无缝对接,参考 pjdfstest 测试结果
  • 完整 Hadoop 兼容:JuiceFS Hadoop Java SDK 同时兼容 Hadoop 2.x 以及 Hadoop 3.x 环境,以及 Hadoop 生态中的各种主流组件。
  • S3 兼容:JuiceFS S3 网关提供与 S3 协议兼容的访问接口;
  • 极致的性能:毫秒级的延迟,近乎无限的吞吐量(取决于对象存储规模),查看性能测试结果
  • 云原生:通过 Kubernetes CSI driver 可以很便捷地在 Kubernetes 中使用 JuiceFS;
  • 共享:可以被上千客户端同时读写,方便数据共享。

除此之外,JuiceFS 还具有其它一些特性:

  • 文件锁:支持 BSD 锁(flock)及 POSIX 锁(fcntl);
  • 数据压缩:支持使用 LZ4 或者 Zstandard 压缩数据,节省存储空间;
  • 数据加密: 支持传输中加密(encryption in transit)以及静态加密(encryption at rest),请查看这个文档了解更多信息。

架构 | 开始使用 | 运维管理 | POSIX 兼容性 | 性能测试 | 支持的对象存储 | 状态 | 产品路线图 | 反馈问题 | 贡献 | 社区 | 使用量收集 | 开源协议 | 致谢 | FAQ


架构

JuiceFS 使用 Redis 来存储文件系统的元数据。Redis 是一个开源的内存数据库,可以保障元数据的高性能访问。所有文件的数据会通过客户端存储到对象存储中,以下是它的架构图:

JuiceFS Architecture

JuiceFS 中的文件格式,如下图所示。一个文件首先被拆分成固定大小的 "Chunk",默认 64 MiB。每个 Chunk 可以由一个或者多个 "Slice" 组成,它们是变长的。对于每一个 Slice,又会被拆分成固定大小的 "Block",默认为 4 MiB(格式化后就不可以修改)。最后,这些 Block 会被压缩和加密保存到对象存储中。压缩和加密都是可选的。

JuiceFS Storage Format

开始使用

预编译版本

你可以直接下载预编译的版本:二进制版本

从源代码编译

你需要先安装 Go 1.14+ 以及 GCC 5.4+,然后通过下面的方式来编译:

$ git clone https://github.com/juicedata/juicefs.git
$ cd juicefs
$ make

对于中国用户,建议设置 GOPROXY 到更快的镜像以加速编译,比如 Goproxy 中国

依赖

需要 Redis(2.8 及以上)服务器来存储元数据,请参考 Redis Quick Start

如果是 macOS 系统,还需要 macFUSE

还需要一个对象存储,测试时可以用本地目录代替。

格式化

假定你已经有一个本地运行的 Redis 服务,下面用它来格式化一个叫做 test 的文件系统:

$ ./juicefs format localhost test

它会使用默认参数来格式化。如果 Redis 服务不在本地,你可以像这样完整填写它的地址:redis://username:password@host:6379/1。Redis 密码可以通过环境变量 REDIS_PASSWORD 来指定,避免暴露在命令行选项中。

注意:Redis 6.0.0 版本以后 AUTH 命令支持两个参数,也就是 username 和 password。如果你使用的 Redis 版本小于 6.0.0,省略 URL 中的 username 参数即可,例如 redis://:password@host:6379/1

JuiceFS 还需要一个对象存储,可以通过参数 --storage--bucket--access-key--secret-key 来指定。它默认会使用本地目录来模拟一个对象存储用于测试,详细的参数请看 ./juicefs format -h

关于各种对象存储如何设置的详细介绍,请查看这个文档

挂载

一旦文件系统格式化好了,你可以把它挂载成一个目录,这个目录叫做 挂载点

$ ./juicefs mount -d localhost ~/jfs

挂载之后你可以像使用本地盘一样使用它,详细的挂载参数,请运行 ./juicefs mount -h

如果你希望开机自动挂载 JuiceFS,请查看这个文档

命令索引

请点击这里查看所有子命令以及命令行参数。

Kubernetes

在 Kubernetes 中使用 JuiceFS 非常便捷,请查看这个文档了解更多信息。

Hadoop Java SDK

JuiceFS 使用 Hadoop Java SDK 与 Hadoop 生态结合。

运维管理

POSIX 兼容性测试

JuiceFS 通过了 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

除了 pjdfstests 覆盖的那些 POSIX 特性外,JuiceFS 还支持:

  • 关闭再打开数据一致性。一旦一个文件写入完成并关闭,之后的打开和读操作就可以访问之前写入的数据。如果是在同一个挂载点,所有写入的数据都可以立即读。
  • 重命名以及所有其他元数据操作都是原子的,由 Redis 的事务机制保证。
  • 当文件被删除后,同一个挂载点上如果已经打开了,文件还可以继续访问。
  • 支持 mmap
  • 支持 fallocate 以及空洞
  • 支持扩展属性
  • 支持 BSD 锁(flock)
  • 支持 POSIX 记录锁(fcntl)

性能测试

基础性能测试

JuiceFS 提供一个性能测试的子命令来帮助你了解它在你的环境中的性能表现:

$ ./juicefs bench /jfs
Written a big file (1024.00 MiB): (113.67 MiB/s)
Read a big file (1024.00 MiB): (127.12 MiB/s)
Written 100 small files (102.40 KiB): 151.7 files/s, 6.6 ms for each file
Read 100 small files (102.40 KiB): 692.1 files/s, 1.4 ms for each file
Stated 100 files: 584.2 files/s, 1.7 ms for each file
FUSE operation: 19333, avg: 0.3 ms
Update meta: 436, avg: 1.4 ms
Put object: 356, avg: 4.8 ms
Get object first byte: 308, avg: 0.2 ms
Delete object: 356, avg: 0.2 ms
Used: 23.4s, CPU: 69.1%, MEM: 147.0 MiB

顺序读写性能

使用 fio 测试了 JuiceFS、EFSS3FS 的顺序读写性能,结果如下:

Sequential Read Write Benchmark

上图显示 JuiceFS 可以比其他两者提供 10 倍以上的吞吐,详细结果请看这里

元数据性能

使用 mdtest 测试了 JuiceFS、EFSS3FS 的元数据性能,结果如下:

Metadata Benchmark

上图显示 JuiceFS 的元数据性能显著优于其他两个,详细的测试报告请看这里

性能分析

在文件系统的根目录有一个叫做 .accesslog 的虚拟文件,它提供了所有文件系统操作的细节,以及所消耗的时间,比如:

$ cat /jfs/.accesslog
2021.01.15 08:26:11.003330 [uid:0,gid:0,pid:4403] write (17669,8666,4993160): OK <0.000010>
2021.01.15 08:26:11.003473 [uid:0,gid:0,pid:4403] write (17675,198,997439): OK <0.000014>
2021.01.15 08:26:11.003616 [uid:0,gid:0,pid:4403] write (17666,390,951582): OK <0.000006>

每一行的最后一个数字是该操作所消耗的时间,单位是秒。你可以直接利用它来分析各种性能问题,或者尝试 ./juicefs profile /jfs 命令实时监控统计信息。欲进一步了解此子命令请运行 ./juicefs profile -h 或参阅这里

支持的对象存储

  • 亚马逊 S3
  • 谷歌云存储
  • 微软云存储
  • 阿里云 OSS
  • 腾讯云 COS
  • 青云 QingStor 对象存储
  • Ceph RGW
  • MinIO
  • 本地目录
  • Redis

完整的支持列表,请参照这个文档

状态

JuiceFS 目前是 beta 状态,核心的存储格式还没有完全确定,还不建议使用到生产环境中。如果你对它有兴趣,请尽早测试,并给我们反馈。

产品路线图

  • 稳定存储格式
  • 支持其他数据库

反馈问题

我们使用 GitHub Issues 来管理社区反馈的问题,你也可以通过其他渠道跟社区联系。

贡献

感谢你的兴趣,请参考 CONTRIBUTING.md

社区

欢迎加入 DiscussionsSlack 频道跟我们的团队和其他社区成员交流。

使用量收集

JuiceFS 的客户端会收集 匿名 使用数据来帮助我们更好地了解大家如何使用它,它只上报诸如版本号等使用量数据,不包含任何用户信息,完整的代码在这里

你也可以通过下面的方式禁用它:

$ ./juicefs mount --no-usage-report

开源协议

使用 GNU AGPL v3.0 开源,详见 LICENSE

致谢

JuiceFS 的设计参考了 Google File SystemHDFS 以及 MooseFS,感谢他们的杰出工作。

FAQ

为什么不支持某个对象存储?

已经支持了绝大部分对象存储,参考这个列表。如果它跟 S3 兼容的话,也可以当成 S3 来使用。否则,请创建一个 issue 来增加支持。

是否可以使用 Redis 集群版?

不可以。JuiceFS 使用了 Redis 的事务功能来保证元数据操作的原子性,而分布式版还不支持分布式事务。哨兵节点或者其他的 Redis 高可用方法是需要的。

请查看「Redis 最佳实践」了解更多信息。

JuiceFS 与 XXX 的区别是什么?

请查看「与其它项目比较」文档了解更多信息。

更多 FAQ 请查看完整列表

1
https://gitee.com/hornsey/JuiceFS.git
git@gitee.com:hornsey/JuiceFS.git
hornsey
JuiceFS
JuiceFS
main

搜索帮助