01 引言
JuiceFS 是一款开源的分布式文件系统,它为云环境设计,兼容 POSIX
、HDFS
和 S3
协议的分布式文件系统。
02 JuiceFS为何物?
JuiceFS 是一款面向云原生设计的高性能共享文件系统,在 Apache 2.0 开源协议下发布。
2.1 JuiceFS的特点
2.1.1 兼容性
JuiceFS提供完备的 POSIX 兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同时在跨平台、跨地区的不同主机上挂载读写。
2.1.2 丰富的API
JuiceFS 提供了丰富的 API
,适用于各种形式数据的管理、分析、归档、备份,可以在不修改代码的前提下无缝对接大数据、机器学习、人工智能等应用平台,为其提供海量、弹性、低价的高性能存储。
2.1.3 特性总结
特性 | 描述 |
POSIX 兼容 | 本地文件系统一样使用,无缝对接已有应用,无业务侵入性 |
HDFS 兼容 | 完整兼容 HDFS API,提供更强的元数据性能 |
S3 兼容 | 提供 S3 网关实现 S3 协议兼容的访问接口 |
云原生 | 通过 Kubernetes CSI驱动 轻松地在 Kubernetes 中使用 JuiceFS |
分布式设计 | 同一文件系统可在上千台服务器同时挂载,高性能并发读写,共享数据 |
强一致性 | 确认的文件修改会在所有服务器上立即可见,保证强一致性 |
强悍性能 | 毫秒级延迟,近乎无限的吞吐量(取决于对象存储规模) |
数据安全 | 支持传输中加密(encryption in transit)和静态加密(encryption at rest) |
文件锁 | 支持 BSD 锁(flock)和 POSIX 锁(fcntl) |
数据压缩 | 支持 LZ4 和 Zstandard 压缩算法,节省存储空间 |
2.2 不同的使用场景举例
场景一:像本地磁盘一样使用
# 格式化JuiceFS文件系统 > juicefs format redis://your-redis-host:6379/1 myjfs # 挂载JuiceFS文件系统 > juicefs mount -d redis://your-redis-host:6379/1 /mnt/juicefs # 检查挂载点状态 > df -h /mnt/juicefs Filesystem Size Used Avail Capacity iused ifree %iused Mounted on JuiceFS:myjfs 1.0Pi 0Bi 1.0Pi 0% 0 10485760 0% /mnt/juicefs # 从home目录挂载数据集到JuiceFS > cp -r ~/dataset /mnt/juicefs/
场景二:应用开发简单,无需SDK
# Python 例子 path = '/mnt/juicefs/dataset/days.txt' days_file = open(path, 'r') days = days_file.read() new_path = '/mnt/juicefs/new_days.txt' new_days = open(new_path, 'w') title = 'Days of the Week\n' new_days.write(title) print(title) new_days.write(days) print(days) days_file.close() new_days.close()
场景三:最简单,最适合K8S PV
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: web-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 10Pi storageClassName: juicefs-sc --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-run spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: linuxserver/nginx ports: - containerPort: 80 volumeMounts: - mountPath: /config name: web-data volumes: - name: web-data persistentVolumeClaim: claimName: web-pvc
> kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE juicefs-sc csi.juicefs.com Retain Immediate false 88m
场景四:完全兼容 HDFS,使用方法也一样
# Shell > hadoop fs -ls jfs://myjfs # Hive CREATE TABLE IF NOT EXISTS person ( name STRING, age INT ) LOCATION 'jfs://myjfs/tmp/person';
场景五:通过 S3 API 访问 JuiceFS
# 为JuiceFS文件系统开启S3网关 > juicefs gateway redis://localhost:6379/1 localhost:9000 # 通过AWS命令行连接访问JuiceFS文件系统 > aws --endpoint-url http://localhost:9000 s3 ls s3://myjfs
03 JuiceFS技术架构
首先贴出JuiceFS
官网的技术架构图:
3.1 JuiceFS 的三个技术层
从上图,我们可以看到JuiceFS分为了三层,从上往下依次为:
分类 | 描述 |
Client(JuiceFS 客户端) | 协调对象存储和元数据存储引擎,以及 POSIX 、Hadoop 、Kubernetes CSI Driver 、S3 Gateway 等文件系统接口的实现 |
Metada Engine(元数据引擎) | 存储数据对应的元数据(metadata )包含文件名、文件大小、权限组、创建修改时间和目录结构,支持 Redis 、MySQL 、TiKV 等多种引擎; |
Data Storage(数据存储) | 存储数据本身,支持本地磁盘、公有云或私有云对象存储、HDFS 等介质; |
这里主要讲下JuiceFS在 Client客户端层面
的文件系统接口的技术实现:
- 通过 FUSE,JuiceFS 文件系统能够以 POSIX 兼容的方式挂载到服务器,将海量云端存储直接当做本地存储来使用;
- 通过 Hadoop Java SDK,JuiceFS 文件系统能够直接替代 HDFS,为 Hadoop 提供低成本的海量存储;
- 通过 Kubernetes CSI Driver,JuiceFS 文件系统能够直接为 Kubernetes 提供海量存储;
- 通过 S3 Gateway,使用 S3 作为存储层的应用可直接接入,同时可使用 AWS CLI、s3cmd、MinIO client 等工具访问 JuiceFS 文件系统;
- 通过 WebDAV Server,使用 HTTP 协议接入 JuiceFS 并直接操作其中的文件。
3.2 JuiceFS 如何存储文件
任何存入 JuiceFS 的文件都会被拆分成固定大小的 “Chunk
”(默认的容量上限是 64 MiB)
- 每个
Chunk
由一个或多个 “Slice
” 组成,Slice
的长度不固定,取决于文件写入的方式; - 每个
Slice
又会被进一步拆分成固定大小的 “Block
”(默认为 4 MiB); - 最后,这些
Block
会被存储到对象存储; - 同时,JuiceFS 会将每个文件以及它的
Chunks
、Slices
、Blocks
等元数据信息存储在元数据引擎中。
文件最终会被拆分成 Chunks、Slices 和 Blocks 存储在对象存储,存储桶中只有一个 chunks 目录和一堆数字编号的目录和文件,如下图: