JuiceFS v1.0 beta3 在元数据引擎方面继续增强,新增 etcd 支持小于 200 万文件的使用场景,相比 Redis 可以提供更好的可用性和安全性。同时支持了 Amazon MemoryDB for Redis 和 Redis Cluster。至此,JuiceFS 支持的元数据引擎有:

  1. Redis:包括单机、Sentinel 和 Cluster 模式,适合小于 1 亿文件,同时追求高性能的场景。基于 AOF 的异步复制有少量数据丢失的风险,Amazon MemoryDB for Redis 使用同步数据复制,数据安全性更高;
  2. 关系型数据库:包括 MySQL、MariaDB、PostgreSQL,适合数据安全要求高,性能要求不高的场景;
  3. TiKV:适合海量文件(1 亿以上),对性能与数据安全都有高要求的场景,但运维门槛比前面的方案高;
  4. etcd:适合小于 200 万文件并且可用性与数据安全要求高的场景;
  5. 嵌入式数据库:包括 BadgerDB 和 SQLite,适合不需要多机访问的场景使用。

除了元数据引擎的升级,JuiceFS S3 网关也提供了多租户、权限设置等高级功能,同时支持了非 UTF-8 编码的文件名。

本次更新共有 22 位社区贡献者参与贡献了超过 240 次提交,感谢每一位的付出,也欢迎正在读文章的你参与到 JuiceFS 社区中来。

下面,来为你解读一下 JuiceFS v1.0 beta3 的详细变化。

新增 etcd 元数据引擎

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 的性能表现,请查看《元数据引擎性能测试文档》

支持 Redis Cluster 和 Amazon MemoryDB for Redis

由于 JuiceFS 依赖数据库事务保证数据强一致性,而 Redis Cluster 采用分片机制将数据分散在不同的分片上,但不支持跨分区的事务,导致不能使用 Redis Cluster 作为 JuiceFS 的元数据引擎。

v1.0 beta3 通过使用固定前缀的方式让所有的数据都分配到单一的 Redis 分区中,从而保证了 Redis 事务功能不受影响。这个方法不能充分享受 Redis 集群的数据分片能力,但可以获得数据复制和选举方面的便利(类似于哨兵模式)。另外,这种前缀方式类似于单机模式的多库功能,有无限的扩展能力,适用于有很多小规模文件系统的场景。

AWS 最新发布的 MemoryDB for Redis 只提供集群模式,相比 ElastiCache 或者自己维护的 Redis,它的同步数据复制提供了更高的数据安全保证(但写入延迟更高),适用于对数据的安全性要求非常高,写少读多的场景。因为所有元数据都会集中在单个分片中,推荐使用一个分区加一份复制的部署模式(类似于主从模式),后续通过更换为更大内存的节点方式来扩容。

碎片延迟清理功能

JuiceFS 在读写文件时,如果该文件的数据碎片过多,就会自动触发碎片合并流程,将碎片聚合成大段数据并清理掉旧的碎片。

然而,在元数据迁移、故障恢复等场景中,用户可能需要使用旧版本的元数据备份,此时如果数据碎片已被清理,就会导致相关文件读取失败。

另外,当 Redis 丢失少量元数据时,也可能因为部分文件使用了已经被清理的碎片而损坏。

为了解决上述问题,在 v1.0 beta3 中加入了碎片延迟清理功能,对于开启了回收站的文件系统,碎片会被延迟删除,超过设定的回收站时间后才被自动清理,也可以用 gc 命令手动清理。

增强 Sync 命令

v1.0 beta3 进一步调整了 Sync 命令的功能,使其在用法上与大家熟知的 rsync 工具尽量保持一致,减少上手成本。

调整了用于过滤文件列表的 --include--exclude 的用法,跟 rsync 保持一致,允许指定多个过滤规则,根据它们在命令行中的顺序和 Bash 通配符进行匹配,几乎可以实现任意集合的文件筛选需要,更具体的用法请参照 rsync 的文档。

Sync 命令默认会拷贝符号链接的目标文件,可以通过 --links 参数调整为拷贝符号链接本身。

另外,还加了一个 --limit 参数用于限制操作的文件个数,当设置为 1 时表示不进行递归遍历。

S3 网关功能升级

