架构图
rgw.jpgRGW是什么?
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认证过程
- 应用在发送请求前, 使用用户私有密钥(secret_key) 请求内容, 采用与RGW网关约定好的算法计算出数字签名后, 将数字签名以及用户访问密钥(access_key) 封装在请求中发送给RGW网关。
- RGW网关收到请求后, 使用用户访问密钥作为索引从RADOS集群中读取用户信息, 并从用户信息中获取用户私有密钥。
- 使用用户私有密钥请求内容等, 采用与应用约定好的算法计算数字签名。
- 判断RGW生成的数字签名与请求的签名是否匹配, 如果匹配, 则认为请求是真实的, 用户认证通过。
可以看出,在S3认证机制中,用户信息中必须包含访问密钥和私有密钥信息
Swift认证过程
- 应用在发出真正的操作请求前, 向RGW网关请求一个令牌(注: 该令牌有有效期, 过了有效期后, 需要重新请求新的令牌)。
- RGW收到令牌请求后, 使用子用户ID作为索引从RADOS集群中读取出子用户信息, 并从子用户信息中获取到Swift私有密钥(swift_key) 生成一个令牌返回给应用。
- 应用后续操作中携带该令牌, 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
网友评论