JuiceFS-开源分布式文件系统入门(一篇就够了)

本文涉及的产品
对象存储 OSS,20GB 3个月
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
对象存储 OSS,恶意文件检测 1000次 1年
简介: 讲解JuiceFS的一些概念、架构以及实操的案例

01 引言

在这里插入图片描述
JuiceFS 是一款开源的分布式文件系统,它为云环境设计,兼容 POSIXHDFSS3 协议的分布式文件系统。

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)
数据压缩 支持 LZ4Zstandard 压缩算法,节省存储空间

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 客户端) 协调对象存储和元数据存储引擎,以及 POSIXHadoopKubernetes CSI DriverS3 Gateway 等文件系统接口的实现
Metada Engine(元数据引擎) 存储数据对应的元数据(metadata)包含文件名、文件大小、权限组、创建修改时间和目录结构,支持 RedisMySQLTiKV 等多种引擎;
Data Storage(数据存储) 存储数据本身,支持本地磁盘、公有云或私有云对象存储、HDFS 等介质;

这里主要讲下JuiceFSClient客户端层面文件系统接口的技术实现:

  • 通过 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)

  1. 每个 Chunk 由一个或多个 "Slice" 组成,Slice 的长度不固定,取决于文件写入的方式;
  2. 每个 Slice 又会被进一步拆分成固定大小的 "Block"(默认为 4 MiB);
  3. 最后,这些 Block 会被存储到对象存储;
  4. 同时,JuiceFS 会将每个文件以及它的 ChunksSlicesBlocks 等元数据信息存储在元数据引擎中。

在这里插入图片描述
文件最终会被拆分成 Chunks、Slices 和 Blocks 存储在对象存储,存储桶中只有一个 chunks 目录和一堆数字编号的目录和文件,如下图:
在这里插入图片描述

04 JuiceFS实战

step1: 客户端安装

去Github下载最新的客户端:https://github.com/juicedata/juicefs/releases

注意版本与操作系统的对应关系如下:

版本 系统
juicefs-x.x.x-darwin-amd64.tar.gz 面向 Intel 芯片的 macOS 系统
juicefs-x.x.x-darwin-arm64.tar.gz 面向 M1 系列芯片的 macOS 系统
juicefs-x.x.x-linux-amd64.tar.gz 面向 x86 架构 Linux 发行版
juicefs-x.x.x-linux-arm64.tar.gz 面向 ARM 架构的 Linux 发行版
juicefs-x.x.x-windows-amd64.tar.gz 面向 x86 架构的 Windows 系统
juicefs-hadoop-x.x.x-amd64.jar 面向 x86 架构的 Hadoop Java SDK(同时支持 Linux、macOS 及 Windows 系统)
如果assets资源文件里面没有内容,加载不出来,可以通过来查询下载资源的地址https://api.github.com/repos/juicedata/juicefs/releases/latest

在这里插入图片描述


当然也可以使用命令安装,会根据硬件架构自动下载安装最新版 JuiceFS 客户端:

curl -sSL https://d.juicefs.com/install | sh -

在这里插入图片描述
下载完成后,解压,使用命令:

juicefs version

在这里插入图片描述
可以看到已经安装好了。

step2: 创建文件系统

创建名为 miniofs 的文件系统,使用 Redis1 号数据库存储元数据:

juicefs format \
    --storage minio \
    --bucket http://endpoint地址:端口/rtc \
    --access-key minio的access-key \
    --secret-key minio的secret-key \
    "redis://:redis密码@redis地址:redis端口/数据库编号" \
    miniofs

在这里插入图片描述


在Redis数据库,可以看到key为settings的内容如下:
在这里插入图片描述


同时登录MinIO,在buck1桶下,可以看到创建了一些目录:
在这里插入图片描述

step3: 挂载文件系统

我们可以挂载文件目录到本地的桌面的data目录(如果提示没有权限,建议命令前加上sudo):

juicefs mount  "redis://:redis密码@redis地址:redis端口/数据库编号" /桌面地址/data

在这里插入图片描述
可以看到报错了,提示:

juicefs[89168] : fuse: fuse: no FUSE mount utility found [mount_unix.go:184]

这是由于系统没有安装FUSE 模块模块,所以需要下载安装,macOS系统下载地址:https://osxfuse.github.io/

安装好后,继续执行命令,也报错了,提示:

juicefs[92350] : The mount point is not ready in 10 seconds, exit it [mount_unix.go:56]

