《存储漫谈Ceph原理与实践》第三章接入层3.2对象存储RGW(三)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 《存储漫谈Ceph原理与实践》第三章接入层3.2对象存储RGW

3.2.3       I/O路径

RGWRADOSGateway, 顾名思义是 RADOS对象存储系统上层的一个网关服务,根据网关的功能定义,网关负责完成不同协议的转换和对接。在Ceph场景中,RGW即完成类似的功能:接收用户 S3/Swift接口规则的数据存取请求,然后将其转化为后端RADOS能够处理的操作。

RGW 的请求处理经历了3 个阶段:

(1)  Web框架主要负责接收用户请求,RGW中常用的 Web框架包括 CivetWeb、Apache、Beast等;

(2)   根据用户请求类型,分别选择不同的RESTMgr针对不同的ResourceHandlerRGWOp来处理用户的具体业务,梳理出用户的请求数据;

(3)   将用户的业务请求转换为对 RADOS层数据读写请求的封装, 具体操作由RGWRados完成。

RGW的业务架构示意如图 3-29所示。请求到达 RGW网关后,在 RGWFrontend做相应转发,请求到达RGWRESTMgrRGWRESTMgr依照请求资源类型,对请求做相应的 RGWHandler层的资源实例化工作。

RGWHandler层中实例化后的请求,首先进行前置处理,完成基本信息的校验等工作,在校验完成后,调用相关的业务接口RGWOp完成 BucketObject的请求处理, 并RGWOp中,调用终极接口 RGWRados,完成 RGW数据的最终落盘RGWRadosRGW网关模块和后端的 RADOS底层存储系统交互的窗口RGW请求处理流程见3-30

image.png

3-29    RGw 业务架构示意

image.png

3-30    RGw 请求处理流程

 

对应上述业务处理过程,RGW中会有 3个重要的数据结构:RGWFrontend、RGWRESTMgrRGWHandler。

 

◆  RGWFrontendRGWFrontendRGWWEB前端类的封装,用于处理 HTTP(s)相关的请求,完成RGW业务逻辑中的 WEB 框架接收用户请求的功能。目前最新的 WEB框架是 Beast。

◆  RGWRESTMgrRGWRESTMgr负责RGW 处理的资源类型区分,RGWRESTMgr包含了多种不同类型的路径和资源,并可根据请求资源类型的不同,将请路由到不同的业务逻辑来进行处理(请求的实例化工作

◆  RGWHandlerRGWHandler负责具体的用户请求处理,如客户使用 S3规范进行业务请求,该层中会调用S3相关的 RGWHandler,后续操作如下。

(1) RGWHandler_REST_Service_S3

负责处理S3 用户类型请求,包括获取用户的统计信息、用户的桶列表、S3账户访问权限设置等。

(2) RGWHandler_REST_Bucket_S3

负责处理S3桶类型请求,包括桶的ACL权限列表、生命周期规则以及具体的创建/除桶等操作。

(3) RGWHandler_REST_Obj_S3

负责处理 S3Object类型请求, 包括 ObjectACL权限列表、Tagging及具体的Object数据操作(简单上传、分块上传、删除)等。

3.2.4   元数据/数据布局

前面提到过,CephRGW将数据组织分为 3种类型:Metadata、bucketindexdata。Metadata是对象的元数据, 包含 user、bucket、bucket.instance、OTP等信息;bucketindex 是对象的索引,严格意义上,也可以将其归类到元数据范畴内;data是对象的数据,每个 RGW对象(rgw-object)都会保存在一个或多个 RADOS对象(system-object)里。

CephRADOS层中的对象(system-object,通常以下列3种形式进行组织。

◆  RADOS对象 Data

◆  RADOS对象扩展属性 xattr

◆  RADOS 对象 OMAP。

 

1.  RGW Metadata

 

CephRGW 的元数据包含以下信息。

 

◆  user:用来保存用户信息。

◆  bucket:用来维护 bucketnamebucketinstanceID的映射。

◆  bucket.instance:用来保存 bucketinstance信息。

OPT(One-timePassword mechanism):Ceph  N 版新增特性,可以根据虚拟或硬件MFA(Multi-factorAuthentication)设备,基于 OTP算法生成一个密码。

可以使用如下命令查看当前 RGW元数据的类别。

# ./bin/radosgw-admin metadata list[

"bucket""bucket.instance"

"otp

"user"

]

 

(1) User元数据

通过以下命令查看某个用户的元数据。

#./bin/radosgw-adminmetadata getuser:john

{

"key": "user:john""ver": {

"tag": "_l1Bbi640q1-AJVYHHiY_mJk""ver": 1

}

"mtime":"2020-08-30T08:14:09.884832Z"

"data": {

"user_id": "john""display_name:john

"email":""

"suspended":0

"max_buckets":1000

"subusers":[]

"keys": [

{

"user": "john""access_key": "john""secret_key":"john"

}

 

 

]

"swift_keys":[]

"caps":[]

"op_mask": "read write delete""default_placement": """default_storage_class": """placement_tags": []"bucket_quota":{

"enabled": false"check_on_raw": false"max_size":-1

"max_size_kb":0

"max_objects":-1

}

"user_quota": {"enabled": false"check_on_raw": false"max_size":-1

"max_size_kb":0

"max_objects":-1

}

"temp_url_keys": []"type": "rgw

"mfa_ids":[]

"attrs":[]

}

}

 

