在最新发布的 JuiceFS v1.3 Beta1 版本中,我们引入了一种全新的二进制备份机制,旨在更高效地应对亿级文件规模下的备份与迁移场景。相比现有的 JSON 备份方式,该机制在导入导出元数据时不仅大幅提升了处理速度,还显著降低了内存占用。

01 JSON 备份机制回顾

JuiceFS 自 v0.15 版本支持通过 JSON 格式进行元数据的导入与导出。该功能不仅可用于日常容灾备份,还支持在不同元数据引擎间做迁移,适配因业务规模或数据要求变化所带来的引擎切换场景. 如因数据可靠性要求,用户需要从 Redis 迁移到 SQL DB,或者因数据量级增长,从 Redis 等切换到 TiKV 等。

JSON 格式的一大优势在于其良好的可读性, 其在备份过程中保持了完整的目录树结构, 将文件对象的属性、拓展属性、chunks 等都一起展示,一目了然。然而,在导入与导出时,为了保持这种结构和输出顺序,系统需要处理上下文信息,带来了额外的计算与内存开销。尽管此前版本已针对性地做了多项优化,但在处理大量级的备份时,耗时和占用内存仍然比较大。此外,随着系统规模的持续扩大,可读性的重要性逐渐下降,用户更关注的是整体备份的统计信息和数据校验机制。

原社区版本提供两种导出 JSON 备份方式:

  • 普通导出,占用内存少但性能低;
  • Fast 模式,通过快照缓存上下文信息,减少随机查询,性能高但是占用内存太高。

当前社区许多文件系统规模已经过亿,性能与内存就凸显得更加重要。在这类大规模场景下,现有的两种 JSON 备份方式均显现出明显的性能瓶颈和资源限制。

此外,虽然不同元数据引擎提供了原生的备份工具,能够高效的对元数据进行备份,比如 Redis 的 RDB,MySQL 的 mysqldump 工具,TiKV 的 BR 工具等。但是这些工具都需要额外处理JuiceFS 元数据的一致性问题,也不支持跨引擎间迁移。

02 二进制备份实现机制

为了提升导入导出的性能与可扩展性,JuiceFS v1.3 引入了基于 Google Protocol Buffer(Protobuf) 的二进制备份格式。该格式以性能优先为核心设计原则,同时综合兼顾了兼容性、备份体积控制与跨场景的通用性,该格式性能可参考此链接

与传统的 JSON 格式不同,二进制格式采用了扁平化的存储结构,不再依赖树状目录所需的上下文信息。这样在导出时,既可以避免普通模式中频繁的随机查询,也无需像 Fast 模式那样依赖大量内存缓存,从而同时提

升了性能并降低了资源消耗。

存储结构设计

  • 整体结构类似于 SQL DB 中的存储结构,每种元数据(ex. node, edge, chunk…)独立存储,与其他元数据没有关联, 保证导入导出过程可以独立处理;
  • 主体由多个段(segment)构成,同一类型的元数据可以拆分成多个段,不同类型的元数据段可交叉,便于在导入导出时做并发分批处理。
  • 文件尾部有一个 footer 段,包含版本号,以及其他元数据段的索引信息,包括位移、数量信息。这使得备份文件支持随机访问,便于按类型或特定数据段进行处理、分析或校验。

1.3 版本 load 工具新增了对二进制备份的解析功能,支持用户快速查看备份信息。由于备份格式采用的是 Protocol Buffer (PB) 格式,用户也可以方便的实现一些备份处理分析工具。

以下是 load 工具的一些示例,展示新版二进制的备份内容:

# 查看备份元数据类型统计信息
$ juicefs load redis.bak --binary --stat

# 查看备份元数据段信息(获取offset)
$ juicefs load redis.bak --binary --stat --offset=-1

# 查看备份指定段(指定offset)信息
$ juicefs load redis.bak --binary --stat --offset=0

导入导出流程解析

导出过程分为两个阶段:扫描和输出。其中,输出阶段主要负责备份文件相关的处理操作;扫描阶段根据不同元数据引擎, 实现方式略有差异。

例如,对于 SQL DB,不同类型的元数据存储于不同表,因此导出时只需分别扫描这些表,并按格式转换保存。对于超大体量的表(ex. node, edge, chunk),系统会采用分批并发查询的方式提升处理效率。

而 Redis 和 TiKV 是 kv 格式,并且部分类型的 key 以 inode 作为前缀,这样的设计是为了访问同一个 inode 的元数据时更高效。为避免重复访问底层引擎,在导出过程中会对这些类型的元数据统一一次扫描,然后在内部做区分处理。

导入过程也分扫描和写入两部分,扫描是对备份文件的读取和格式处理;写入通过多并发批量写入元数据引擎。对于 KV 引擎,比如 TiKV 底层是 LSM 存储结构,为了减少覆盖冲突,会将数据先做排序后再并发写入。

03 性能优化测试

大小

新版本 PB 格式备份在未压缩前只需要原先 JSON 格式的三分之一大小

性能

下面是一亿文件的备份导入导出的耗时对比,新版备份耗时基本在分钟级别。导入时间是原先的二分之一到十分之一;导出时间是原先的四分之一左右。

内存

新版本备份内存占用小于1GiB,并且与并发相关,可以通过调整并发大小和批次大小控制。

04 小结

随着社区中越来越多用户面对亿级规模的文件系统的挑战,备份机制的性能、内存占用和跨引擎适配能力变得尤为关键。JuiceFS 在 v1.3 版本中引入的二进制备份格式:通过采用 Protocol Buffer 和扁平化设计,显著提升导入导出效率,降低资源消耗,并提升备份结构的灵活性与可操作性。未来,我们将继续围绕数据保护、容灾迁移、工具链完善等方面进行优化,欢迎社区用户反馈更多实际场景中的需求。

