Ceph

【ceph】rgw介绍

2018-12-10  本文已影响0人  小醉90s

架构图

rgw.jpg

RGW是什么?

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

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

内部概念

外部概念

用户认证

一个用户包含的信息包括用户认证信息、 访问控制权限信息和配额信息;要了解用户认证信息有哪些,必须要先了解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的作用

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

上一篇 下一篇

猜你喜欢

热点阅读