JuiceFS 的 S3 网关是基于 MinIO 的早期版本实现的,并且裁剪了一些非必要的功能。新版本的 MinIO 改用了 AGPL 协议,不能被 JuiceFS 直接升级使用。

现在采取了反向集成的策略,在支持网关功能的最新版 MinIO 上集成 JuiceFS v1.0 beta3,整体基于 AGPL 协议开源,这样可以使用新版本的 MinIO 提供的多租户、权限设置等更多高级功能,详情请参考 S3 网关文档

JuiceFS 仍然内置了基础版的 S3 网关功能,而更完整的版本请使用这个反向集成的版本,代码请见

其它新功能

  1. 支持 TLS 加密连接 TiKV 元数据引擎
  2. 创建文件系统时,可以通过 --hash-prefix 选项为数据写入对象存储时添加哈希前缀。很多对象存储有基于前缀的 QPS 限制或者系统瓶颈,通过该特性可以绕过这类限制以获得更好的性能。注意,已有数据写入的旧文件系统无法更改此选项。
  3. 挂载文件系统时,可以通过 --heartbeat 选项设置客户端的心跳间隔,这在一些关注故障切换时间的场景下能发挥作用。注意,默认的心跳过期时间已由 60s 调整为 12s。
  4. 数据存储增加 Oracle Object Storage 支持。
  5. Java SDK 支持上报监控指标到 Graphite 或者兼容的系统
  6. SQL 引擎支持非 UTF-8 编码的文件名,已有的文件系统需要升级客户端后再修改数据库的表结构。

其它变化

  1. 在新建文件系统时,会自动在数据存储中写入一个记录了 UUID 的占位对象,避免其他文件系统重复使用相同的数据存储造成混淆。
  2. juicefs dump 命令会自动隐藏对象存储的 secret key 防止泄漏敏感信息。
  3. 改用加密形式存储对象存储访问密钥,减小安全隐患;已有的文件系统可通过 juicefs config META-URL --encrypt-secret 命令调整加密模式。注意,修改后旧版客户端将无法挂载。
  4. 调整元数据默认备份机制,当文件数多于一百万时,需要用户显式指定备份周期。
  5. 在 Linux 下使用非 root 用户挂载时,将默认的缓存和日志目录改为此用户的家目录,避免因权限不足而失败。
  6. 改进了往 Redis 和 SQL 数据库导入大型目录(超过一百万文件)的能力。
  7. 为关系型数据库所有表结构增加主键,提升日志复制性能,详情参考

升级建议

请在升级新版前注意评估以下几个变化:

会话管理格式调整

自 v1.0 beta3 开始,会话管理使用了新的格式,旧版本客户端通过 juicefs status 或者 juicefs destroy 无法看到 v1.0 beta3 的会话,新版客户端可以看到所有会话。

SQL 表结构调整,支持非 UTF-8 编码文件名

为了更好地支持非 UTF-8 编码的文件名,在 JuiceFS v1.0 beta3 中修改了关系型数据库的表结构。

对于正在使用 MySQL、MariaDB、PostgreSQL 的用户,如果需要让已有的文件系统支持非 UTF-8 编码的文件名,需要手动修改表结构,详情请参考文档

修复的 Bug

  1. 修复了元数据备份失败时可能导致部分内存未及时释放问题。
  2. 修复了使用 SQL 作为元数据引擎时,扫描函数返回结果可能不正确问题。
  3. 修复了使用 juicefs load 命令加载元数据时部分计数器可能统计不准确问题。
  4. 修复了对象存储开启多 buckets 时,扫描对象列表结果不正确问题。
  5. 修复了使用 Ceph RADOS 做对象存储时,对象数过多时扫描卡住问题。

详细的 Bug 修复列表请看 https://github.com/juicedata/juicefs/releases/tag/v1.0.0-beta3

快去下载体验吧,Juicedata/JuiceFS

