本文标题中提到的文件语义,指的是POSIX规范。

S3指的是AWS提供的对象存储服务以及相关接口。为方便描述,下文中以对象语义替代S3接口语义。

文件语义和对象语义存在比较多的差异。

对象语义不支持文件语义的部分特性,比如:

  • 目录的操作,创建、删除、修改名称。
  • 文件的部分操作,追加写、随机写、修改名称等。
  • 文件的元数据,比如:
    • 时间字段,即crtime/ctime/mtime/atime。
    • 用户和组,即uid/gid。
    • 权限,即UGO和ACL。
    • 文件的扩展属性。
    • 硬链接。
    • 软链接。
    • 锁。

文件语义不支持对象语义的部分特性,比如:

  • Etag,文件语义中没有定义相关信息。
  • 生命周期管理。
  • 桶策略。
  • 多版本。
  • 对象的元数据,即:
    • 系统元数据,即标准HTTP头部。
    • 用户自定义元数据,即命名为x-amz-meta-*的HTTP头部。
    • 对象tagging,即命名为x-amz-tagging的HTTP头部。

部分存在差异的语义,比如:

  • WORM,文件语义和对象语义的实现,由于前述差异,具体实现和保护范围可能存在一定的差异。
  • 文件的创建。依据对象语义,保存对象的操作是一个原子行为,包含数据、元数据一并写入,要么成功、要么失败,只要上传对象的接口返回了成功,即表示对象创建成功。而依据文件语义,保存文件的操作,涉及打开、写入数据、写入元数据、关闭文件等操作,并不是原子行为,写入数据的过程中可能会被中断,但由于文件打开成功,因此会出现数据不一致的现象。
  • 目录,对象语义对目录的支持非常有限,而文件语义则提供了丰富的API。

对象语义中,使用对象来表示客户的数据,在存储和管理对象时,放弃了目录的概念,所有的对象均以展平的形式存储,在使用文件语义实现对象语义时,需要对目录做特殊的处理。

在文件语义中,/有特殊含义,表示目录的分隔符,因此一般不允许在目录名或者文件名中使用。

AWS S3定义的规范中,/是普通字符,允许在对象名中使用。

做个实验,登录Linux环境的控制台,执行如下命令,输出如下:

$ ll a.py
-rw-r--r-- 1 jackie docker 138 3月 29 21:47 a.py
$ mkdir a.py
mkdir: cannot create directory ‘a.py’: File exists
$ mkdir a.py/
mkdir: cannot create directory ‘a.py/’: File exists

依据对象语义,a.pya.py/是不同的对象,但在文件语义下,a.py存在,则阻塞目录a.py的创建操作。

依据文件语义,删除目录即类似rm -rf /path/to/delete时,目录和目录下的所有的文件、目录均会被删除。

考虑到本操作并不是一个原子操作,因此使用文件语义实现对象语义的删除操作时,会有比较多的注意事项。

思考点

  • 删除目录时,目录下的对象,需要一并删除。假如对象数量比较多时,则删除操作将比较耗时。
  • 目录下假如存在未合并的多段对象,是否一并删除。
  • 目录下假如仅有一个对象,使用对象语义的删除接口,将该对象删除时,目录是否需要被删除。
  • 先上传目录,上传一个对象至该目录下,使用对象语义的删除接口,将该对象删除时,目录是否需要被删除。
  • 手工上传的目录,在列举对象时,是否作为一个对象在列举结果中出现。
  • 如前所述,文件主义并不支持对象主义的Etag,因此在实现上传对象的操作时,需要计算并保留Etag值。
    • 保存对象的数据的操作,计算MD5值的操作,二者需要保持进度一致,避免MD5值计算结果不正确,或者耗时过久,影响上传操作的性能。
    • Etag保存的位置。
  • 对象元数据的保存位置,依据语义,需要和数据一起保存。
    • 元数据保存的位置。
    • 操作的原子性。
  • 对象语义写入对象时,文件的元数据,应当如何填值。如前述,不支持的元数据,如下:
    • 时间字段,即crtime/ctime/mtime/atime。
    • 用户和组,即uid/gid。
    • 权限,即UGO和ACL。