这些 user信息存储在存储池 {zone}.rgw.metausers:{field}命名空间里,field段当前有 keys、swift、email、uid,分别对应用户的 S3密钥对、Swift密钥对、邮箱、用ID等信息。

例如,users.uid命名空间里,包含了用户john对应的两个 RADOS对象 {uid} 和 {uid}.bucketjohnjohn.bucket,john对象里存储着用户基本信息数据,john.bucketsOMAP形式保存着用户的存储桶信息。通过 RADOS命令可以查看。

 

#./bin/rados ls-p default.rgw.meta --namespace=users.uid| grep john

john.bucketsjohn

 

{user_id}.bucketsOMAP形式保存。OMAPKey为用户拥有的存储桶名,当用户需要列出自己的桶列表时,就对OMAPKey遍历来获取。OMAPValue为桶的基本信息,如桶名、桶 ID、桶内对象大小、对象数量、桶创建时间等。

可以通过以下命令查看。

####使⽤ RADOS命令查看⽤户john拥有的存储桶

#./bin/radoslistomapkeys-pdefault.rgw.meta--namespace=users.uidjohn.buckets

john-bkt1

#### 获得 OMAPValue,然后解析出内容

#./bin/radosgetomapval-pdefault.rgw.meta--namespace=users.uid john.

buckets john-bkt1 john-bkt1.txtWritingto john-bkt1.txt

 

# ./bin/ceph-dencoder import john-bkt1.txt type cls_user_bucket_entry decodedump_json

{

"bucket": {

"name":"john-bkt1"

"marker":"54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1"

"bucket_id":"54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1"

}

"size":6775

"size_rounded":8192

"creation_time":"2020-08-30T08:21:57.057841Z"

"count": 1

"user_stats_sync":"true"

}

 

(2) Bucket/BucketInstance元数据

使用以下命令获得 bucket的元数据信息。

#./bin/radosgw-adminmetadatagetbucket:john-bkt1

{

"key": "bucket:john-bkt1""ver": {

"tag": "_d4u-u5S_CzORuXmXK-O280O""ver": 1

}

"mtime":"2020-08-30T08:21:56.996327Z"

"data": {

"bucket": {

"name":"john-bkt1"

"marker":"54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1"

 

 

"bucket_id":"54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1"

"tenant":""

"explicit_placement": {"data_pool": """data_extra_pool": """index_pool":""

}

}

"owner":"john"

"creation_time":"2020-08-30T08:21:56.873461Z"

"linked":"true"

"has_bucket_info":"false"

}

}

 

