【ceph】rgw介绍

架构图

rgw.jpg

RGW是什么?

rgw 作为对象存储网关系统, 一方面扮演RADOS集群客户端角色, 为对象存储应用提供数据存储; 另一方面扮演HTTP 服务端角色, 接受并解析互联网传送的数据。

RGW为Rados Gateway的缩写,ceph通过RGW为互联网云服务提供商提供对象存储服务。RGW在librados之上向应用提供访问ceph集群的RestAPI,支持Amazon S3和openstack swift两种接口。对RGW最直接的理解就是一个协议转换层,把从上层应用符合S3或Swift协议的请求转换成rados的请求,将数据保存在rados集群中。

内部概念

  • zone:包含多个RGW实例的一个逻辑概念。zone不能跨集群,同一个zone的数据保存在同一组pool中。
  • zonegroup:一个zonegroup如果包含1个或多个zone。如果一个zonegroup包含多个zone,必须指定一个zone作为master zone,用来处理bucket和用户的创建。一个集群可以创建多个zonegroup,一个zonegroup也可以跨多个集群。
  • realm:一个realm包含1个或多个zonegroup。如果realm包含多个zonegroup,必须指定一个zonegroup为master zonegroup, 用来处理系统操作。一个系统中可以包含多个realm,多个realm之间资源完全隔离。

外部概念

  • user:对象存储的使用者,默认情况下,一个用户只能创建1000个存储桶。
  • bucket:存储桶,用来管理对象的容器。
  • object:对象,泛指一个文档、图片或视频文件等,尽管用户可以直接上传一个目录,但是ceph并不按目录层级结构保存对象, ceph所有的对象扁平化的保存在bucket中。

用户认证

一个用户包含的信息包括用户认证信息、 访问控制权限信息和配额信息;要了解用户认证信息有哪些,必须要先了解RGW的认证机制, RGW针对S3 API和Swift API采用不同的认证机制。

S3认证过程

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

可以看出,在S3认证机制中,用户信息中必须包含访问密钥和私有密钥信息

Swift认证过程

  1. 应用在发出真正的操作请求前, 向RGW网关请求一个令牌(注: 该令牌有有效期, 过了有效期后, 需要重新请求新的令牌)。
  2. RGW收到令牌请求后, 使用子用户ID作为索引从RADOS集群中读取出子用户信息, 并从子用户信息中获取到Swift私有密钥(swift_key) 生成一个令牌返回给应用。
  3. 应用后续操作中携带该令牌, RGW收到操作请求后, 采用与步骤2相同的方式生成一个令牌, 并判断与请求中的令牌是否一致, 如果一致, 身份验证通过。

可以看出,Swift认证机制中必须包含Swift私有密钥。

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

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

存储桶(Bucket)

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

# radosgw-admin bucket stats --bucket=First-bucket
{
    "bucket": "First-bucket",
    "zonegroup": "5c1d9087-3ee8-41c4-81ca-3f348c55ce59",
    "placement_rule": "default-placement",
    "explicit_placement": {
        "data_pool": "",
        "data_extra_pool": "",
        "index_pool": ""
    },
    "id": "1bc69cea-9bcd-4be6-979e-d98ab2faa66c.4211.1",
    "marker": "1bc69cea-9bcd-4be6-979e-d98ab2faa66c.4211.1",
    "index_type": "Normal",
    "owner": "radosgw",
    "ver": "0#141",
    "master_ver": "0#0",
    "mtime": "2018-12-06 16:55:49.868164",
    "max_marker": "0#",
    "usage": {
        "rgw.main": {
            "size": 208651,
            "size_actual": 266240,
            "size_utilized": 208651,
            "size_kb": 204,
            "size_kb_actual": 260,
            "size_kb_utilized": 204,
            "num_objects": 18
        }
    },
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    }
}

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

对象(Object)

应用上传的对象包括数据和元数据两部分,数据部分保存在一个火多个RADOS对象的数据部分,元数据保存在其中一个RADOS对象的拓展属性中。RGW对单个对象提供了两种上传接口:整体上传和分段上传。

池(Pool)

RGW中含有多种pool,通过以下命令可以获得:

# rados lspools
rbd
.rgw.root
default.rgw.control
default.rgw.data.root
default.rgw.gc
default.rgw.log
default.rgw.users.uid
default.rgw.users.keys
default.rgw.users.swift
default.rgw.buckets.index
default.rgw.buckets.data

各种pool的作用

  • .rgw.root 包含realm,zonegroup和zone
  • default.rgw.control在RGW上电时,在control pool创建若干个对象用于watch-notify,主要作用为当一个zone对应多个RGW,且cache使能时, 保证数据的一致性,其基本原理为利用librados提供的对象watch-notify功能,当有数据更新时,通知其他RGW刷新cache, 后面会有文档专门描述RGW cache
  • default.rgw.data.root:包含bucket和bucket元数据,bucket创建了两个对象:一个是< bucket_name > ;另一个是.bucket.meta.< bucket_name >.< marker > 这个marker是创建bucket中生成的。同时用户创建的buckets在.rgw.buckets.index都对应一个object对象,其命名是格式:.dir.< marker
  • default.rgw.gc:RGW中大文件数据一般在后台删除,该pool用于记录那些待删除的文件对象
  • default.rgw.log:各种log信息
  • default.rgw.users.uid:保存用户信息,和用户下的bucket信息
  • default.rgw.users.keys:包含注册用户的access_key
  • default.rgw.users.swift:包含注册的子用户(用于swift)
  • default.rgw.buckets.index:包含bucket信息,和default.rgw.data.root对应
  • default.rgw.buckets.data:包含每个bucket目录下的object

default.rgw.data.root,default.rgw.buckets.index和default.rgw.buckets.data 之间有直接的联系

用户/存储桶/对象访问权限控制

通过身份验证后,并不意味着一定有访问资源(桶,对象等)的权限,用户必须具备相应的访问权限(ACL)才能访问对应的对象。

针对S3 API,访问控制列表分为存储桶访问控制列表和对象访问控制列表,分别作用域存储桶本身和对象本身。

对于Swift API在权限访问控制上与S3 API有所不同,Swift访问控制权限分为用户访问控制列表和存储桶访问控制列表。

bucket/用户配额

通常限制单个应用或者用户可以使用的最大存储空间称为配额管理,配额管理是对最大存放的对象数目和对象的总大小进行限制的,支持对单个用户和单个用户下存储桶的配额限制, 分别用user_quota和bucket_quota表示。当两种配额模式同时启用时,任何一种先打到了配额限制都会生效。

用户操作权限判断

在实际操作前,需要对用户权限进行判断,如:只有具有删除权限的用户才能对对象进行删除操作,对应用户信息的op_mask字段。

经过以上4步完成后,针对不同的操作请求执行具体的请求操作,下面以存储桶创建,对象上传,对象下载操作请求为例,具体介绍实现流程。

参考

https://blog.csdn.net/younger_china/article/details/73410727
https://blog.csdn.net/redenval/article/details/79486673

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335