RGW对象存储网关学习1:数据组织与存储

本文主要为rgw对象存储网关学习

RADOS是一个基于对象的存储系统(这里的对象是指RADOS内部的一种数据存储单元,与对象存储中的对象概念有所区别)

为什么需要RGW

通常情况下应用通过RAODS抽象库librados提供的对象接口访问RADOS集群,但是librados只提供私有接口,并不支持HTTP协议访问。Ceph为了支持通用的HTTP接口设计了RGW(RADOS GateWay,即对象存储网关)系统。然后,如果RGW只提供通用的HTTP访问接口,应用需要花费较大的代价才能开发出适配RGW访问接口的软件,这不利于Ceph在云存储领域中迅速普及,因此RGW选择适配云存储领域中最广泛的Amazon S3和OpenStack Swift接口,使得现有的S3和Swift用户可以以较小的代价接入到Ceph提供的对象存储系统中。

RGW实际上是Ceph专门为对象存储应用提供RESTful接口访问RADOS集群的一个访问通道,同时为了方便应用使用,其提供的RESTful接口兼容目前在云存储领域中应用的最广泛的Amazon S3系统和OpenStack Swift系统所提供的对象访问接口。

对象存储系统的基础数据实体:

  • 用户
  • 对象

用户:

用户指的是对象存储的使用者,一个用户可以拥有一个或者多个存储桶。
一个用户对应一个RADOS对象。

用户管理设计主要基于以下几个方面考虑:

  1. 为了对RESTful API进行请求认证;
  2. 为了控制用户对资源(存储桶,对象等)的访问权限;
  3. 为了控制用户的可用存储空间。

因此,一个用户包含的信息包括用户认证信息,访问控制权限信息和配额信息

  • 用户认证信息

    S3用户身份认证机制都是基于密钥认证的。认证过程如下:

    发送请求前,使用用户私有密钥(secret_key),请求内容等,采用与RGW网关约定好的算法计算出数字签名后,将数字签名以及用户访问密钥(access_key)封装在请求中发送给RGW网关
    RGW网关收到请求后,使用用户访问密钥作为索引从RADOS集群中读取用户信息,并从用户信息中获取用户私有密钥
    使用用户私有密钥,请求内容等,采用与应用约定好的算法计算数字签名
    判断RGW生成的数字签名和请求的前面是否匹配,匹配则用户通过验证

  • 访问控制权限信息

  • 配额信息

下表为RGWUserInfo数据结构

字段 含义
user_id Tenent 用户所属租户,创建用户时指定,不指定的情况下,所有不指定租户的用户属于同一个租户
Id 用户ID,创建用户时指定
display_name 用户名
user_email 用户email地址
access_keys Id 用户访问密钥,用户身份认证时使用
Key 用户私有密码,用户身份认证时使用
swift_keys Subuser 子用户ID,创建子用户时指定
Key 子用户私有密钥,即Swift用户私有密钥
subusers Name 子用户ID
perm_mask 子用户访问权限,包括read、write、readwrite、full-control
Suspended 用户被暂停访问
max_buckets 用户可以创建的存储桶数目
op_mask 用户操作访问权限,包括read、write、delete,可设置多个权限的组合,比如{read、write}或{read、write、delete}
Caps 授权用户权限,授权用户根据授予的权限可以进行特殊的操作。
Caps由一组<caps-type, perm>组成:
caps-type指的是用户可访问的资源,有效值为:users、buckets、metadata、usage、mdlog、datalog、opstate、bilog
perm指的是用户对该资源具有什么权限,有效值为read、write、readwrite、*
比如一个用户的caps设置为“users=read”,表示该用户具有查询其他用户信息的权限
bucket_quota max_size 限制单个存储桶下所有对象的总大小
max_objects 限制单个存储桶下对象总数目
enabled 该字段为布尔类型,值为true时,配额生效
user_quota max_size 限制该用户下所有对象的总大小
max_objects 限制该用户下对象总数目
enabled 该字段为布尔类型,值为true时,用户配额生效

