随着大数据、AI 技术的发展,越来越多的企业、团队和个人开始使用 JuiceFS,本文整理了 6 个超实用的 JuiceFS 技巧,帮助大家提升 JuiceFS 的管理效率。

一、查看已挂载的文件系统

有时候你可能在一台机器上挂载了多个 JuiceFS 文件系统,或是在多台机器上使用不同的选项挂载了同一个文件系统,也可能二者兼有的在多台机器上挂载了多个文件系统。类似这样的情况,如何区分哪台机器上挂载的是哪个文件系统、设置了哪些调优选项是大家经常会问到的问题。

这里以 Linux 系统为例,提供几种简便的方法。

方法一:使用 ps 命令

ps aux | grep juicefs

运行这个命令会有类似下面的输出,可以看到前两条记录就是在后台挂载的两个文件系统。

herald     36290  0.2  0.1 800108 78848 ?        Sl   11:07   0:24 juicefs mount -d sqlite3:///home/herald/jfs/my.db /home/herald/jfs/mnt
herald 37190 1.3 0.1 3163100 106160 ? Sl 11:11 2:12 juicefs mount -d badger:///home/herald/jfs/mydb /home/herald/jfs/mnt2
herald 68886 0.0 0.0 221812 2400 pts/0 S+ 13:54 0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox juicefs

方法二:使用 pgrep 和 cat 命令

在 Linux 系统中,进程的信息通常可以在 /proc 文件系统中找到,以进程的 PID 为目录名访问。首先使用 pgrep 找到 juicefs 挂载进程的 PID:

pgrep juicefs

它会有输出所有的 PID,例如:

36290
37190

然后使用 cat /proc/PID/cmdline 分别打印各个进程的命令,例如:

cat /proc/36290/cmdline

它会有类似下面这样的输出:

juicefs mount -d sqlite3:///home/herald/jfs/my.db /home/herald/jfs/mnt

方法三:使用 Bash 脚本

我把方法二整合成了一个独立的 Bash 脚本程序并发布在了 Github Gist,你可以直接下载使用:

# 下载 Bash 脚本
curl -LO https://gist.githubusercontent.com/yuhr123/4e7a09653e833a083dae87ba76b7d642/raw/d8de5350955aa33a3bfafc7cf3756c5f8f3fa04d/proc # 赋予脚本执行权限
chmod +x proc # 运行脚本
./proc juicefs

它会有类似下面的输出:

PID: 36290, Command Line: juicefs mount -d sqlite3:///home/herald/jfs/my.db /home/herald/jfs/mnt
PID: 37190, Command Line: juicefs mount -d badger:///home/herald/jfs/mydb /home/herald/jfs/mnt2

二、利用 Bash 脚本简化管理

JuiceFS 客户端是命令行程序,虽然使用起来并不难,但是对于刚刚上手或是正在反复调整挂载选项调优性能的用户来说,直接在终端上输入命令势必会很繁琐,而且容易输错。对于这个问题,可以使用 Bash 脚本来管理各种命令。

用脚本创建文件系统

比如我会创建一个名为 format-myjfs.sh 的脚本来管理创建文件系统的命令:

#!/bin/bash

juicefs format --storage s3 \
--bucket xxx \
--access-key xxx \
--secret-key xxx \
redis://xxx.xxx.xxx/1 \
myjfs

运行脚本:

bash format-myjfs.sh

这个脚本的好处是方便随时查看这个文件系统是用哪个 bucket 和数据库组成的,缺点是里面可能需要写对象存储或数据库的访问密钥,所以要这么管理的话一定要妥善保管这个脚本,可以通过环境变量传递敏感信息,也可以在使用以后使用 gpg 对这个脚本做对称加密。

用脚本管理文件系统挂载

挂载文件系统是一个日常更频繁的管理动作,比如我会创建一个名为 mount-myjfs.sh 的脚本:

#!/bin/bash

juicefs mount \
--cache-dir /mnt/juicefs-cache \
--buffer-size 2048 \
--writeback \
--free-space-ratio 0.5 \
redis://xxx.xxx.xxx/1 \
/mnt/myjfs

运行脚本:

bash mount-juicefs.sh

使用这个脚本,可以更直观的调整挂载选项,用起来会方便很多。

三、查看有几个客户端同时挂载

云文件系统的一个关键特性是可以被位于不同网络的多客户端同时挂载,比如,将同一个文件系统在北京的机房和纽约的机房同时挂载,两地的服务器可以同时读写,JuiceFS 的事务机制会保证写入数据的一致性。

当你想查看一个文件系统当前有多少客户端在同时挂载时,可以使用 status 命令:

juicefs status redis://192.168.1.80/1

命令会以 JSON 格式输出类似下面的内容,其中的 Sessions 部分显示了当前挂载的客户端,它包括每个客户端的软件版本、主机名、IP 地址、挂载点、进程 ID 等。

