使用Appendable对象支持边写边读

更新时间:
复制为 MD 格式

ossfs 2.0支持在写入时使用Appendable类型的对象(Object)实现对文件的边写边读功能。该功能适用于日志写入等场景,例如程序一般日志或AI训练日志TensorBoard等。

基本原理

ossfs 2.0默认使用UploadPart接口上传大文件分片,并在文件关闭时调用CompleteMultipart接口完成分片合并。由于未完成分片合并的文件在OSS中不可读,因此在文件关闭前,无法从ossfs 2.0的挂载点读取正在写入的文件内容。

ossfs 2.0支持使用AppendObject接口进行文件上传,解决边写边读场景需求。

  • 实现原理:将标准对象转为可追加(Appendable)类型的对象,Appendable类型的对象支持持续追加写入数据,且已写入部分可实时读取,从而实现写入过程中并发访问。

  • 使用方法:挂载时添加--enable_appendable_object=true选项,使该挂载点下所有对象的写入方式均切换到AppendObject。还支持配置--appendable_object_autoswitch_threshold选项开启自动转换Appendable对象的能力。

  • 使用限制:单个文件最大支持5 GiB,超过将导致写入失败。

  • 适用场景:日志写入等需要边写边读的场景。

方案对比

说明

在本文中“追加写入”是指完整的一组打开文件、写入文件和关闭文件操作。因此单次打开文件后写入多次数据的操作被视为一次“追加写入”。

对比项

默认模式

Appendable对象模式

文件追加数据方式

  1. OSS文件中的已有数据调用UploadPartCopy接口,追加写入的数据调用UploadPart接口

  2. 文件关闭时调用CompleteMultipartUpload接口完成上传

调用AppendObject接口

频繁追加写入少量数据

性能差,文件越大所需的OSS拷贝时间越长

性能好,无拷贝开销,仅一次网络请求

单次追加写入大量数据

性能好,追加写入的数据可并发上传

性能差,追加写入的数据需串行上传

文件大小限制

5 GiB

边写边读

不支持

支持

对象类型自动转换

OSS默认不支持对标准对象进行AppendObject操作。当使用--enable_appendable_object=true选项挂载时,对OSS中已存在的标准对象追加写入数据会报错。

因此ossfs 2.0提供了--appendable_object_autoswitch_threshold选项用于开启自动转换Appendable对象的能力。对于文件大小不超过该阈值的标准对象将在第一次写入时自动进行转换。

重要

AppendObject接口只能串行执行,将较大的标准对象转换为Appendable对象时需花费较长的时间。ossfs 2.0默认不会进行自动转换,请显式配置挂载选项启用该功能。

自动转换的操作步骤如下:

  1. 将原对象重命名为一个OSS中的临时对象,其对象名前缀为.ossfs_hidden_file。

  2. OSS中读取该对象并使用AppendObject接口上传到原路径。

  3. 所有数据上传完成后删除临时对象。

重要

如果在转换过程中发生服务宕机等异常情况,转换中的文件完整数据需从对应的临时对象中通过重命名操作手动恢复。