ceph对象存储
一.Ceph对象存储的概念
ceph是一种分布式对象存储系统,通过ceph对象网关提供对象存储接口,也称为RADOS网关(RGW)接口。它构建在Ceph RADOS之上。RGW使用librgw(RADOS Gateway library)和librados,允许应用程序与ceph对象存储建立连接。RGW为应用程序提供了一个RESTful S3/swift兼容的接口,用于在ceph集群中以对象的形式存储数据。ceph还支持多租户对象存储,可以通过RESTful API访问。此外,RGW还支持ceph管理API,可以使用本机API调用来管理ceph存储集群。librados软件库非常灵活,允许用户应用程序通过C、C++、java、python和php绑定直接访问ceph存储集群。ceph对象存储还具有多站点功能,即灾难恢复提供解决方案。
根据架构图可以看出,对于RGW来说,它对于上层的APP来讲充当HTTP Server,对于下层的RADOS集群作为RADOS Client。RGW作为HTTP Server接收和解析HTTP客户端的请求,RGW作为RADOS Client为对象存储应用提供数据存储的通道,将应用请求数据处理并发送至RADOS中存储。
二.RGW对外的三类基础数据逻辑实体
- 用户
- 存储桶
- 对象
2.1 用户
RGW兼容AWS S3和OpenStack Swift。RGW User对应S3 User,也对应Swift Account,RGW subuser对应Swift user。
用户数据信息包含:
- 用户认证信息: S3(access key,secret key),Swift(secret key)
- 访问控制权限信息: 包含操作访问权限(read、write、delete等)和访问控制列表
- 用户配额信息: 防止某些用户占用过多存储空间,根据用户付费情况配置存储空间
2.2 存储桶
存储桶是对象的容器,是为了方便管理和操作具有相同属性的一类对象而引入的一级管理单元。
存储桶信息包含:
-
基础信息: (保持在对应RADOS对象的数据部分)RGW关注的信息,包含bucket配额信息(最大对象数目和最大对象大小总和),bucket placement rule,bucket中的索引对象数目等等。其中bucket placement rule包含index pool(存储桶的索引对象),data pool(对象数据),data extra pool(分段上传的中间数据)
-
扩展信息: (保存在对应RADOS对象的扩展属性)对RGW透明的一些信息,如用户自定义的元数据信息。
2.3 对象
RGW中的应用对象对应RADOS对象。应用对象上传分整体上传和分段上传,不同的上传方式应用对象对应RADOS对象的方式不同。
这里涉及三个概念:
- rgw_max_chunk_size: 分块大小,RGW下发至RADOS集群的单个IO的大小。
- rgw_obj_stripe_size: 条带大小,multipart除首对象外的分段其它大小。
- class RGWObjManifest: 管理应用对象和RADOS对象的对应关系。
2.3.1 整体上传
-
应用对象大小小于等于分块大小: 用户上传的一个对象只对象一个RADOS对象,该RADOS对象以应用对象名称命名,应用对象元数据也保存在该RADOS对象的扩展属性中。
-
应用对象大小大于分块大小: 应用对象被分解成一个大小等于分块大小的首对象。多个大小等于条带大小的中间镜像,和一个大小小于条带大小的尾对象。首对象以应用对象名称命名,在RGW中将该对象称为head_obj,该对象的数据部分保持了应用对象前rgw_max_chunk_size字节的数据。扩展属性部分保存了应用对象的元数据和manifest信息。中间对象和尾对象保存应用对象剩余的数据,对象名称为"shadow_" + "." + "32bit随机字符串" + "_" + "条带编号",其中条带编号从1开始。
2.3.2 分段上传
RGW依照条带大小将应用对象的每一个分段分成多个RADOS对象,每个分段的第一个RADOS对象名称为:
"multipart" + "用户上传对象名称" + "分段上传ID" + "分段编号"
其余对象名称为:
"shadow" + "用户上传对象名称" + "分段上传ID" + "分段编号" + "_" + "条带编号"
当所有的分段上传结束后,RGW会从data_extra_pool中的分段上传临时对象中读取各个分段信息。主要是各分段的manifest信息组成一个manifest,然后生成一个新的RADOS对象,即head obj,用来报错分段上传的应用对象的元数据信息和各分段的manifest