{
"Setting": {
"Name": "myjfs",
"UUID": "520ae432-f355-43d2-a445-020787f325f4",
"Storage": "minio",
"Bucket": "http://192.168.1.80:9123/myjfs",
"AccessKey": "admin",
"SecretKey": "removed",
"BlockSize": 4096,
"Compression": "none",
"EncryptAlgo": "aes256gcm-rsa",
"KeyEncrypted": true,
"TrashDays": 1,
"MetaVersion": 1,
"MinClientVersion": "1.1.0-A",
"DirStats": true
},
"Sessions": [
{
"Sid": 2,
"Expire": "2023-10-27T09:08:09+08:00",
"Version": "1.1.0+2023-09-04.08c4ae6",
"HostName": "homelab",
"IPAddrs": [
"192.168.1.80",
],
"MountPoint": "/home/herald/jfs/mnt3",
"ProcessID": 173507
},
{
"Sid": 4,
"Expire": "2023-10-27T09:08:11+08:00",
"Version": "1.1.0+2023-09-04.08c4ae6",
"HostName": "HeralddeMacBook-Air.local",
"IPAddrs": [
"192.168.3.102",
],
"MountPoint": "webdav",
"ProcessID": 20746
}
],
"Statistic": {
"UsedSpace": 4347064320,
"AvailableSpace": 1125895559778304,
"UsedInodes": 11,
"AvailableInodes": 10485760
}
}

四、开启或关闭回收站

顾名思义,回收站是一种数据安全机制,可以防止数据被误删。JuiceFS 文件系统默认开启回收站,删除的文件会在回收站保留 1 天,超过保留时间后,文件会从 .trash 目录中被彻底删除。

在对文件系统进行调优测试时,需要频繁写入和删除大量的临时文件,此时就有必要关闭回收站,让存储空间可以被及时释放。

应该使用 config 命令调整 --trash-days 的数值控制回收站,设置的数字代表回收站保留文件的天数,设置为 0 时表示关闭回收站,例如:

# 将回收站设置为保留 7 天
juicefs config META-URL --trash-days=7 # 关闭回收站
juicefs config META-URL --trash-days=0

五、彻底销毁一个文件系统

对于刚接触一种技术产品的人来说,除了会关注如何创建和使用,也会关注如何清理和删除。JuiceFS 文件系统的销毁与创建一样都是清清爽爽的,它包含一些必要的确认过程,然后就可以被干干静静地删除。首先,使用 status 命令找到要删除的文件系统的 UUID。

# juicefs status redis://192.168.1.80/1