JuiceFS v1.0 beta3 发布,支持 etcd、Amazon MemoryDB、Redis Cluster的更多相关文章

  1. JuiceFS V1.0 RC1 发布,大幅优化 dump/load 命令性能, 深度用户不容错过

    各位社区的伙伴, JuiceFS v1.0 RC1 今天正式发布了!这个版本中,最值得关注的是对元数据迁移备份工具 dump/load 的优化. 这个优化需求来自于某个社区重度用户,这个用户在将亿级数 ...

  2. JuiceFS v1.0.0 Beta1 发布,加强数据安全能力

    在 JuiceFS 开源一周年之际,我们迎来了首个里程碑版本 JuiceFS v1.0.0 Beta1,并将开源许可从 AGPL v3 修改为 Apache License 2.0. JuiceFS ...

  3. mysql awr v1.0.1发布

    现发布mysql awr v1.0.1 修复问题: 1.galera cluster下flush table/index_statistcs时如果系统中业务ddl频繁可能会导致很多进程处于prepar ...

  4. PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区

    PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区 PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具

  5. [译]ABP v1.0终于发布了!

    ABP v1.0终于发布了! 今天是个大日子!经过约3年的不断开发,第一个稳定的ABP版本,1.0,已经发布了.感谢为该项目做出贡献或试用过的每个人. 立即开始使用新的ABP框架:abp.io/get ...

  6. Omi v1.0震撼发布 - 令人窒息的Web组件化框架

    原文链接--https://github.com/AlloyTeam/omi 写在前面 Omi框架经过几十个版本的迭代,越来越简便易用和强大. 经过周末的连续通宵加班加点,Omi v1.0版本终于问世 ...

  7. Omi v1.0震撼发布 - 开放现代的Web组件化框架

    原文链接--https://github.com/AlloyTeam/omi 写在前面 Omi框架经过几十个版本的迭代,越来越简便易用和强大. 经过周末的连续通宵加班加点,Omi v1.0版本终于问世 ...

  8. Rookey.Frame v1.0 视频教程发布了

    经过昨天几个小时的折腾, Rookey.Frame v1.0开发视频教程终于发布了,由于是第一次做视频有很多地方做的不够好,后续我会慢慢改进,争取将视频教程做好. 本期发布视频: (一)Rookey. ...

  9. 关于ML.NET v1.0 的发布说明

    今天,我们很高兴宣布发布 ML.NET 1.0.ML.NET 是一个免费的.跨平台的开源机器学习框架,旨在将机器学习(ML)的强大功能引入.NET 应用程序. ML.NET GitHub:https: ...

随机推荐

  1. ApplicationContext 通常的实现是什么?

    FileSystemXmlApplicationContext :此容器从一个 XML 文件中加 载 beans 的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数. ClassPat ...

  2. 为什么 redis 需要把所有数据放到内存中?

    答Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数 据写入磁盘.所以 redis 具有快速和数据持久化的特征.如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 redi ...

  3. memcached 是原子的吗?

    所有的被发送到 memcached 的单个命令是完全原子的.如果您针对同一份数据 同时发送了一个 set 命令和一个 get 命令,它们不会影响对方.它们将被串行化. 先后执行.即使在多线程模式,所有 ...

  4. -> 在c语言中是什么意思?

    ->在C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符".".用法:p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员.表达式p-> ...

  5. 针对于iosAPP内嵌H5,-webit-overflow-scrolling:touch;产生空白情况

    问题描述:一个内嵌IOSAPP的H5页面,长页面,大概1.6个屏幕高度,由于有列表滑动起来很不流畅,所以用了-webit-overflow-scrolling:touch;这个只针对ios端的物理滚动 ...

  6. 【Android开发】控件外边框自定义

    1.在drawable里面新建自定义的资源文件shape <?xml version="1.0" encoding="utf-8"?> <sh ...

  7. Git本地上传口令

    $ cd /d/GitProject  (进入要上传的文件的文件夹) $ git pull                 (更新本地库) $ git add .                (添加 ...

  8. CCF201909-2小明种苹果(续)

    解题思路:解题思路很简答,就是用数组将数据存起来然后再进行统计,具体思路就见代码注释,记录这道题的是为了警示自己好好审题啊...... 审题有问题,写题火葬场啊.......以为每棵树就疏一次果,把D ...

  9. MySQL数据库设置编码格式和时区

    MySQL数据库设置编码格式和时区 MySQL5版本: url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8 MySQL6版本及以上 ...

  10. enum in c++

    enum in c++ enum的实用的定义:给一个值指定一个名称.enums是一种给值命名的方式. 枚举值就是一个整数 用enum的目的:增加程序的可读性 enum的用法:enums [枚举的类名] ...