龙空技术网

Juice FS 初探|一种为 VPS 提供无限磁盘空间的解决方案

SkyByte 1353

前言:

当前你们对“vps空间清空了怎么办”大约比较重视,姐妹们都需要剖析一些“vps空间清空了怎么办”的相关资讯。那么小编在网上搜集了一些关于“vps空间清空了怎么办””的相关文章,希望你们能喜欢,朋友们快快来学习一下吧!

本文首发于:

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

使用 JunicsFS 将云厂商的 S3 对象存储挂载到本地,就能得到一个几乎无限容量的 VPS 空间了。目前 Juice 支持大部份主流厂商提供的 s3 服务,具体请查阅官方文档。

本文以 腾讯云 COS + 腾讯云轻量服务器,演示一下基本使用。

挂载 COS 到本地

使用以下命令即可创建一个基于 COS 的文件系统,下面演示基于 sqlite 和 redis 的创建、挂载、卸载命令。

# Jfs With Redisjuicefs format \    --storage cos \    --bucket jfs-redis-******** \    --access-key ******** \    --secret-key ******** \    "redis://127.0.0.1:6379/1" \    jfs-redis# 挂载juicefs mount -d "redis://127.0.0.1:6379/1" /mnt/jfs-redis/# 卸载juicefs umount /mnt/jfs-redis/# Jfs With sqlitejuicefs format \    --storage cos \    --bucket jfs-******** \    --access-key ******** \    --secret-key ******** \    "sqlite3:///opt/jfs/jfs.db" \    jfs# 挂载juicefs mount -d "sqlite3:///opt/jfs/jfs.db" /mnt/jfs/# 卸载juicefs umount /mnt/jfs/
自动挂载

具体使用时,可以配置一下自动挂载,方法如下。

首先创建一个从 /sbin/mount.juicefs 到 juicefs 可执行文件的软链接,操作系统解析 fstab 时会调用 /sbin/mount.juicefs 命令。

$ which juicefs/usr/local/bin/juicefs$ ln -s /usr/local/bin/juicefs /sbin/mount.juicefs

新增以下内容到 /etc/fstab 使得开机自动挂载,这里以上文 sqlite 为例:

sqlite3:///opt/jfs/jfs.db    /mnt/jfs       juicefs     _netdev,max-uploads=50,writeback,cache-size=204800     0  0

使用 mount -a 使配置生效

限制容量和文件数

没有限制的行为可想而知,JuicsFS 的默认限制较高,可以手动限制一下文件系统的容量和文件数量。

# 限制文件系统容量 (GiB)$ juicefs config "sqlite3:///opt/jfs/jfs.db" --capacity 102400# 限制文件数量 (inode 数)$ juicefs config "sqlite3:///opt/jfs/jfs.db" --inodes 100000

限制容量举例,可以看到设定前后可以看到挂载点容量的变化:

# 示例$ df -h | grep jfsFilesystem      Size  Used Avail Use% Mounted onJuiceFS:jfs     1.0P  8.0K  1.0P   1% /mnt/jfs# 设定容量上限为 128 GiB$ juicefs config "sqlite3:///opt/jfs/jfs.db" --capacity 1282022/11/20 21:07:08.832094 juicefs[2253158] <INFO>: Meta address: sqlite3:///opt/jfs/jfs.db [interface.go:402]  capacity: 0 GiB -> 128 GiB# 再次查看发现大小为 128GiB$ df -h | grep jfsJuiceFS:jfs     128G  8.0K  128G   1% /mnt/jfs

限制文件 inodes 数量举例,可以看到设定前后可以看到挂载点容量的变化:

# 示例$ df -iFilesystem       Inodes  IUsed    IFree IUse% Mounted on/dev/vda2       3901440 367127  3534313   10% /JuiceFS:jfs    10485762      2 10485760    1% /mnt/jfs$ juicefs config "sqlite3:///opt/jfs/jfs.db" --inodes 39014402022/11/20 21:13:30.977616 juicefs[2255902] <INFO>: Meta address: sqlite3:///opt/jfs/jfs.db [interface.go:402]    inodes: 0 -> 3901440$ df -iFilesystem       Inodes  IUsed    IFree IUse% Mounted on/dev/vda2       3901440 367128  3534312   10% /JuiceFS:jfs     3901440      2  3901438    1% /mnt/jfs
性能测试

文件系统怎么能没有性能测试呢,下面分别使用 dd 和自带 bench 演示性能。

dd 简单读写测试