{
"Setting": {
"Name": "myjfs",
"UUID": "520ae432-f355-43d2-a445-020787f325f4",
"Storage": "minio",
"Bucket": "http://192.168.1.80:9123/myjfs",

然后,需要确认所有客户端已经停止使用该文件系统,正在挂载使用的文件系统是无法被销毁的。最后,使用 destroy 命令执行销毁。

juicefs destroy redis://192.168.1.80/1 520ae432-f355-43d2-a445-020787f325f4

六、元数据备份和还原

JuiceFS 文件系统是一种数据与元数据分离存储的架构,数据会被分块存储在对象存储,相关的元数据会存储在独立的数据库中。元数据记录了文件的名称、大小、位置、权限等信息,访问文件时必须先检索到元数据才能拿到实际的数据,可以说元数据对任何文件系统来说都是至关重要的。

为了保证元数据的安全,JuiceFS 默认启用元数据自动备份机制,每小时都会备份一次元数据并保存到对象存储 Bucket 的 meta 目录中。

当元数据引擎发生了故障,就可以下载一份最新的备份,通过 load 命令进行元数据恢复。恢复元数据有两个注意事项:

  1. 只能恢复到全新的数据库;

  2. 需要重新设置对象存储的 Secret Key。

比如,我的文件系统是用 Redis 1 号数据库创建的,现在假设它损坏了,我要在2 号库上重建元数据。只要去对象存储的 meta 目录下载最新的备份,然后按照下面的步骤进行恢复即可。


# 将元数据备份导入全新的数据库
juicefs load redis://192.168.1.80/2 dump-2023-10-27-025129.json.gz # 更新对象存储 secret key
juicefs config --secret-key xxx redis://192.168.1.80/2

需要注意的是,自动备份与故障发生难免存在时间差,最近的一次备份后与故障发生前的期间产生的新数据是无法被恢复的。

极端状况毕竟是少数,平时更常见的需求是在不同的数据库之间迁移元数据。

这个操作也同样很简单,首先停掉文件系统的读写业务,然后使用 dump 命令导出元数据,最后在目标数据库上使用 load 命令导入即可。

# 导出元数据到 meta-dump.json 文件
juicefs dump redis://192.168.1.80/1 meta-dump.json # 将元数据导入到一个全新的 sqlite 数据库
juicefs load sqlite3://myjfs.db meta-dump.json # 更新对象存储 secret key
juicefs config --secret-key xxx sqlite3://myjfs.db

JuiceFS 用户必备的 6 个技巧的更多相关文章

  1. MAC上有哪些优秀的日常软件| 入门级Mac OS 用户必备软件

    本文整理的网友反馈的MAC上有哪些优秀的日常软件+入门级Mac OS 用户必备软件,感兴趣的朋友可以看看,下载下来试用一样便知实不实用.如有更好的推荐,欢迎留言. MAC上有哪些优秀的日常软件 Tim ...

  2. 开发必备的Windows小技巧

    在Windows中我们经常会遇到各种小问题,而这些小问题又确实在影响着工作效率,如果能解决这些小问题,那么就能在一定程度上提高工作效率,保证心情愉悦.今天我就来分享一下几个自认为比较有用的小技巧. 保 ...

  3. jQuery Mobile高手必备的十大技巧和代码片段

    与任何新技术一样,常常难就难在如何开始入手. 有鉴于此,我们整理出了与jQuery Mobile库有关的我认为最便利的一些技巧.方法和代码片段. 由于本文不是旨在全面介绍使用jQuery Mobile ...

  4. Facebook内部报告:争取青少年用户的鸡贼小技巧

    翻译:吴祺深 欢迎访问网易云社区,了解更多网易技术产品运营经验. 去年十月,Facebook收购了TBH,最后却关闭了这款APP,不过一则内部报告透露了,通过这款流行的投票APP,这家公司学会了如何去 ...

  5. 深圳电信光纤用户必备:简单破解中兴ZXA10 F460光电猫,实现WIFI和自动拨号功能

    最近搬家,ADSL转成光纤宽带,下载速度非常给力.原来的ADSL路由器派不上用场,电信的安装人员也给开通了wifi功能,只是wifi无法上网,而且拨号一定需要用电脑连网线进行拨号.以前是直接把拨号账户 ...

  6. wex5 实战 用户点评与提交设计技巧

    最近遇到很多同学做毕业设计,其中有一项是用户点评与提交.功能并不复杂,同学们又不会,做为一个完整的功能,如果用wex5来设计开发,事半功倍.今天就以景区实战来向大家展示wex5的高效与强大.半天可以设 ...

  7. 【转】Mac用户必备!100多款免费实用的苹果Mac软件大搜集

    原文网址:http://www.iplaysoft.com/100-mac-freeware.html 对于 Mac 新手,尤其是刚刚从 Windows 转到 Mac OS X 的用户来说,最大的痛苦 ...

  8. 利用HTML5判断用户是否正在浏览页面技巧

    现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务.同时还有新的document.hidde ...

  9. 必备的JS调试技巧汇总

    转自http://www.jb51.net/article/88891.htm 前言:任何一个编程者都少不了要去调试代码,不管你是高手还是菜鸟,调试程序都是一项必不可少的工作.一般来说调试程序是在编写 ...

  10. OutLook中发送用户密码加密的小技巧

    1     在左上栏目里面选择  New E-mail选项卡,点击进入发送新邮件页面. 2    在第一栏选择Options选项,点击打开 3    看到有一个红色按钮Perssion按钮,打开 4 ...

随机推荐

  1. pandas 利用openpyxl设置表格样式

    writer = pd.ExcelWriter('/home/leo/Desktop/项目测试/922904.xlsx', engine='openpyxl') new_data.to_excel(w ...

  2. Hugging News #0731: 新课程重磅发布、用户交流群邀请你加入、真实图像编辑方法 LEDTIS 来啦!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  3. python教程 入门学习笔记 第3天 编程基础常识 代码注释 变量与常量

    编程基础常识 一.注释 1.对代码的说明与解释,它不会被编译执行,也不会显示在编译结果中 2.注释分为:单行注释和多行注释 3.用#号开始,例如:#这是我的第一个python程序 4.注释可以写在单独 ...

  4. Cilium系列-10-启用 IPv6 BIG TCP和启用巨帧

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...

  5. [golang]标准库-json

    前言 json数据格式通常包含两个操作:序列化(把对象转换成JSON数据类型)和反序列化(把JSON数据类型转换成对象),二者操作互逆. Go语言中相关标准库为encoding/json. 示例代码 ...

  6. Redhat 8.2 系统语言切换(英文转中文)

    前提条件 确保已连上网,并且配好 yum 源 若未配好 yum 源 可参考我上一篇文章 部分 Linux 换国内源 操作步骤 安装中文语言包 dnf install glibc-langpack-zh ...

  7. 4.2 C++ Boost 内存池管理库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...

  8. [ABC128E] Roadwork

    2023-01-14 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 区间覆盖,线段树,双堆 解题思路 可以将问题转化为区间覆盖问题和单点查询问 ...

  9. Python 基础面试第二弹

    1. 解释下Python中的面向对象,以及面向对象的三大特点: 在Python中,面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的 ...

  10. ERP进销存系统源码

    介绍 ERP进销存管理系统 软件架构 核心框架:SpringBoot 2.0.0 持久层框架:Mybatis 1.3.2 日志管理:Log4j 2.10.0 JS框架:Jquery 1.8.0 UI框 ...