JuiceFS v0.16 发布,支持 TiKV 元数据引擎!

Juicedata 2021.08.17

时光飞逝,秋天来了。经过一个月的开发,JuiceFS 带来了 2021 年秋季的第一个新版本 v0.16,本次更新涉及 11 项变化,修复了 16 个 Bug,新增 6 项功能。

在社区用户的热切期盼下,JucieFS 正式开放 TiKV 数据库作为元数据引擎的支持。

需要特别提及的是,实现 TiKV 作为元数据引擎,衍生自 PingCAP 第二期 Hacking Camp 活动。在一个多月的时间里,JuiceFS 团队与社区用户紧密协作,成功实现了 JuiceFS 对 TiKV 数据库的支持。

TiKV 元数据引擎

TiKV 是一个支持分布式事务的键值数据库,它相比纯内存型的 Redis 有着更理想的可靠性和横向扩容能力,相比一般的 SQL 数据库, 它在更高可靠性的基础上能提供更优异的性能表现。对 JuiceFS 的元数据引擎来说,TiKV 是一个不极端、综合表现很优秀的新选择。

结合 TiKV 元数据引擎,JuiceFS 可以提供百亿级文件规模和 EB 级的数据存储能力。

使用 TiKV 作为 JuiceFS 的元数据引擎也非常简单,只需在格式化文件系统时指定 TiKV 集群 PD 的地址即可,格式如下:

tikv://<pd_addr>[,<pd_addr>...]/<prefix>

例如:

$ juicefs format \
    --storage minio \
    --bucket http://127.0.0.1:9000/mystor \
    --access-key minioadmin \
    --secret-key minioadmin \
    tikv://127.0.0.1:2379/mystor \
    mystor

以上命令创建了一个名为 mystor 的文件系统,请注意倒数第二行数据库的部分,在指定 PD 服务器地址时要使用 tikv:// 协议头,地址最后的 /mystor 是一个自定义的 prefix,当多个文件系统或应用使用同一个 TiKV 集群时,设置前缀可以避免混淆和冲突。

文件系统创建完成后,使用以下命令挂载文件系统即可:

$ sudo juicefs mount -d tikv://127.0.0.1:2379/mystor ~/jfs

在性能表现方面,我们使用 Go 语言附带的基准测试工具在相同的计算环境下分别测试了 Redis、MySQL 和 TiKV 做元数据引擎的性能表现,得到的测试结果如下。

测试数据说明:

  • 测试环境中 Redis 和 MySQL 均为单副本,TiKV 采用的是三副本分布式架构。
  • 测试结果数值代表操作耗时,单位为(微秒/操作),数值越小越好。
  • 括号内的数字是与 Redis-Always 模式的比值。

从测试结果不难发现,即便 TiKV 采用了多副本的架构,在常规文件系统操作方面的性能表现仍然优于 MySQL 数据库。相较于 Redis 的全内存存储,虽然存在平均 2~3 倍左右的性能差距,但这只是纯元数据操作方面的差距,在数据存储方面,即对象存储的时延会占较大比重,因此在实际的业务场景下,TiKV 与 Redis 的性能差距会小很多,可靠性和扩展性也会进一步凸显 TiKV 的优势。

新增 stats 命令

本次更新还新增了 stats 子命令,用来实时查看文件系统的运行状态。

该命令分列显示文件系统消耗的主机资源、FUSE 操作、元数据、块缓存、对象存储带宽信息等,默认每秒打印一行。可以通过 juicefs stats --help 查看命令帮助,stats 命令可以通过搭配相应的选项自定义要显示的信息项以及打印的时间间隔。

stats 命令借鉴了我们很喜欢的 dstat 的界面风格,此举意在向 dstat 的作者表达敬意!🍻

新增 .config 虚拟文件

新版在文件系统根目录增加了一个名为 .config 虚拟文件,可以很方便的查看文件系统的详细配置信息。

$ sudo cat ~/mnt/.config
{
 "Meta": {
  "Strict": true,
  "Retries": 10,
  "CaseInsensi": false,
  "ReadOnly": false,
  "OpenCache": 0,
  "MountPoint": "mnt",
  "Subdir": ""
 },
 "Format": {
  "Name": "herald-jfs",
  "UUID": "a703ea9f-b70d-41b0-8fe6-ab44cbe8d734",
  "Storage": "minio",
  "Bucket": "http://127.0.0.1:9000/herald",
  "AccessKey": "minioadmin",
  "SecretKey": "removed",
  "BlockSize": 4096,
  "Compression": "none",
  "Shards": 0,
  "Partitions": 0,
  "Capacity": 0,
  "Inodes": 0
 },
 "Chunk": {
  "CacheDir": "/var/jfsCache/a703ea9f-b70d-41b0-8fe6-ab44cbe8d734",
  "CacheMode": 384,
  "CacheSize": 1024,
  "FreeSpace": 0.1,
  "AutoCreate": true,
  "Compress": "none",
  "MaxUpload": 20,
  "Writeback": false,
  "Partitions": 0,
  "BlockSize": 4194304,
  "GetTimeout": 60000000000,
  "PutTimeout": 60000000000,
  "CacheFullBlock": true,
  "BufferSize": 314572800,
  "Readahead": 0,
  "Prefetch": 1
 },
 "Version": "0.16.1 (2021-08-16 2edcfc0)",
 "Mountpoint": "mnt"
}

gc、fsck 命令增加进度条

gcfsck 命令增加了进度条,操作进度更加直观。感谢社区开发者 @zhijian-pro 对此项功能的贡献。

注意 Redis 引擎相关的变化

从 v0.16 开始,Redis Sentinel URI 中的密码含义发生了变化,由 Sentinel 的密码改为 Redis Server 的密码。如果 Sentinel 也设置了密码,需要由环境变量 SENTINEL_PASSWORD 来指定。

其他新变化

  • 支持上传/下载带宽限制
  • 禁用了 updatedb

有关 JuiceFS v0.16 的更多信息,请访问 GitHub 仓库查看详情

开源社区贡献指南

JuiceFS 是在 AGPLv3 协议下开源的项目,开源软件的发展离不开每一个人的支持,一篇文章、一页文档、一个想法、一个建议、报告或修复一个 Bug,这些贡献不论大小都是推动开源项目不断发展的动力。

你可以为开源社区做的事情:

  • 加星关注项目 https://github.com/juicedata/juicefs
  • 论坛发表你的看法
  • Issues 认领开发任务
  • 完善 JuiceFS 的文档
  • 在你自己的博客、微博、微信、Vlog 等自媒体分享有关 JuiceFS 的一切
  • 加入 JuiceFS 的微信群或 Slack 频道
  • 把 JuiceFS 告诉更多人,让更多人使用由你我共同维护的产品!

我们诚挚的邀请每一个热爱开源的人加入到我们的社区,让我们一起把 JuiceFS 做的更好!