基础的存储格式
存储引擎中存储的数据单元称为rados对象,并提供了以下两种与数据相关的rados对象:
- omap:提供了基于KV的数据类型,可以做set/get/rm/list等操作。
- 文件类型:提供了类似于文件系统中文件的数据类型,可以做读写数据/xattr等操作。
用户数据
当我们使用对象存储服务的时候,需要为用户开通服务,开通时会产生用户数据,每个用户数据在存储引擎中,都对应若干个rados对象,保存该用户key信息、email信息,桶列表等,其中用户key信息、email信息都是通过文件形式存储;桶列表,是通过omap形式存储。
桶数据
桶(Bucket)是存储对象的容器,所有的对象都必须隶属于某个容器。可以设置和修改容器的属性,用来控制地域、访问权限、生命周期等,这些属性设置直接作用于该存储空间内所有对象,因此可以通过灵活创建不同的容器来完成不同的管理功能。
桶的属性通过文件的扩展属性来表示;桶中的对象列表,通过OMAP来表示。
对象数据
对象(Object)是数据存储的基本单位,一个对象是一个文件的数据与其相关属性信息(元数据)的集合体,用户上传至对象存储的数据都以对象的形式保存在桶中。文件可以是文本、图片、音频、视频等,用户可以上传、下载、删除和共享Object。
每个对象,由两部分数据组成:对象的数据和元数据。
每个对象,会被对象网关按照固定大小拆分成多个rados对象(条带)进行存储,元数据以扩展属性的形式,存储于第一个rados对象上。
根据对象数据的存储格式,可以分为两类,原子上传的对象和分段上传的对象。
原子上传的对象
用户对象被拆分成一个头对象和若干个尾对象,除了最后一个尾对象,中间对象的大小都是固定的。
头对象的命名格式:bucket-id+_+对象名称,对象的元数据保存在该头对象的扩展属性里。
尾对象的命名格式:bucket-id+_+“shadow_” + “.” + “32bit 随机字符串” + “_” + “条带编号”,其中条带编号从1开始。
示例:
上图示例中,通过s3cmd上传了一个不到14MB的文件,该文件被拆分成4个对象,一个头对象,三个尾对象,除了最后一个尾对象不足4MB,其他三个对象的大小均为4MB,而且在头对象上通过扩展属性的形式保存了该对象的元数据。
分段上传的对象
用户主动将一个对象拆分成多个分段进行上传。
对象网关将每个分段拆分成一个分段头对象和若干个尾对象,除了最后一个尾对象,中间对象的大小都是固定的。
用户的每个对象,会生成以下若干个rados对象:
- 头对象:大小为0,bucket-id+_+对象名称,对象的元数据保存在该头对象的扩展属性里。
- 分段头对象:bucket-id+“_” + “_multipart_” + “用户上传对象名称” + “分段上传ID” + “分段编号”,分段编号从1开始。
- 分段尾对象:bucket-id+“_”+“_shadow_” + “用户上传对象名称” + “分段上传ID” + “分段编号” + “_” + “条带编号”,条带编号,从1开始。
示例:
在上图的示例中,用户使用s3cmd,通过分段上传(每段15MB)的方式,上传了一个不足48MB的文件,一共分了4段进行上传,除了最后一段不足15MB以外,其他的分段均为15MB。
该48MB的文件在存储引擎侧,一共被分为14个rados对象来存储,其中1个头对象(大小为0),4个分段对象,除最后一个分段对象外,前三个分段对象,都是由1个分段头对象和3个分段尾对象组成。
在头对象上,通过扩展属性保存了该对象的元数据。