基于文件语义实现S3接口语义的注意事项的更多相关文章

  1. 基于MIndSpore框架的道路场景语义分割方法研究

    基于MIndSpore框架的道路场景语义分割方法研究 概述 本文以华为最新国产深度学习框架Mindspore为基础,将城市道路下的实况图片解析作为任务背景,以复杂城市道路进行高精度的语义分割为任务目标 ...

  2. 使用COSBench工具对ceph s3接口进行压力测试

    一.COSBench安装 COSBench是Intel团队基于java开发,对云存储的测试工具,全称是Cloud object Storage Bench 吐槽下,貌似这套工具是intel上海团队开发 ...

  3. JMeter基于http请求的web接口性能测试总结

    [本文出自天外归云的博客园] 基于http请求的web接口性能测试总结 压测的目的:对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值.memory是否发生 ...

  4. 实现基于文件存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...

  5. 【科研论文】基于文件解析的飞行器模拟系统软件设计(应用W5300)

    摘要: 飞行器模拟系统是复杂飞行器研制和使用过程中的重要设备,它可以用来模拟真实飞行器的输入输出接口,产生与真实系统一致的模拟数据,从而有效避免因使用真实飞行器带来的高风险,极大提高地面测发控系统的研 ...

  6. Hadoop基于文件的数据结构及实例

    基于文件的数据结构 两种文件格式: 1.SequenceFile 2.MapFile SequenceFile 1.SequenceFile文件是Hadoop用来存储二进制形式的<key,val ...

  7. 【ALB学习笔记】基于事件触发方式的串行通信接口数据接收案例

    基于事件触发方式的串行通信接口数据接收案例 广东职业技术学院  欧浩源 一.案例背景 之前写过一篇<基于多线程方式的串行通信接口数据接收案例>的博文,讨论了采用轮询方式接收串口数据的情况. ...

  8. 【安富莱专题教程第1期】基于STM32的硬件RGB888接口实现emWin的快速刷新方案,32位色或24

    说明:1. 首先感谢ST终于推出了ARGB格式的emWin库,可谓千呼万唤始出来,使用STM32的硬件RGB888接口刷新图片慢的问题终于得到解决.2. 这个问题由来已久,是之前为我们的STM32-V ...

  9. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

  10. ceph储存的S3接口实现(支持断点续传)

    最近公司准备接ceph储存,研究了一番,准备用亚马逊的s3接口实现,实现类如下: /** * Title: S3Manager * Description: Ceph储存的s3接口实现,参考文档: * ...

随机推荐

  1. OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

    前言   相机标定,重映射可以进行插值映射从而矫正图像,这是一种方法,也有矩阵映射方法,本篇使用重映射方式解说畸变矫正的计算原理.   Demo   横向纵向区域固定拉伸:     横向纵向拉伸:   ...

  2. RK3568开发笔记(八):开发板烧写buildroot固件(支持hdmi屏),搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试

    前言   前面发现开发板用ubuntu固件发现空间不够,本篇使用buildroot固件,来实现目标板运行qt界面应用.   烧写buildroot固件   这部分更详细的参照<RK3568开发笔 ...

  3. FFmpeg开发笔记(八):ffmpeg解码音频并使用SDL同步音频播放

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  4. os.path.relpath和os.path.basename,返回文件路径中的文件名

    from os import path print(path.relpath("/home/hpcadmin/lw/demo.py", start="/home/hpca ...

  5. 1.Go 的基本数据类型

    Go 的基本数据类型

  6. 【Azure Service Bus】使用Spring Cloud integration示例代码,为多个 Service Bus的连接使用 ConnectionString 方式

    问题描述 查看Service Bus的Java示例代码,发现使用Spring Cloud Integration,配置 Application.yaml 可以连接到两个Service Bus. 但代码 ...

  7. 【Azure K8S】记录AKS VMSS实例日志收集方式

    问题描述 如何从AKS的VMSS集群中收集实例日志? 参考步骤 第一步:登陆VMSS实例 参考官网步骤:使用 SSH 连接到 Azure Kubernetes 服务 (AKS) 群集节点以进行维护或故 ...

  8. 【Azure Developer】使用REST API获取Activity Logs、传入Data Lake的数据格式问题

    问题一:.  如何在用REST API获取活动日志时,控制输出的项? [答]参考REST API对于获取活动日志的说明接口,在参数是$filter和$select中可以分别控制过滤条件和输出项 GET ...

  9. minio通过docker方式部署

    MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储. 它是与 Amazon S3 云存储服务兼容的 API 官方文档http://docs.minio.org.c ...

  10. css 布局整理2022-4

    理解CSS3里的Flex布局用法(转自网上,博客园修改一些方便更易看懂) 简单有法: 几个横排元素在竖直方向上居中 display: flex; flex-direction: row;//横向排列 ...