Skip to main content

文件导入和转存

JuiceFS 默认会将文件进行分块存储,并将元数据与数据剥离。正是这样的存储格式和分离架构,让 JuiceFS 得以成为高性能、强一致性文件系统。

但是在某些非常特殊的场景下,用户更需要直接在对象存储上保存原始文件,让对象存储里的文件能够脱离 JuiceFS 元数据使用,或者直接将对象存储中已有的大量文件直接导入 JuiceFS,使其可以通过 POSIX 访问,并利用上 JuiceFS 的强大缓存能力。在对象存储里保存完整文件并在 JuiceFS 中使用,我们称为「兼容格式」。而默认的文件分块存储的高性能模式,则称为「优化格式」。

从 5.0 开始,JuiceFS 极大改善了对兼容格式的支持,提供以下功能,来满足上述要求:

  • 对象存储的「导入」功能,也就是 juicefs import 命令。确切地说,这个命令早已支持,但从 5.0 开始,导入的文件也支持读缓存。
  • 「转存」功能,将 JuiceFS 中的分块格式文件,重新组合成完整文件上传至对象存储,让用户可以直接在对象存储中访问原始文件,一样支持读缓存。

转存

功能启用以后,文件会在指定时间后被转存成完整文件、保存在对象存储。

convert

使用场景

  • 文件由 JuiceFS 写入,但希望后续也能通过对象存储直接读取,对接云上生态。之所以强调直接读取,是因为 JuiceFS 也提供 S3 接口,如果你只是需要为文件系统暴露 S3 接口,应该使用 S3 网关

  • 希望直接使用对象存储的生命周期管理、归档功能,将冷数据进行归档处理。归档的数据要求是已经合并转存为完整文件的状态,可以脱离 JuiceFS 元数据直接使用。

    注意,该场景的重点仍然是脱离 JuiceFS 使用,如果你仅仅是希望实现在 JuiceFS 中读写冷热数据,可以用 --storage-class 来为客户端指定存储级别,这是更合适的方式。

  • 由于数据合规性条例,必须在对象存储上保存原始文件。

  • 其他需要将对象存储数据方便地脱离 JuiceFS 使用的情况。

不应使用的场景

转存是针对少数极特殊场景推出的实验性功能,如果你的场景并未在上方列出,那么绝不应该使用此功能。启用转存会给文件系统带来一些重要的限制(比如转存后的文件是只读的),继续阅读下方的功能概览以了解。

举例说明,下列场景就不应该使用转存功能

  • 需要用 S3 接口访问 JuiceFS 文件系统。我们为这种需求提供 S3 网关功能,让文件系统可以通过 S3 API 访问,完全不需要使用转存功能。
  • 冷热数据分离读写。我们的客户端支持指定存储级别,可以在 juicefs auth 指定 --storage-class 参数,来指定客户端的存储级别,实现在同一个文件系统内写入不同存储级别的文件。

功能概览

从对象存储的文件列表观察转存过程,效果如下:

# 转存前
mybucket/
├── chunks
│   ├── 41
│   │   └── 1
│   │   ├── 1000001_0_4194304
│   │   └── 1000001_10_4194304
│   ├── 43
│   │   └── 1
│   │   ├── 1000003_0_4194304
...

# 转存后,文件会被原样写入对象存储,保留目录结构,原本分块格式的数据块会被删除
mybucket/
├── bigfile1.tar.gz
├── chunks
├── dir/bigfile2.tar.gz

由于「转存」的目的是脱离 JuiceFS 分块格式,在对象存储上进行「原样存储」,因此正如上方所示范的,文件会按照文件系统里的目录结构进行存储,因此如果开启转存,文件系统必须要独占对象存储桶,决不能一桶多用(也不能将该桶用于其他 JuiceFS 文件系统),否则将容易发生冲突、甚至导致数据丢失。

转存后的文件,也不再支持内容修改,写操作会直接报错提示没有权限。虽无法编辑,但可以进行 mv,该命令在 JuiceFS 中会被解释为「跨设备拷贝 + 删除」,相当于从兼容格式将文件正常读出,然后再以分块格式写回 JuiceFS,成为一个全新的文件,然后再删除源文件。由于 mv 将文件从兼容格式重新转为了分块格式,因此文件又可以正常编辑了,直到等待了指定时间以后,被再次转存。

启用转存的文件系统,所有目录再创建一段时间之后(包括空目录),就不能移动(mv),只能删除重建。

危险

转存文件不支持回收站,删除以后不会出现在回收站、无法恢复,对象存储一侧也会通过客户端后台任务进行异步清理。

转存功能目前处于内测阶段,如有需要请联系 Juicedata 工程师处理。

缓存

兼容格式的文件支持本地缓存分布式缓存。虽然转存文件已不再是分块格式,但实际缓存到本地盘时,仍然会被拆分为数据块(大小为文件系统的 block size),因此对于转存文件的缓存的使用和管理方式,和分块格式没有任何不同。

但也需要注意,转存完成后,由于元数据变化,文件已有的缓存会失效,可能需要再次预热来重新建立缓存。

导入对象存储已有文件

juicefs import 会扫描给定的对象存储地址,然后将目标文件的元数据信息写入 JuiceFS 元数据引擎,让这些文件在 JuiceFS 中也能访问,该操作并不会实际复制任何文件,文件仍原样保存在对象存储里,因此相较于 JuiceFS 原生的分块格式,这种存储格式称为「兼容格式」,意为和对象存储保持兼容。

导入的文件,使用上要注意:

  • 可以修改文件名、权限,但无法修改对象存储数据。换言之,不论做何种操作,对象存储上的原始对象都不会变;
  • 同样地,删除这些文件也只会删除其元数据,并不会真正删除对象存储中的源文件;
  • 导入进 JuiceFS 的元数据,也不支持回收站,如果在 JuiceFS 中删除导入的文件,并不会在回收站找到他们,如果需要恢复,只能再次执行导入;
  • 导入的文件和 JuiceFS 自身的文件没有明显区别,如果要辨别一个文件是否属于导入文件,可以使用 juicefs info,如果在 info 的输出中关注 object 字段(而没有 chunks 表格),来识别兼容格式。
危险

导入的文件同样占用文件系统空间,会计入目录配额,并且参与计费。

缓存

从 JuiceFS 5.0 开始,导入的文件同样支持本地缓存分布式缓存。虽然导入的文件并没有真正写入 JuiceFS 文件系统、经过 JuiceFS 的分块格式化,但实际缓存到本地盘时,仍然会被拆分为数据块(大小为文件系统的 block size),因此对于导入文件的缓存的使用和管理方式,和正常写入 JuiceFS 文件系统中的文件没有任何不同。

使用 JuiceFS 的缓存功能加速导入文件的读取时,需要注意一致性问题:由于导入的对象本身并不受 JuiceFS 管理,如果对象发生了修改,而没有重新导入到 JuiceFS 的话,因为可能存在旧版本的缓存,不确保能读到最新的数据。因此如果导入 JuiceFS 以后,对象发生了变更,则需要再次导入。而已有的缓存数据,会根据导入的对象的修改时间自动失效。确保能读到修改过后的数据。

因此,对于需要反复修改的对象,建议将数据整体迁移到 JuiceFS,推荐用 juicefs sync 将数据写入 JuiceFS,但归功于 JuiceFS 的 POSIX 兼容性,你也可以用任意其他工具。