使用以下命令获得 bucketinstance元数据信息。

 

 

# ./bin/radosgw-admin metadata get bucket.instance:john-bkt1:54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1

{

"key":"bucket.instance:john-bkt1:54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1""ver": {

"tag": "_xo05nh_v_OZBNq8zkM20Yuz""ver": 1

}

"mtime":"2020-08-30T08:21:56.981329Z"

"data": {

"bucket_info":{

"bucket": {

"name":"john-bkt1"

"marker": "54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1""bucket_id": "54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1""tenant":""

"explicit_placement": {"data_pool": """data_extra_pool": """index_pool":""

}

}

"creation_time":"2020-08-30T08:21:56.873461Z"

"owner":"john"

"flags": 0

"zonegroup":"fddc0981-34db-49f1-b6c7-aea8d36dda1c"

 

 

"placement_rule": "default-placement""has_instance_obj":"false"

"quota": {

"enabled": false"check_on_raw": false"max_size":-1

"max_size_kb":0

"max_objects":-1

}

"num_shards":11

"bi_shard_hash_type": 0"requester_pays": "false""has_website": "false""swift_versioning": "false""swift_ver_location": """index_type": 0"mdsearch_config": []"reshard_status": 0"new_bucket_instance_id":""

}

"attrs": [

{

"key":"user.rgw.acl"

"val": "AgJ7AAAAAwIQAAAABAAAAGpvaG4EAAAAam9obgQDXwAAAAEBAAAABAAAAGpvaG4PAAAAAQAAAAQAAABqb2huBQM0AAAAAgIEAAAAAAAAAAQAAABqb2huAAAAAAAAAAACAgQAAAAPAAAABAAAAGpvaG4AAAAAAAAAAAAAAAAAAAAA"

}

]

}


}

 

bucket/bucketinstance元数据信息都存储在存储池 {zone}.rgw.metaroot命名空间里。


#./bin/rados ls -pdefault.rgw.meta --namespace=root | grepjohn

john-bkt1


.bucket.meta.john-bkt1:54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1

 

其中,{bucket}对象作为数据存储,记录了bucketinstance和它的 owner的信息。

.bucket.meta.{tenant}.{bucket}:{marker}对象存储了存储桶元数据信息,其 xattr记录了访问该桶的授权信息。

 

 

#### 解析 bucketmeta信息

# ./bin/rados get -p default.rgw.meta --namespace=root .bucket.meta.john-bkt1:54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1john-bkt1.instance.txt#./bin/ceph-dencoderimportjohn-bkt1.instance.txttypeRGWBucketInfodecodedump_json

{

"bucket": {

"name":"john-bkt1"

"marker": "54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1""bucket_id": "54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1""tenant":""

"explicit_placement": {"data_pool": """data_extra_pool": """index_pool":""

}

}

"creation_time":"2020-08-30T08:21:56.873461Z"

"owner":"john"

"flags": 0

"zonegroup": "fddc0981-34db-49f1-b6c7-aea8d36dda1c""placement_rule": "default-placement""has_instance_obj":"false"

"quota": {

"enabled": false"check_on_raw": false"max_size":-1

"max_size_kb":0

"max_objects":-1

}

"num_shards":11

"bi_shard_hash_type": 0"requester_pays": "false""has_website": "false""swift_versioning": "false""swift_ver_location": """index_type": 0"mdsearch_config": []"reshard_status": 0"new_bucket_instance_id":""

}

 

#### 解析 bucketACL信息

#./bin/radoslistxattr-pdefault.rgw.meta--namespace=root.bucket.meta.

john-bkt1:54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1

ceph.objclass.version

user.rgw.acl

 

# ./bin/rados getxattr -p default.rgw.meta --namespace=root .bucket.meta.john-bkt1:54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1 user.rgw.acl > john-bkt1.acl.txt

 

#./bin/ceph-dencoderimportjohn-bkt1.acl.txttypeRGWAccessControlPolicydecodedump_json

{

"acl": {

"acl_user_map": [          # ⽤户 ACL信息

{

"user": "john""acl":15

}

]

"acl_group_map": []        # 预定义组的授权信息

"grant_map": [             # 授权⽤户ACL信息

{

"id":"john"

"grant": {

"type": {

"type": 0

}

"id":"john"

"email":""

"permission": {"flags":15

}

"name": "john""group": 0"url_spec":""

}

}

]

}

"owner": {

"id":"john"

"display_name":"john"

}

}


 

 

 

(3) BucketIndex元数据

使用以下命令获得 bucket对应的 bucketindex信息。

 

 

# ./bin/radosgw-admin bi list --bucket john-bkt1[

{

"type":"plain"

"idx":"ceph.conf

"entry": {

"name":"ceph.conf"

"instance":""

"ver": {

"pool": 7

"epoch":481480

}

"locator":""

"exists":"true"

"meta": {

"category":1

"size":6775

"mtime":"2020-08-30T08:22:04.626979Z"

"etag":"155e629efda9bd340ebf8494fed41ba4"

"storage_class": "STANDARD""owner": "john""owner_display_name": "john""content_type": "text/plain""accounted_size": 6775"user_data":"""appendable":"false"

}