# 本地文件系统 io 性能$ sync; dd if=/dev/zero of=/tmp/tempfile-12138 bs=1M count=1024; sync1024+0 records in1024+0 records out1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.563 s, 193 MB/s# JuicfFS sqlite 元数据驱动性能$ sync; dd if=/dev/zero of=/mnt/jfs/tmpfile bs=1M count=1024; sync1024+0 records in1024+0 records out1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.97672 s, 154 MB/s# JuicfFS redis 元数据驱动性能$ sync; dd if=/dev/zero of=/mnt/jfs-redis/tmpfile-12138 bs=1M count=1024; sync1024+0 records in1024+0 records out1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.59675 s, 192 MB/s
juicefs bench 测试本地文件系统成绩
# juicefs bench -p 4 /tmp/  Write big blocks count: 4096 / 4096 [==============================================================]  done   Read big blocks count: 4096 / 4096 [==============================================================]  doneWrite small blocks count: 400 / 400 [==============================================================]  done Read small blocks count: 400 / 400 [==============================================================]  done  Stat small files count: 400 / 400 [==============================================================]  doneBenchmark finished!BlockSize: 1 MiB, BigFileSize: 1024 MiB, SmallFileSize: 128 KiB, SmallFileCount: 100, NumThreads: 4+------------------+------------------+--------------+|       ITEM       |       VALUE      |     COST     |+------------------+------------------+--------------+|   Write big file |     153.98 MiB/s | 26.60 s/file ||    Read big file |     148.60 MiB/s | 27.56 s/file || Write small file |   2064.9 files/s | 1.94 ms/file ||  Read small file |   3150.8 files/s | 1.27 ms/file ||        Stat file | 111847.4 files/s | 0.04 ms/file |+------------------+------------------+--------------+
juicefs + sqlite 成绩
$ juicefs bench -p 4 /mnt/jfs  Write big blocks count: 4096 / 4096 [==============================================================]  done   Read big blocks count: 4096 / 4096 [==============================================================]  doneWrite small blocks count: 400 / 400 [==============================================================]  done Read small blocks count: 400 / 400 [==============================================================]  done  Stat small files count: 400 / 400 [==============================================================]  doneBenchmark finished!BlockSize: 1 MiB, BigFileSize: 1024 MiB, SmallFileSize: 128 KiB, SmallFileCount: 100, NumThreads: 4Time used: 72.0 s, CPU: 35.5%, Memory: 704.1 MiB+------------------+------------------+---------------+|       ITEM       |       VALUE      |      COST     |+------------------+------------------+---------------+|   Write big file |     148.25 MiB/s |  27.63 s/file ||    Read big file |     144.29 MiB/s |  28.39 s/file || Write small file |     40.5 files/s | 98.83 ms/file ||  Read small file |    715.9 files/s |  5.59 ms/file ||        Stat file |   3759.0 files/s |  1.06 ms/file ||   FUSE operation | 71735 operations |    2.99 ms/op ||      Update meta |  4773 operations |   27.18 ms/op ||       Put object |  1424 operations |  443.33 ms/op ||       Get object |     0 operations |    0.00 ms/op ||    Delete object |     0 operations |    0.00 ms/op || Write into cache |  1424 operations |  281.82 ms/op ||  Read from cache |  1428 operations |  556.68 ms/op |+------------------+------------------+---------------+
juicefs + redis 成绩

试着跑了一次,结果跑崩了,想玩的自己跑一跑吧。

由于 redis 是内存数据库,跑这种没有上限的测试一定要谨慎。在实际使用中,也要根据自己的需要选择,否则机器很容易 gg。

垃圾清理

juicefs 默认有回收站机制,删除文件默认在回收站保留一天。

可以去挂载目录下执行这条命令彻底删除:

$ find .trash -name '*.tmp' | xargs rm -f
总结

本文介绍了 JuiceFS 的基本用法,为 “大盘鸡” 需求提供一种新的思路,展示了使用对象存储挂载到机器作为文件系统的基本效果。

目前看来是解决系统盘过小问题的好方案,但具体是不是采纳这种方案,等我明天看看账单再做决定。

至于元数据引擎的选择,在单节点服务器的需求上我还是偏向 sqlite 或 mysql 集群的方案,redis 虽然性能强劲,但实在有点吃不消。

最后,这一定是一个很棒的项目,在对接 docker、k8s 之类的容器设施非常方便,提供了插件,可以像操作默认存储卷一样使用,还可以直接使用挂载在本地的路径,希望 JuiceFS 越来越好。

参考文献JuicsFS不用重启也能让 fstab 生效的一条命令在 Linux 上测试硬盘读写速度Linux df 排查 inode 已满及解决方法

标签: #vps空间清空了怎么办