一个专为云原生环境设计的高性能分布式文件系统

大家好,今天给大家分享一款开源创新的分布式 POSIX 文件系统JuiceFS,旨在解决海量云存储与各类应用平台(如大数据、机器学习、人工智能等)之间高效对接的问题。

项目介绍

JuiceFS 是一款面向云原生设计的高性能分布式文件系统,在 Apache 2.0 开源协议下发布。提供完备的 POSIX 兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同时在跨平台、跨地区的不同主机上挂载读写。

JuiceFS 提供了丰富的 API,适用于各种形式数据的管理、分析、归档、备份,可以在不修改代码的前提下无缝对接大数据、机器学习、人工智能等应用平台,为其提供海量、弹性、低价的高性能存储。运维人员不用再为可用性、灾难恢复、监控、扩容等工作烦恼,专注于业务开发,提升研发效率。同时运维细节的简化,对 DevOps 极其友好。

核心特点

1.高度兼容性

  • POSIX 兼容:完全兼容 POSIX 标准,这意味着它可以像本地文件系统一样被使用,现有的应用程序无需修改即可无缝对接 JuiceFS,确保了业务工作流的连续性。无论是文件的读写、目录操作还是权限管理等,都与传统 POSIX 文件系统一致,为用户提供了熟悉的操作体验。

  • Hadoop 兼容:其 Hadoop Java SDK 与 Hadoop 2.x 和 3.x 以及 Hadoop 生态系统中的各种组件完美兼容。这使得在大数据处理场景中,JuiceFS 可以作为 Hadoop 的底层存储系统,与 Hive、Spark 等大数据工具无缝集成,为大数据分析和处理提供高效的存储支持。

  • S3 兼容:提供 S3 兼容的接口(S3 Gateway),使得用户可以使用 S3 的 API 来访问 JuiceFS,方便了与基于 S3 接口的现有应用和服务的集成。对于已经熟悉 S3 接口的用户来说,可以快速上手使用 JuiceFS,降低了迁移成本。

2.云原生特性

提供 Kubernetes CSI Driver,这使得在 Kubernetes 容器编排环境中使用 JuiceFS 变得非常容易。用户可以将 JuiceFS 作为持久卷(Persistent Volume)挂载到 Kubernetes 容器中,为容器化应用提供可靠的共享存储,满足容器化应用在数据存储和共享方面的需求,适应云原生应用的快速部署和弹性扩展要求。

3.共享与一致性

  • 可共享性:作为共享文件存储,支持数千个客户端同时进行读写操作。这在多用户、多任务的分布式环境中非常重要,例如在企业内部多个团队共享数据、大规模分布式计算任务中多个节点协同工作等场景下,JuiceFS 能够保证数据的一致性和完整性,提高团队协作效率和计算任务的执行效率。

  • 强一致性:确保对文件系统的修改在所有挂载相同文件系统的服务器上立即可见。这种强一致性保证了数据的实时性和准确性,避免了因数据不一致导致的应用错误或数据冲突问题,特别适用于对数据一致性要求极高的应用场景,如金融交易系统、实时数据处理系统等。

4.性能优势

  • 低延迟与高吞吐量:在性能表现上,JuiceFS 具有出色的低延迟特性,延迟可低至几毫秒,能够快速响应文件操作请求。同时,其吞吐量可以近乎无限扩展(取决于对象存储的大小),在大规模数据读写场景中表现优异。例如,在大数据分析任务中,能够快速读取和处理海量数据,提高数据分析的效率。

  • 高效的缓存机制:通过在客户端和元数据引擎中使用缓存,进一步提升了文件系统的性能。客户端缓存可以加速对常用数据的访问,减少对对象存储的频繁访问,降低网络延迟的影响;元数据引擎缓存则提高了元数据的访问速度,加快了文件操作的响应时间。

5.数据安全与管理

  • 数据加密:支持数据在传输过程和存储时的加密,用户可以选择合适的加密算法来保护数据的安全性。这对于存储敏感数据(如用户隐私数据、企业机密信息等)至关重要,防止数据在网络传输或存储过程中被窃取或篡改。

  • 全局文件锁:支持 BSD 锁(flock)和 POSIX 记录锁(fcntl),用于在多进程或多线程环境中对文件进行并发控制。这确保了在多个客户端同时访问和修改文件时的数据一致性和完整性,避免了文件损坏或数据丢失的风险。

  • 数据压缩:提供数据压缩功能,支持 LZ4 或 Zstandard 等压缩算法,帮助用户节省存储空间,降低存储成本。特别是对于存储大量文本数据、日志文件等可压缩性较高的数据类型,效果显著。