"tag":"54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154109.3286743"

"flags": 0"pending_map": []"versioned_epoch":0

}

}

]

 

bucketindex信息存储在存储池 {zone}.rgw.buckets.index里, 命名格式为:.dir.

{bucket_id}.{shard_id}。

通过如下命令查看存储桶索引。

 

#./bin/rados-pdefault.rgw.buckets.index ls|grep 54dba15f-9c2e-40ea-8b87-

fc5f2eb01236.154118.1

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.6

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.1

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.4

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.2

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.5

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.7

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.10

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.0

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.8

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.9

.dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.3

Bucketindex维护着 bucketbucket里对象的映射信息, 这个映射信息存储在RADOS对象的 OMAP 里。如果存储桶开启了分片功能,这些映射关系会被切分,保存在多个 RADOS对象的 OMAP里。

OMAPKeyRGW 对象名,当列出桶内对象时,实际上就是遍历这些存储桶索引的OMAP的所有 Key

#./bin/radoslistomapkeys-pdefault.rgw.buckets.index.dir.54dba15f-9c2e-

40ea-8b87-fc5f2eb01236.154118.1.7

ceph.conf

OMAPValue 为对象的一些基本元数据信息。

# ./bin/rados getomapval -p default.rgw.buckets.index .dir.54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154118.1.7ceph.conf ceph.conf.txt

Writingtoceph.conf.txt

# ./bin/ceph-dencoder import ceph.conf.txt type rgw_bucket_dir_entry decodedump_json

{

"name":"ceph.conf"

"instance":""

"ver": {

"pool": 7

"epoch":481480

}

 

 

"locator":""

"exists":"true"

"meta": {

"category":1

"size":6775

"mtime":"2020-08-30T08:22:04.626979Z"

"etag":"155e629efda9bd340ebf8494fed41ba4"

"storage_class": "STANDARD""owner": "john""owner_display_name": "john""content_type": "text/plain""accounted_size": 6775"user_data":"""appendable":"false"

}

"tag":"54dba15f-9c2e-40ea-8b87-fc5f2eb01236.154109.3286743"

"flags": 0"pending_map": []"versioned_epoch":0

}

 

每个 OMAP都有 header 信息,里面包含了存储桶统计、对象数量、总大小等信息。获得某个 bucketindex对象对应的header信息, 里面包含了这个 index对象的

OMAPheader 对应的统计信息和分片信息。

 

 

#./bin/radosgetomapheader-pdefault.rgw.buckets.index.dir.54dba15f-9c2e-

40ea-8b87-fc5f2eb01236.154118.1.7 index-header.txtWritingto index-header.txt

#./bin/ceph-dencoderimportindex-header.txttypergw_bucket_dir_headerdecodedump_json

{

"ver": 2

"master_ver": 0

"stats": [

1

{

"total_size":6775

"total_size_rounded":8192

"num_entries":1

"actual_size":6775

}

]

"new_instance":{

 

 

"reshard_status": "not-resharding""new_bucket_instance_id": """num_shards":-1

}


}

 