解决方式,打开安全性与隐私,解锁后,点击下图红框的运行。
在这里插入图片描述

继续执行命令,可以看到挂载成功了:
在这里插入图片描述

step4: 开始使用

详细使用参考: https://www.juicefs.com/docs/zh/community/guide/sync/

JuiceFS挂载好之后,我们可以正式的使用JuiceFS了,下面举个例子,使用同步命令,把MinIO里面的内容同步到本地的桌面的data目录,命令如下:

juicefs sync [command options] 源端地址 目的端地址
MinIO的地址格式为: minio://[ACCESS_KEY:SECRET_KEY[:TOKEN]@]ENDPOINT/BUCKET[/PREFIX]

示例如下:
在这里插入图片描述

我们打开指定的同步目录的上一级,可以看到产生了两个文件:
在这里插入图片描述
进去datauser看(其中user是桶下面的根目录名称),可以看到数据下载下来了。
在这里插入图片描述
进入dataminiofs看看,可以看到元数据也同步下来了:
在这里插入图片描述

对应MinIO桶的根目录下也有两个文件夹:
在这里插入图片描述

05 总结

5.1 命令总结

上面举例的是只使用了JuiceFS的同步(sync)命令,如果想要知道更多的JuiceFS相关的命令,可以使用--help来搜索,整理如下:

用法juicefs [全局可选参数] command [命令选项] [命令参数...]

分类 命令 描述
全局可选参数 --verbose, --debug, -v 允许 debug 日志 (默认: false)
--quiet, -q 仅展示告警和错误 (默认: false)
--trace 允许 trace 日志 (默认: false)
--no-agent 禁止 pprof (:6060) 和 gops (:6070)代理 (默认: false)
--pyroscope value pyroscope地址
--no-color 禁止打印有颜色 (默认: false)
--help, -h 显示帮助 (默认: false)
--version, -V 打印版本 (默认: false)
命令选项 format 格式化目录卷
config 修改目录卷配置
destroy 销毁已存在的目录卷
gc 数据存储中对象的垃圾收集器
fsck 检查卷的一致性
dump 将元数据转储到JSON文件中
load 从以前转储的JSON文件加载元数据
version 展示版本
status 显示卷状态
stats 显示juicefs的实时性能统计信息
profile 显示在JuiceFS中完成的操作分析
info 显示路径或索引节点的内部信息
mount 挂载卷
umount 卸载卷
gateway 启动一个兼容s3的网关
webdav 启动WebDAV服务器
bench 在路径上运行基准测试
objbench 在对象存储上运行基准测试
warmup 为目标目录/文件构建缓存
rmr 递归删除目录
sync 两个对象存储之间的同步

5.2 常见错误总结

常见的错误,官网已经记录下来了,可以参考:https://www.juicefs.com/docs/zh/community/faq/

5.3 更多的使用案例

可以参考:

06 文末

本文主要讲解了JuiceFS的一些概念、架构以及实操的案例,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
消息中间件 Kafka Apache
Apache Flink 是一个开源的分布式流处理框架
Apache Flink 是一个开源的分布式流处理框架
484 5
|
2月前
|
消息中间件 关系型数据库 MySQL
分布式事物-全面详解(学习总结---从入门到深化)
分布式事物-全面详解(学习总结---从入门到深化)
1471 0
|
2月前
|
消息中间件 Dubbo 应用服务中间件
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
79 0
|
3月前
|
消息中间件 RocketMQ 微服务
分布式事物【库存微服务业务层实现、实现充值微服务、充值微服务之业务层实现、账户微服务之业务层实现】(九)-全面详解(学习总结---从入门到深化)(下)
分布式事物【库存微服务业务层实现、实现充值微服务、充值微服务之业务层实现、账户微服务之业务层实现】(九)-全面详解(学习总结---从入门到深化)
37 0
|
19天前
|
Docker 容器 关系型数据库
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
本期课程将于4月11日19:00开始直播,内容包括源码编译基础知识和实践操作,课程目标是使学员掌握源码编译部署技能,为未来发展奠定基础,期待大家在课程中取得丰富的学习成果!
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
|
2月前
|
Java 数据库连接 API
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
61 0
|
2月前
|
存储 Oracle 关系型数据库
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
45 0
|
3月前
|
NoSQL 中间件 API
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)(下)
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)
82 2
|
Dubbo 应用服务中间件 微服务
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)(上)
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
47 1
|
4天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架

热门文章

最新文章