技术架构

JuiceFS 文件系统由三个部分组成:

JuiceFS 客户端:协调对象存储和元数据存储引擎,实现 POSIX、Hadoop、Kubernetes、S3 Gateway 等文件系统接口。

数据存储:支持多种存储介质,如本地磁盘、公有 / 私有云对象存储、HDFS 等存储数据。

元数据引擎:存储文件名、大小、权限组、创建 / 修改时间、目录结构等元数据信息,支持 Redis、MySQL、SQLite、TiKV 等引擎。

JuiceFS 中存储的每个文件以固定大小拆分为 "Chunk",默认上限为 64 MiB。每个Chunk由一个或多个 "Slice" 组成,Slice的长度根据文件的写入方式而变化。每个Slice由大小固定的 "Block" 组成,默认为 4 MiB。这些Block最终会存储在对象存储中;同时,文件的元数据信息及其Chunk、Slice和Block将通过 JuiceFS 存储在元数据引擎中。

应用场景

大数据分析:JuiceFS与主流计算引擎(如Spark、Presto、Hive等)无缝衔接,提供无限扩展的存储空间,运维成本几乎为0,性能远好于直接对接对象存储。

机器学习:POSIX兼容使得JuiceFS可以支持所有机器学习、深度学习框架,方便的文件共享还能提升团队管理、使用数据效率。

Kubernetes:JuiceFS支持Kubernetes CSI,为容器提供解耦的文件存储,令应用服务可以无状态化,方便地在容器间共享数据。

共享工作区 :可以在任意主机挂载,没有客户端并发读写限制,POSIX兼容已有的数据流和脚本操作。

数据备份:在无限平滑扩展的存储空间备份各种数据,结合共享挂载功能,可以将多主机数据汇总至一处,做统一备份。

安装使用

安装

JuiceFS 有良好的跨平台能力,支持在几乎所有主流架构的各类操作系统上运行,包括且不限于 Linux、macOS、Windows 等。

JuiceFS 客户端只有一个二进制文件,你可以下载预编译的版本直接解压使用,也可以用源代码手动编译。

一键安装

一键安装脚本适用于 Linux 和 macOS 系统,会根据你的硬件架构自动下载安装最新版 JuiceFS 客户端。

# 默认安装到 /usr/local/bin
curl -sSL https://d.juicefs.com/install | sh -
安装预编译客户端

你可以在 GitHub发布页 找到最新版客户端下载地址,每个版本的下载列表中都提供了面向不同 CPU 架构和操作系统的预编译版本,请注意识别选择,例如:

以 x86 架构的 Linux 系统为例,下载文件名包含 linux-amd64 的压缩包,在终端依次执行以下命令:

# 获取最新的版本号
JFS_LATEST_TAG=$(curl -s https://api.github.com/repos/juicedata/juicefs/releases/latest | grep 'tag_name' | cut -d '"' -f 4 | tr -d 'v')

# 下载客户端到当前目录
wget "https://github.com/juicedata/juicefs/releases/download/v${JFS_LATEST_TAG}/juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz"

# 解压安装包

tar -zxf "juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz"

# 安装客户端
sudo install juicefs /usr/local/bin

完成上述 4 个步骤,在终端执行 juicefs 命令,返回帮助信息,则说明客户端安装成功。

更多安装方式,请阅读官方安装指南

使用

本文只列举了单机使用方式,分布式模式,请阅读官方使用文档

JuiceFS 文件系统由「对象存储」「数据库」共同驱动。除了对象存储,还支持使用本地磁盘、WebDAV 和 HDFS 等作为底层存储。因此,可以使用本地磁盘和 SQLite 数据库快速创建一个单机文件系统用以了解和体验 JuiceFS。

创建文件系统

创建文件系统使用客户端提供的 format 命令,一般格式为:

juicefs format [command options] META-URL NAME
  • [command options]:设定文件系统的存储介质,留空则默认使用本地磁盘作为存储介质,路径为 "$HOME/.juicefs/local"(darwin/macOS),"/var/jfs"(Linux) 或 "C:/jfs/local"(Windows);
  • META-URL:用来设置元数据存储,即数据库相关的信息,通常是数据库的 URL 或文件路径;
  • NAME:是文件系统的名称。

以 Linux 系统为例,以下命令创建了一个名为 myjfs 的文件系统:

juicefs format sqlite3://myjfs.db myjfs

创建完成将返回类似下面的输出:

2021/12/14 18:26:37.666618 juicefs[40362] <INFO>: Meta address: sqlite3://myjfs.db
[xorm] [info]  2021/12/14 18:26:37.667504 PING DATABASE sqlite3
2021/12/14 18:26:37.674147 juicefs[40362] <WARNING>: The latency to database is too high: 7.257333ms
2021/12/14 18:26:37.675713 juicefs[40362] <INFO>: Data use file:///Users/herald/.juicefs/local/myjfs/
2021/12/14 18:26:37.689683 juicefs[40362] <INFO>: Volume is formatted as {Name:myjfs UUID:d5bdf7ea-472c-4640-98a6-6f56aea13982 Storage:file Bucket:/Users/herald/.juicefs/local/ AccessKey: SecretKey: BlockSize:4096 Compression:none Shards:0 Partitions:0 Capacity:0 Inodes:0 EncryptKey:}

从返回的信息中可以看到,该文件系统使用 SQLite 作为元数据存储引擎,数据库文件位于当前目录,文件名为 myjfs.db,保存了 myjfs 文件系统的所有信息。

由于没有指定任何存储相关的选项,客户端默认使用本地磁盘作为存储介质,根据返回的信息, myjfs 的存储路径为 file:///Users/herald/.juicefs/local/myjfs/,即当前用户目录下的 .juicefs/local/myjfs/

挂载文件系统

挂载文件系统使用客户端提供的 mount 命令,一般格式为:

juicefs mount [command options] META-URL MOUNTPOINT

与创建文件系统的命令类似,挂载文件系统需要提供以下信息:

  • [command options]:用来指定文件系统相关的选项,例如:-d 可以实现后台挂载;
  • META-URL:用来设置元数据存储。即数据库相关的信息,通常是数据库的 URL 或文件路径;
  • MOUNTPOINT:指定文件系统的挂载点。

以下命令将 myjfs 文件系统挂载到 ~/jfs 文件夹:

juicefs mount sqlite3://myjfs.db ~/jfs

默认情况下,客户端会在前台挂载文件系统。就像你在上图中看到的那样,程序会一直运行在当前终端进程中,使用 Ctrl + C 组合键或关闭终端窗口,文件系统会被卸载。

为了让文件系统可以在后台保持挂载,你可以在挂载时指定 -d--background 选项,即让客户端在守护进程中挂载文件系统:

juicefs mount sqlite3://myjfs.db ~/jfs -d

执行以下命令可以将挂载点 ~/jfs 卸载:

juicefs umount ~/jfs

项目地址

https://github.com/juicedata/juicefs

一个专为云原生环境设计的高性能分布式文件系统 - BTool博客 - 在线工具软件,为开发者提供方便

相关推荐
怡雪~5 小时前
K8s的水平自动扩容和缩容HPA
云原生·容器·kubernetes
史努比.5 小时前
HPA - k8s自动伸缩机制
云原生·容器·kubernetes
运维&陈同学6 小时前
【kafka01】消息队列与微服务之Kafka详解
运维·分布式·后端·微服务·云原生·容器·架构·kafka
Jacket Li8 小时前
Kubeadm 安装 Kubernetes 高可用集群 v1.30.0
云原生·容器·kubernetes
hummhumm1 天前
第33章 - Go语言 云原生开发
java·开发语言·后端·python·sql·云原生·golang
petaexpress1 天前
5种常见的k8s云原生数据管理方案详解
云原生·kubernetes·k8s云原生
wenyue11211 天前
云原生开发框架
数据库·云原生
颜淡慕潇1 天前
【K8S系列】深入解析 Kubernetes 中的 Deployment
后端·云原生·容器·kubernetes
蚂蚁在飞-1 天前
云原生时代的轻量级反向代理Traefik
云原生·golang