(4) OTP元数据

CephM版本支持MFAMFAMulti-FactorAuthentication即多重要素认证,AWSS3 提供的一个提高数据安全性的功能。它能够在用户名称和密码之外再额外增加一层保护,当用户启用 MFA功能后,在进行操作时,除了要提供用户名和密码外,还需要提供来MFA设备的身份验证代码。

当前在 AWSS3中,MFA 主要应用于对启用版本控制功能的存储桶的数据删除场景。当前Ceph支持基于时间的一次性密码算法(TOTP

为用户配置了 MFAOTP 元数据通过以下命令查看。


#./bin/radosgw-admin metadatalist otp

[

"user:john"


]

 

相关元数据会存储在 {zone}.rgw.otp池里。


#./bin/rados ls -pdefault.rgw.otp

user:john

 

#./bin/radoslistomapkeys -pdefault.rgw.otpuser:john

header

 

OMAPKeyheader对应用户的 MFAID,otp/{totp-serial}对应用户相应的 MFA的配置。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
3月前
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
172 0
|
19天前
|
存储 弹性计算 数据管理
阿里云对象存储OSS收费标准,存储、流量和请求等多个计费项
阿里云对象存储OSS提供按量付费与包年包月两种计费方式,涵盖存储、流量、请求等费用。标准存储按量付费0.09元/GB/月,包年包月40GB起售,价格9元/年。公网流量出方向收费,内网及上传免费。具体费用视使用情况而定,详情见官网。
154 0
|
2月前
|
存储 API Swift
Ceph Reef(18.2.X)之Swift操作对象存储网关
这篇文章详细介绍了Ceph Reef(18.2.X)中通过Swift API操作对象存储网关的方法,包括创建用户、子用户、配置环境变量、以及使用swift命令行工具进行存储桶和对象的管理。
36 7
Ceph Reef(18.2.X)之Swift操作对象存储网关
|
2月前
|
存储 对象存储
Ceph Reef(18.2.X)的对象存储网关(rgw)组件搭建
这篇文章是关于Ceph Reef(18.2.X)版本中对象存储系统的配置和使用案例,包括对象存储网关的概述、核心资源介绍、Ceph RGW支持的接口、高可用radosgw的部署、s3cmd工具的使用以及如何通过HTTP方式访问对象存储。
91 3
Ceph Reef(18.2.X)的对象存储网关(rgw)组件搭建
|
2月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
154 9
|
2月前
|
对象存储 Python
Ceph Reef(18.2.X)之python操作对象存储网关
这篇文章介绍了如何在Ceph Reef(18.2.X)环境中使用Python操作对象存储网关(rgw),包括环境搭建、账号创建、使用s3cmd工具以及编写和测试Python代码。
50 3
|
3月前
|
存储 JavaScript 前端开发
Vue中实现图片上传,上传后的图片回显,存储图片到服务器 【使用对象存储OSS】
这篇文章介绍了在Vue中实现图片上传到阿里云OSS对象存储服务的完整流程,包括服务端签名直传的前提知识、后端设置、前端组件封装以及图片上传和回显的效果展示。
|
3月前
|
存储 Java 关系型数据库
实时计算 Flink版产品使用问题之以jar包方式同步数据是否需要定义存储oss的位置
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
22天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。

热门文章

最新文章