1
RGW 是运行于RADOS集群之上的一个RADOS Client 实例,是CEPH集群对外提供对象存储服务的一个网关,它允许用户通过Restful API 的方式访问CEPH集群。其提供的Restful API具体为S3 API 和Swift API,即符合S3 协议和Swift 协议。
RGW 主要由3部分组成。Frontend,用于接收回复外部客户端的http请求;REST,根据外部请求的http信息选择相应的REST、Handler、Op对请求进行分解处理;RGWRados,完成了对数据读写业务的封装。
1.1
Frontend包括
- Frontend Config(
RGWFrontendConfig
) - Civetweb(
RGWCivetWebFrontend
) - beast(
RGWAsioFrontend
) - loadgen(
RGWLoadGenFrontend
) - fastcgi/fcgi(
RGWFCGXFrontend
)
用一个map管理所有RGWFrontendConfig
配置信息对象;用一个list管理所有RGWFrontend
对象。每个RGWFrontend
实例使用与之对应的RGWFrontendConfig
实例进行配置。
Frontend负责接收客户端的请求,然后回调process_request
方法处理该请求,并将响应信息返回客户端。
1.2
REST包括request process、S3 resource、Swift resource、Swift auth resource、Admin Usage resource、Admin User resource、Admin Metadata resource、Admin Realm resource、Admin Config resource、Admin Bucket resource、Admin OpState resource、Admin Log resource、 Admin Replica-log resource。
每个resource包含一个RESTMgr、多个Handler、多个Op。
Frontend回调了process_request
,process_request
通过RESTMgr取得handler,handler再根据Http Method取得Op,Op再对数据进行读写操作。
1.2.1
1.2.1.1S3
RESTMgr:由1个RGWRESTMgr_S3
组成。
Handler
由6个Handler组成。
RGWHandler_REST_Service_S3
RGWHandler_REST_Bucket_S3
RGWHandler_REST_Obj_S3
RGWHandler_REST_Service_S3Website
RGWHandler_REST_Bucket_S3Website
RGWHandler_REST_Obj_S3Website
功能
RGWHandler_REST_Service_S3
, 完成如下功能:
- 获取Usage信息
- List Buckets
- Role信息操作
RGWHandler_REST_Bucket_S3
,完成如下功能:
- Bucket ACL信息操作
- Bucket Core信息操作
- Bucket Payment信息操作
- Bucket LC信息操作
- Bucket Policy信息操作
- Bucket操作
RGWHandler_REST_Obj_S3
,完成如下功能:
- Object ACL操作
- Object tagging操作
- Object Multipart上传操作
- Object 操作
- Object Copy操作
1.2.2
RGWOp
- Object Tags
RGWGetObjTags
RGWPutObjTags
RGWDeleteObjTags
实现对象属性user.rgw.x-amz-tagging
的查询、设置、删除操作 - Bulk
RGWBulkDelete
RGWBulkUploadOp
Swift专享批量上传、删除操作 - Usage
RGWGetUsage
获取usage信息操作 - Stat
RGWStatAccount
统计buckets的使用情况 - Bucket
RGWListBuckets
列出所有buckets
RGWGetBucketLocation
获取bucket location
RGWGetBucketVersioning
获取bucket versioning、mfa-delete状态
RGWSetBucketVersioning
设置bucket versioning
RGWGetBucketWebsite
获取bucket website信息
RGWSetBucketWebsite
设置bucket website
RGWDeleteBucketWebsite
删除bucket website
RGWStatBucket
获取bucket信息
RGWCreateBucket
创建bucket操作
RGWDeleteBucket
删除bucket操作
RGWPutBucketPolicy
设置bucket policy
RGWGetBucketPolicy
获取bucket policy
RGWDeleteBucketPolicy
删除bucket policy - Object
RGWPutObj
RGWPostObj
RGWGetObj
RGWDeleteObj
RGWCopyObj
实现对象的创建、修改、下载、删除、拷贝操作
RGWListBucket
列出bucket中的对象 - Metadata
RGWPutMetadataAccountSwift
专享保存user所有属性信息(RGWUserInfo
)
RGWPutMetadataBucketSwift
专享保存bucket所有属性信息
RGWPutMetadataObjectSwift
专享保存object所有属性信息 - ACL
RGWGetACLs
RGWPutACLs
实现对bucket或object的访问控制策略属性(user.rgw.acl
)的获取、设置操作 - LC
RGWGetLC
RGWPutLC
RGWDeleteLC
实现对bucket的生命周期属性(user.rgw.lc
)的获取、设置、删除操作 - CORS
RGWGetCORS
RGWPutCORS
RGWDeleteCORS
RGWOptionsCORS
实现对bucket的CORS属性(user.rgw.cors
)的获取、设置、删除、Options操作
RGWGetCrossDomainPolicySwift
专享获取CrossDomain策略信息操作 - Payment
RGWGetRequestPayment
RGWSetRequestPayment
实现对bucket的payment属性的获取、设置操作 - Multipart
RGWInitMultipart
RGWCompleteMultipart
RGWAbortMultipart
RGWListMultipart
RGWListBucketMultiparts
RGWDeleteMultiObj
实现对Object的分片上传的操作 - HealthCheck
RGWGetHealthCheckSwift
专享访问判断配置文件中的rgw_healthcheck_disabling_path
是否可以被访问操作 - Swift Info
RGWInfoSwift
专享获取Swift信息 - Layout
RGWGetObjLayout
获取Object的layout信息 - Bucket MateSearch Config
RGWConfigBucketMetaSearch
RGWGetBucketMetaSearch
RGWDelBucketMetaSearch
实现对Bucket的MetaSearch Config属性的配置、查询、删除操作 - Cluster
RGWGetClusterStat
获取Cluster状态
1.2.3 request process
RGW的所有请求都需要回调process_request
这个函数来处理,所以process_request
处理过程十分重要。
处理流程
- 获取
RGWHandler_REST
1.1. 获取RGWRESTMgr
对象
各种REST resource 都保存在一个map中,当请求到来时根据传入的frontend_prefix
和uri信息在map中查找对应的RGWRESTMgr
1.2. 通过RGWRESTMgr
的get_handler
获取RGWHandler_REST
对象
1.3. 调用RGWHandler_REST
对象的init
方法进行初始化 - 调用
RGWHandler_REST
对象的get_op
方法获取RGWOp
对象 - 调用
RGWOp
对象的verify_request
的方法,根据不同的操作进行不同的请求授权检查 - 调用
RGWHandler_REST
对象的postauth_init
方法,进行bucket和tenant解析及验证等操作 - 调用
RGWHandler_REST
对象的init_permissions
方法,进行初始化权限
5.1. 如果是创建Bucket操作(RGW_OP_CREATE_BUCKET)直接忽略此操作
5.2. 非创建Bucket操作,通过调用RGWHandler_REST
对象的do_init_permissions
方法进行初始化权限 - 调用
RGWHandler_REST
对象的read_permissions
方法,获取Object的AccessControlPolicy,若处理的是Bucket直接忽略 - 调用
RGWOp
对象的init_processing
方法,获取bucket和user的quota信息 - 调用
RGWOp
对象的verify_op_mask
验证操作的种类是否为RGW_OP_TYPE_READ
、RGW_OP_TYPE_WRITE
、RGW_OP_TYPE_DELETE
中的一个或多个 - 调用
RGWOp
对象的verify_permission
检查当前的操作在之前的init_permissions
获取的策略之下是否有权限 - 调用
RGWOp
对象的verify_params
检查当前操作的参数 - 调用
RGWOp
对象的pre_exec
执行预执行操作 - 调用
RGWOp
对象的execute
执行操作 - 调用
RGWOp
对象的complete
完成操作,并整理响应结果
转载自Radosgw 架构 | Bolog (zhoubofsy.github.io),仅方便自己查询使用。