RGW将用户信息把保存在RADOS对象的数据部分,一个用户对应一个RADOS对象。由于大部分情况下我们需要使用用户ID作为索引获取用户信息,因此该对象以用户ID命名(RADOS通过‘‘pool名+对象’’来查询一个对象,后面解释pool)。

RGW需要将访问密钥,子用户,email和用户信息所在的RADOS对象建立索引关系,针对这种情况,RGW采用了二级索引的实现方式。即分别创建以用户访问密钥、子用户、email命名的三个RADOS对象(以下称索引对象),并且将用户ID保存在对象的数据部分。从而当需要使用某个索引查询用户信息时,首先从索引对象读出用户ID,然后使用用户ID作为索引读取用户信息。


桶:

存储桶是对象的容器。一个存储桶对应一个RADOS对象。

一个存储桶包含的信息分为两类:

  1. 一类是对象RGW网关透明的信息,这类信息通常指用户自定义的元数据,RGW将这些信息保存在对象的扩展信息中,一个KV键值对对应一个扩展属性条目;
  2. 一类是RGW网关关注的信息,包括存储桶中对象的存储策略,存储桶中索引对象的数目以及应用对象与索引对象的映射关系、存储桶的配额等,这类信息由数据结构RGWBucketInfo管理,保存在RADOS对象的数据部分。

下表为RGWBucketInfo关键字段

成员 含义
owner 存储桶的创建者或拥有者
placement_rule 存储桶中的对象的存储策略,存储策略关联用户上传的对象、bucket索引对象、分段上传对象产生的中间数据存放的存储池。存储池的存储策略在创建存储桶时指定,创建后将不能修改
index_type 0 当创建一个桶时,同时创建一个或多个存储对象,并且在有应用对象更新时,将对象记录在其中一个索引对象中
1 当创建一个桶时,同时创建一个或多个存储对象,但是在有应用对象更新时,不记录对象
num_shards 索引对象数目
quota 存储桶配额
bucket_index_shard_hash_type 当一个存储桶对应多个索引对象时,计算某个对象由哪个索引对象保存的算法,目前只支持一种算法:
索引对象=hash(object_name)%num_shards

创建存储桶时,RGW网关会同步创建一个或多个索引对象,用于保存改存储桶下的对象列表,以支持查询存储桶对象列表(List Bucket)功能,因此在存储桶中有新的对象上传或者删除时必须更新索引对象。

RGW采用了Ceph通常采用的解决方案,将索引对象分片(shard),把一个索引对象切分成多个对象,不同应用对象记录在不同的索引对象上。

这个方案极大的改观了对象的写性能,但是分片后带来的一个负面影响,会影响查询桶对象列表操作的性能。分片后原先只需要读一个索引对象就可以获取存储桶下对象列表变成了针对多个索引对象的读,这时,RGW网关与RADOS集群间的网络延时,多个索引对象查询结果的合并对查询存储桶对象列表性能产生很大的影响。

为了降低这个负面影响,RGW视图对多个索引对象并发读取代串行读,以降低查询存储桶对象列表操作的处理时间。但事物都有两面性,如果一味的增加索引对象的数目,与此同时归并排序所消耗的计算量和缓存也会增加,从而也制约了查询效率。


对象:

对象是对象存储系统数据组织和存储的基本单位,一个对象包含数据和元数据。数据指的是用户保存的真正的数据,比如一个文本文件的内容或者一个视频文件的内容;元数据指的是除了数据外的其他需要保存的信息,一般由KV键值对组成。(类似于创建桶时的两类信息)

与文件系统层级管理结构不同,对象存储系统中所有对象都以扁平方式存储,对象之间没有直接关联,这种特性很容易实现将不同的对象保存在不同的物理位置。此外,对象存储不提供编辑对象部分内容的功能,对象必须作为一个整体单元操作,即使只更新对象中的一个字符,也必须将整个对象从云端下载下来,更新后上传。

应用上传的对象包括数据和元数据两部分,数据部分保存在一个或者多个RADOS对象的数据部分,元素据保存在其中一个RADOS对象的扩展属性中。(为什么是一个或多个呢?因为前面提到的分片)

