JuiceFS v1.0 beta3 在元数据引擎方面继续增强,新增 etcd 支持小于 200 万文件的使用场景,相比 Redis 可以提供更好的可用性和安全性。同时支持了 Amazon MemoryDB for Redis 和 Redis Cluster。至此,JuiceFS 支持的元数据引擎有:
除了元数据引擎的升级,JuiceFS S3 网关也提供了多租户、权限设置等高级功能,同时支持了非 UTF-8 编码的文件名。
本次更新共有 22 位社区贡献者参与贡献了超过 240 次提交,感谢每一位的付出,也欢迎正在读文章的你参与到 JuiceFS 社区中来。
下面,来为你解读一下 JuiceFS v1.0 beta3 的详细变化。
etcd 是一个数据可靠的分布式 KV 存储系统,在 Kubernetes 中广泛使用,etcd 的数据修改会同步写到磁盘上,保证数据安全,通过 Raft 共识算法实现数据复制和故障切换,实现高可用。相比使用异步落盘和异步复制的 Redis 有更好的数据安全性和可用性。
但 etcd 能够支撑的数据规模比较有限,从实际测试来看,小于 200 万文件时,是个不错的选择。
使用方法与其他引擎类似,协议头为 etcd://
,例如:
# 创建文件系统
$ juicefs format etcd://localhost:2379/myjfs jfs-etcd
# 挂载文件系统
$ juicefs mount -d etcd://localhost:2379/myjfs /mnt/jfs
关于 etcd 的性能表现,请查看《元数据引擎性能测试文档》。
由于 JuiceFS 依赖数据库事务保证数据强一致性,而 Redis Cluster 采用分片机制将数据分散在不同的分片上,但不支持跨分区的事务,导致不能使用 Redis Cluster 作为 JuiceFS 的元数据引擎。
v1.0 beta3 通过使用固定前缀的方式让所有的数据都分配到单一的 Redis 分区中,从而保证了 Redis 事务功能不受影响。这个方法不能充分享受 Redis 集群的数据分片能力,但可以获得数据复制和选举方面的便利(类似于哨兵模式)。另外,这种前缀方式类似于单机模式的多库功能,有无限的扩展能力,适用于有很多小规模文件系统的场景。
AWS 最新发布的 MemoryDB for Redis 只提供集群模式,相比 ElastiCache 或者自己维护的 Redis,它的同步数据复制提供了更高的数据安全保证(但写入延迟更高),适用于对数据的安全性要求非常高,写少读多的场景。因为所有元数据都会集中在单个分片中,推荐使用一个分区加一份复制的部署模式(类似于主从模式),后续通过更换为更大内存的节点方式来扩容。
JuiceFS 在读写文件时,如果该文件的数据碎片过多,就会自动触发碎片合并流程,将碎片聚合成大段数据并清理掉旧的碎片。
然而,在元数据迁移、故障恢复等场景中,用户可能需要使用旧版本的元数据备份,此时如果数据碎片已被清理,就会导致相关文件读取失败。
另外,当 Redis 丢失少量元数据时,也可能因为部分文件使用了已经被清理的碎片而损坏。
为了解决上述问题,在 v1.0 beta3 中加入了碎片延迟清理功能,对于开启了回收站的文件系统,碎片会被延迟删除,超过设定的回收站时间后才被自动清理,也可以用 gc 命令手动清理。
v1.0 beta3 进一步调整了 Sync 命令的功能,使其在用法上与大家熟知的 rsync 工具尽量保持一致,减少上手成本。
调整了用于过滤文件列表的 --include
和 --exclude
的用法,跟 rsync 保持一致,允许指定多个过滤规则,根据它们在命令行中的顺序和 Bash 通配符进行匹配,几乎可以实现任意集合的文件筛选需要,更具体的用法请参照 rsync 的文档。
Sync 命令默认会拷贝符号链接的目标文件,可以通过 --links
参数调整为拷贝符号链接本身。
另外,还加了一个 --limit
参数用于限制操作的文件个数,当设置为 1 时表示不进行递归遍历。
JuiceFS 的 S3 网关是基于 MinIO 的早期版本实现的,并且裁剪了一些非必要的功能。新版本的 MinIO 改用了 AGPL 协议,不能被 JuiceFS 直接升级使用。
现在采取了反向集成的策略,在支持网关功能的最新版 MinIO 上集成 JuiceFS v1.0 beta3,整体基于 AGPL 协议开源,这样可以使用新版本的 MinIO 提供的多租户、权限设置等更多高级功能,详情请参考 S3 网关文档。
JuiceFS 仍然内置了基础版的 S3 网关功能,而更完整的版本请使用这个反向集成的版本,代码请见。
--hash-prefix
选项为数据写入对象存储时添加哈希前缀。很多对象存储有基于前缀的 QPS 限制或者系统瓶颈,通过该特性可以绕过这类限制以获得更好的性能。注意,已有数据写入的旧文件系统无法更改此选项。--heartbeat
选项设置客户端的心跳间隔,这在一些关注故障切换时间的场景下能发挥作用。注意,默认的心跳过期时间已由 60s 调整为 12s。juicefs dump
命令会自动隐藏对象存储的 secret key 防止泄漏敏感信息。juicefs config META-URL --encrypt-secret
命令调整加密模式。注意,修改后旧版客户端将无法挂载。请在升级新版前注意评估以下几个变化:
自 v1.0 beta3 开始,会话管理使用了新的格式,旧版本客户端通过 juicefs status
或者 juicefs destroy
无法看到 v1.0 beta3 的会话,新版客户端可以看到所有会话。
为了更好地支持非 UTF-8 编码的文件名,在 JuiceFS v1.0 beta3 中修改了关系型数据库的表结构。
对于正在使用 MySQL、MariaDB、PostgreSQL 的用户,如果需要让已有的文件系统支持非 UTF-8 编码的文件名,需要手动修改表结构,详情请参考文档。
juicefs load
命令加载元数据时部分计数器可能统计不准确问题。详细的 Bug 修复列表与下载体验请点此处 。