希望这篇内容能够对你有一些帮助,如果有其他疑问欢迎加入 JuiceFS 社区与大家共同交流。

JuiceFS v1.3-Beta1:一亿文件备份分钟级完成,性能优化全解析的更多相关文章

  1. 亿级 Elasticsearch 性能优化

    前言 最近一年使用 Elasticsearch 完成亿级别日志搜索平台「ELK」,亿级别的分布式跟踪系统.在设计这些系统的过程中,底层都是采用 Elasticsearch 来做数据的存储,并且数据量都 ...

  2. 【HBase调优】Hbase万亿级存储性能优化总结

    背景:HBase主集群在生产环境已稳定运行有1年半时间,最大的单表region数已达7200多个,每天新增入库量就有百亿条,对HBase的认识经历了懵懂到熟的过程.为了应对业务数据的压力,HBase入 ...

  3. Hbase万亿级存储性能优化总结

    背景 hbase主集群在生产环境已稳定运行有1年半时间,最大的单表region数已达7200多个,每天新增入库量就有百亿条,对hbase的认识经历了懵懂到熟的过程.为了应对业务数据的压力,hbase入 ...

  4. 腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代

    腾讯开源再次迎来重磅项目,14日,腾讯正式宣布开源高性能图计算框架Plato,这是在短短一周之内,开源的第五个重大项目. 相对于目前全球范围内其它的图计算框架,Plato可满足十亿级节点的超大规模图计 ...

  5. 腾讯开源进入爆发期,Plato助推十亿级节点图计算进入分钟级时代

    腾讯开源再次迎来重磅项目,14日,腾讯正式宣布开源高性能图计算框架Plato,这是在短短一周之内,开源的第五个重大项目. 相对于目前全球范围内其它的图计算框架,Plato可满足十亿级节点的超大规模图计 ...

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

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

  7. JuiceFS v1.0 beta3 发布,支持 etcd、Amazon MemoryDB、Redis Cluster

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

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

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

  9. 40+倍提升,详解 JuiceFS 元数据备份恢复性能优化之路

    JuiceFS 支持多种元数据存储引擎,且各引擎内部的数据管理格式各有不同.为了便于管理,JuiceFS 自 0.15.2 版本提供了 dump 命令允许将所有元数据以统一格式写入到 JSON 文件进 ...

  10. 财务平台亿级数据量毫秒级查询优化之elasticsearch原理解析

    财务平台进行分录分表以后,随着数据量的日渐递增,业务人员对账务数据的实时分析响应时间越来越长,体验性慢慢下降,之前我们基于mysql的性能优化做了一遍,可以说基于mysql该做的优化已经基本上都做了, ...

随机推荐

  1. MyCat分库分表-安装

    准备3台虚拟机CentOS7,一台MyCat,两台MySQL 一.安装MySQL 打开MySQL官网mysql.com根据提示安装 1.yum仓库 https://dev.mysql.com/down ...

  2. [Qt 基础内容-05] QDialogButtonBox

    QDialogButtonBox 本文主要根据QT官方帮助文档以及日常使用,简单的介绍一下QDialogButtonBox的功能以及使用 文章目录 QDialogButtonBox 简介 信号和槽 基 ...

  3. mysql - 视图的操作 创建,修改,删除,查看

    只保存sql逻辑,不保存查询结果 视图可以看作是封装了多条sql语句,之后使用的时候就像普通表一样,而这个表上的字段则是创建视图时,select 后边跟的字段,支持列的别名. 创建 语法: creat ...

  4. New Bing 全面开放?我看未必

    前段时间大家应该都被ChatGPT刷屏了,其实就回答来说New Bing 才是最厉害的,因为它底层使用了ChatGPT 并且可以支持联网查询数据,回答中还能支持看到出处,方便确认其真实性. New B ...

  5. 如何避免VMware平台ESXi主机CPU使用率的“坑”?

    https://mp.weixin.qq.com/s?__biz=MjM5NTk0MTM1Mw==&mid=2650636818&idx=1&sn=c43f3a3146092f ...

  6. 万字长文详解Text-to-SQL

    什么是Text-to-SQL 在各个企业数据量暴涨的现在,Text-to-SQL越来越重要了,所以今天就来聊聊Text-to-SQL. Text-to-SQL是一种将自然语言查询转换为数据库查询的技术 ...

  7. verilog实现32位有符号流水乘法器

    verilog实现32位有符号流水乘法器 1.4bit乘法流程 1.无符号X无符号二进制乘法器 以下为4bit乘法器流程(2X6) 0 0 0 0 0 0 1 0 (2) X 0 0 0 0 0 1 ...

  8. 【视频编辑】Pr视频编辑软件导出的视频声音有一段会变大怎么解决

    导出视频后为什么有段声音会突然变大? 也就是可能存在编辑器导出的时候有自动增益声音的行为. 具体描述: 工程文件里我没动过声音,工程文件里听也是很正常的,但是导出后有一小段音乐会突然变大(存在自动增益 ...

  9. 【C#】Winform监听USB串口设备拔插实现自动断开

    [C#]Winform监听USB串口设备拔插 零.问题 最近在开发串口相关的软件,需要检测串口拔掉后主动关闭串口,因此需要检测到USB的拔插事件. 一.解决 在主窗口From类下覆盖WndProc方法 ...

  10. Java实体类如何映射到json数据(驼峰映射到json中的下划线)

    Java实体类(驼峰)映射到json数据(下划线) 由于经常需要接收前端的json数据,而json数据一般都是使用下划线命名的.后端又不太建议使用map接收,所以就需要用到使用自定义类来接收(如果参数 ...