RGW对于单个对象提供了两种上传接口:整体上传和分段上传

  • 整体上传:

    RGW限制了整体上传一个对象器大小不能大于5GB,当用户上传的对象大于该限制时必须分段上传,否则上传对象失败。为了更好理解用户上传对象和RADOS对象的对应关系,先了解两个值和一个类:

    rgw_max_chunk_size:该宏值用来表示RGW下发到RADOS集群单个I/O的大小,同时决定应用对象分成多个RADOS对象时首对象的大小,以下简称分块大小

    rgw_obj_stripe_size:公司宏值用来指定当一个对象被分成多个RADOS对象时中间对象的大小,以下简称条带大小

    Class RGWWObjManifest:用来管理用户上传的对象和RADOS对象的对应关系,以下简称manifest

    整体上传时,

    • 当对象小于分块时,用户上传的一个对象只对应一个RADOS对象,该RADOS对象以应用对象名称命名,对象元数据也保存在该RADOS对象的扩展属性中;
    • 当用户上传的对象大于分块时,被分解成一个大小等于分块大小的首对象,多个大小等于条带大小的中间对象,和一个大小小于条带大小的尾对象。
  • 分段上传:

    分段上传对象时,RGW网关按照条带大小将每个分段分成多个RADOS对象。当所有的分段上传结束以后,RGW会另外生成一个RADOS对象,用于保存应用对象元数据和所有分段的manifest。


数据存储位置

前面分析了RGW数据的组织和存储方式,不同的用户数据最终以RADOS对象为单位保存到了RADOS集群中。为了实现不同的应用数据存储位置的隔离,RGW使用zone来管理用户数据的存储位置,zone由一组存储池(pool)组成,不同存储池用来保存不同的数据,RGW使用数据结构RGWZoneParams来管理不同的存储池。因此配置一个RGW实例时,需要指定该RGW实例所属的zone以及确定数据的存储位置。

下表为RGWZoneParams关键字段

字段 含义
domain_root 该存储池用来存储存储桶的信息
metadata_heap 该存储池用来存储存储桶的信息和用户信息,可不配置
control_pool RGW实例上电时,在该存储池中创建若干个对象用于watch-notify,主要作用为当一个zone包含多个RGW实例启动了缓存功能时,保证所有RGW实例间数据一致性,其基本原理为利用librados提供的对象watch-notify功能,当有数据更新时,通知其他RGW实例更新本地缓存
gc_pool RGW实例上电时,在该存储池中创建多个对象,用于记录在后台删除的对象。RGW实例会定期启动gc线程,删除记录的对象
lc_pool S3 API支持对象生命周期(对象生命周期过后,系统会自动删除对象)功能,该存储池用来记录对象生命周期的执行状态
log_pool 该存储池用来存储用户操作日志、数据同步日志等
usage_log_pool 该存储池用来存储用户操作统计信息,比如对象上传次数、下载次数等
user_keys_pool 该存储池用来存储用户访问密钥与用户ID的关系
user_email_pool 该存储池用来存储用户email与用户ID的关系
user_swift_pool 该存储池用来存储子用户与用户ID的关系
user_uid_pool 该存储池用来存储用户信息和记录每个用户下存储列表信息
placement_pool 应用对象的存储位置

需要重点强调的是placement_pools字段。该字段由map<string,RGWZonePlacementInfo>组成,string是一个自定义字符串,可以认为是一个对象存储策略,用来唯一定位第二个字段RGWZonePlacementInfo。第二个字段主要定义应用对象的存储位置、用户分段上传对象时的中间数据的存储位置和存储索引对象的存储位置等。当创建一个存储桶时,用户可以显式指定zone中已存在的存储策略,后续往存储桶中上传对象时,将按照该存储策略存储对象。

下表为RGWZonePlacementInfo关键字段

字段 含义
index_pool 该存储池用来保存存储同的索引对象
data_pool 该存储池用来保存应用上传的对象
data_extra_pool 该存储池用来保存分段上传对象所产生的中间数据
index_type 0 该存储策略下将存储桶下对象记录在索引对象中
1 该存储策略下不记录存储桶下对象列表
compression_type 当启动数据压缩时,指定压缩算法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容