Rgw数据是如何存储在ceph中的_1 理论知识
首先贴出参考资料:
- 《ceph 设计原理和实现》rgw章节 —
一. 上传的对象
应用上传的对象包含数据和元数据两部分,数据部分保存在一个或者多个rados对象的数据部分,元数据保存在其中一个rados对象的拓展属性中(xattr)。RGW对象提供两种上传接口:整体上传和分段上传,整体上传对象最大不能超过rgw_max_put_size (默认5G).
1.整体上传
rgw_max_chunk_size
改宏值表示RGW下发到RADOS集群单个IO的大小,同时决定应用对象分成多个rados对象时首对象的大小,简称分块
rgw_obj_stripe_size
该宏值用来指定当一个对象被分成多个RADOS对象的时候中间对象的大小,简称条带大小。
Class RGWObjManifest > 管理用户上传的对象和RADOS对象的对应关系,简称manifest
1.1 整体上传过程
整体上传一个对象的时候,当对象小于分块(max chunk)的时候,上传的对象对应一个RADOS对象,改对象以应用对象名称命名,应用对象的元数据也保存在这个RADOS对象的拓展属性中;
当用于上传的对象大于分块时,被分解为一个大小等于分块的首对象,多个大小等于条带大小的中间对象,和一个小于等于条带大小的尾对象。如下图所示,首对象以应用对象名命名,在RGW中改对象成为headobj。改对象的数据部分保存了应用对象前max chunk 字节的数据,拓展属性部分保存了应用对象的元数据和manifest信息,中间对象和尾对象保存应用对象剩余的数据,对象名称为:
“shadow” + “.” + “32bit随机字符串” + “_” + “条带编号”
其中条带编号从1开始编号。
2.分段上传
rgw_multipart_min_part_size
默认值为5M,分段上传中最小的分段大小,因为客户端可以自定义上传时候分段的大小,如果小于这个值,那么会报错
rgw_max_put_size
默认值为5G,当文件大于5G的时候必须采用分段上传。(但是就算我文件20M也会采用分段上传,那么是不是客户端可以在5G范围内的文件自由的选择整体上传跟分段上传方式?)
2.1 分段上传过程
分段上传一个对象的时候,rgw按照条带大小将每个分段分成多个RADOS对象,每个分段的第一个RADOS对象名称为:
“multipart” + “用户上传对象名称” + “分段上传id” + “分段编号”
其余的对象的名称为:
“shadow” + “用户上传对象名称” + “分段上传id” + “分段编号” + “_” + “条带编号”值的注意的是用户上传的每个分段大小最好能被条带整除,如果不能整除,可能会导致上传后,rados数目和大小分布不均
比如上传 20M的文件,分段大小为15M,上传后第一个分段大小为 15M,第二个为5,那么整个对象被分为 4M,4M,4M,3M,4M,1M到小的6个rados对象,如果分段为16M,则第一个分段为16M,第二个为4M,上传后分为 4M,4M,4M,4M,4M五个rados对象,对象越多管理数据越多。尽可能少对象。