** 概述 **
Ceph对象网关是一个构建在librados之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个RESTful风格的网关。
Ceph 对象存储支持 2 种接口:
- 兼容S3: 提供了对象存储接口,兼容
Amazon S3 RESTful接口的一个大子集。 - 兼容Swift: 提供了对象存储接口,兼容
Openstack Swift接口的一个大子集。
Ceph对象存储使用Ceph对象网关守护进程(radosgw 以下简称RGW),它是个与Ceph存储集群交互的FastCGI模块。因为它提供了与OpenStack Swift和Amazon S3兼容的接口,RADOS要有它自己的用户管理。Ceph对象网关可与CephFS客户端或Ceph 块设备客户端共用一个存储集群。S3和Swift接口共用一个通用命名空间,所以你可以用一个接口写如数据、然后用另一个接口取出数据。
** 版本: Mimic **

架构
RGW 主要由3部分组成。Frontend,用于接收回复外部客户端的http请求;REST,根据外部请求的http信息选择相应的REST、Handler、Op对请求进行分解处理;RGWRados,完成了对数据读写业务的封装。
Frontend
Frontend包括Frontend Config(RGWFrontendConfig)、Civetweb(RGWCivetWebFrontend)、beast(RGWAsioFrontend)、loadgen(RGWLoadGenFrontend)、fastcgi/fcgi(RGWFCGXFrontend)。用一个map管理所有RGWFrontendConfig配置信息对象;用一个list管理所有RGWFrontend对象。每个RGWFrontend实例使用与之对应的RGWFrontendConfig实例进行配置。
Frontend负责接收客户端的请求,然后回调process_request方法处理该请求,并将响应信息返回客户端。
- Frontend Config
- Civetweb
- Beast
- Loadgen
- FastCGI/FCGI
REST
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再对数据进行读写操作。
REST Resource
S3
** 组成 **
- 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操作
Swift
** 组成 **
- RESTMgr
由RGWRESTMgr_SWIFT、RGWRESTMgr_SWIFT_CrossDomain、RGWRESTMgr_SWIFT_HealthCheck、RGWRESTMgr_SWIFT_Info组成。 - Handler
由RGWHandler_REST_Service_SWIFT、RGWHandler_REST_Bucket_SWIFT、RGWHandler_REST_Obj_SWIFT、RGWHandler_REST_SWIFT_Info、RGWHandler_SWIFT_HealthCheck、RGWHandler_SWIFT_CrossDomain组成。
Swift auth
** 组成 **
- RESTMgr
由1个RGWRESTMgr_SWIFT_Auth组成。 - Handler
由1个RGWHandler_SWIFT_Auth组成。
Admin
** 组成 **
- RESTMgr
由RGWRESTMgr_Usage、RGWRESTMgr_User、RGWRESTMgr_Bucket、RGWRESTMgr_Metadata、RGWRESTMgr_Log、RGWRESTMgr_Opstate、RGWRESTMgr_ReplicaLog、RGWRESTMgr_Config、RGWRESTMgr_Realm、RGWRESTMgr_Period组成。 - Handler
由RGWHandler_Usage、RGWHandler_User、RGWHandler_Bucket、RGWHandler_Metadata、RGWHandler_Log、RGWHandler_Opstate、RGWHandler_ReplicaLog、RGWHandler_Config、RGWHandler_Realm、RGWHandler_Period组成。
Op
RGWOp
- Object Tags
RGWGetObjTagsRGWPutObjTagsRGWDeleteObjTags实现对象属性user.rgw.x-amz-tagging的查询、设置、删除操作 - Bulk
RGWBulkDeleteRGWBulkUploadOpSwift专享批量上传、删除操作 - 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
RGWPutObjRGWPostObjRGWGetObjRGWDeleteObjRGWCopyObj实现对象的创建、修改、下载、删除、拷贝操作
RGWListBucket列出bucket中的对象 - Metadata
RGWPutMetadataAccountSwift专享保存user所有属性信息(RGWUserInfo)
RGWPutMetadataBucketSwift专享保存bucket所有属性信息
RGWPutMetadataObjectSwift专享保存object所有属性信息 - ACL
RGWGetACLsRGWPutACLs实现对bucket或object的访问控制策略属性(user.rgw.acl)的获取、设置操作 - LC
RGWGetLCRGWPutLCRGWDeleteLC实现对bucket的生命周期属性(user.rgw.lc)的获取、设置、删除操作 - CORS
RGWGetCORSRGWPutCORSRGWDeleteCORSRGWOptionsCORS实现对bucket的CORS属性(user.rgw.cors)的获取、设置、删除、Options操作
RGWGetCrossDomainPolicySwift专享获取CrossDomain策略信息操作 - Payment
RGWGetRequestPaymentRGWSetRequestPayment实现对bucket的payment属性的获取、设置操作 - Multipart
RGWInitMultipartRGWCompleteMultipartRGWAbortMultipartRGWListMultipartRGWListBucketMultipartsRGWDeleteMultiObj实现对Object的分片上传的操作 - HealthCheck
RGWGetHealthCheckSwift专享访问判断配置文件中的rgw_healthcheck_disabling_path是否可以被访问操作 - Swift Info
RGWInfoSwift专享获取Swift信息 - Layout
RGWGetObjLayout获取Object的layout信息 - Bucket MateSearch Config
RGWConfigBucketMetaSearchRGWGetBucketMetaSearchRGWDelBucketMetaSearch实现对Bucket的MetaSearch Config属性的配置、查询、删除操作 - Cluster
RGWGetClusterStat获取Cluster状态
AdminOp
- Usage
RGWOp_Usage_GetRGWOp_Usage_Delete获取usage信息操作 - User
RGWOp_User_InfoRGWOp_User_CreateRGWOp_User_ModifyRGWOp_User_Removeuser信息的获取、创建、修改、删除操作
RGWOp_Subuser_CreateRGWOp_Subuser_ModifyRGWOp_Subuser_Removeswift user的创建、修改、删除操作
RGWOp_Key_CreateRGWOp_Key_RemoveAccessKey、SecretKey的创建、删除操作
RGWOp_Caps_AddRGWOp_Caps_RemoveCaps属性的增加、删除操作
RGWOp_Quota_InfoRGWOp_Quota_SetQuota的信息的获取、设置操作 - Bucket
RGWOp_Bucket_Info获取bucket信息操作
RGWOp_Get_Policy获取bucket的policy信息操作
RGWOp_Check_Bucket_Index检查bucket index操作
RGWOp_Bucket_LinkRGWOp_Bucket_Unlink关联、去关联bucket与user操作
RGWOp_Bucket_Remove删除bucket操作
RGWOp_Set_Bucket_Quota设置bucket quota属性操作
RGWOp_Object_Remove删除bucket内的object操作 - Metadata
RGWOp_Metadata_ListRGWOp_Metadata_GetRGWOp_Metadata_PutRGWOp_Metadata_DeleteRGWOp_Metadata_LockRGWOp_Metadata_Unlock实现对Metadata数据的管理操作 - Log
RGWOp_BILog_ListRGWOp_BILog_InfoRGWOp_BILog_DeleteRGWOp_BILog_Status实现对bucket index log的管理
RGWOp_MDLog_ListRGWOp_MDLog_InfoRGWOp_MDLog_ShardInfoRGWOp_MDLog_LockRGWOp_MDLog_UnlockRGWOp_MDLog_NotifyRGWOp_MDLog_DeleteRGWOp_MDLog_Status实现对Metadata log的管理
RGWOp_DATALog_ListRGWOp_DATALog_InfoRGWOp_DATALog_ShardInfoRGWOp_DATALog_LockRGWOp_DATALog_UnlockRGWOp_DATALog_NotifyRGWOp_DATALog_DeleteRGWOp_DATALog_Status实现对Data log的管理 - Opstate
RGWOp_Opstate_ListRGWOp_Opstate_SetRGWOp_Opstate_RenewRGWOp_Opstate_Delete获取远端object的操作日志管理 - ReplicaLog
RGWOp_OBJLog_GetBoundsRGWOp_OBJLog_SetBoundsRGWOp_OBJLog_DeleteBoundsObject同步日志管理
RGWOp_BILog_GetBoundsRGWOp_BILog_SetBoundsRGWOp_BILog_DeleteBoundsBucket同步日志管理 - Zone
RGWOp_ZoneGroupMap_GetRGWOp_ZoneConfig_Get获取zonegroup map 和 zone config操作 - Realm
RGWOp_Realm_Get获取realm信息操作
RGWOp_Period_GetRGWOp_Period_Post获取、设置Period信息操作
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完成操作,并整理响应结果
RGWRados
- Bucket Op
使用librados完成Bucket创建、删除、设置、获取等相关操作 - Object Op
对Object的读写、属性获取设置等操作,所有操作都分为两类,一类是System Obj,包括metadata信息、realm信息、role信息、bucket信息等rgw内一些配置信息;另一类是Normal Obj,一般为用户上传的object - Cache
对Bucket info信息和User info信息及所有Object的缓存。缓存失效采用LRU算法,采用超时失效+有效窗口方式判断缓存数据是否失效。 - Watcher
监听.rgw.controlpool中nodify的对象,当发生对Object(包括System Obj 和 Normal Obj)的增删改操作时,都会触发nodify的更新。Watcher再调用watch_cb去更新Object的缓存信息 - Pools
对root pool(.rgw)、control pool(.rgw.control)、gc pool(.rgw.gc)、lc pool(.rgw.lc)、objexp pool、reshard pool的IoCtx管理及操作 - GC
对象的删除操作不会真的将对象删除,而是在对象的属性中增加olh.,然后将对象存入.rgw.gc中。GC中的回收线程会每隔1小时处理一次,每次处理从.rgw.gc中获取对象并删除,每次处理的超时时间为1小时。 - Obj Expirer(OE)
对象的Version删除功能,通过设置对象的delete_at属性来等待OE清扫线程进行删除,OE清扫线程每隔10分钟处理一次。 - LC
bucket通过user.rgw.lc属性配置LC,开启了LC的bucket会被随机分配到.rgw.lcpool的lc.{index}对象上。LC处理线程会随机获取lc.{index}对象,对其上记录的bucket中的object进行处理,判断其是否过期失效,若失效则删除。 - Quota
bucket_stats_cache和user_stats_cache分别缓存bucket和user的quota信息,并提供check_quota操作检查是否超出quota的限制。 - Reshard
bucket index用于索引bucket内的Object,这些index存在shard文件上。随着bucket内object的数量增加,整个shard文件也在不断增长,当object数量超过“bucket shard数*每个shard最大容纳object数量(默认值:100000)”时,触发reshard操作分配更多的shard文件用于存储index。 - Sync
根据metadata log 和 data log 同步 metadata 和 data 数据。当用户对metadata或data写入操作时,保存对应log信息,然后通过notifier模块唤醒SyncProcessor模块来同步log信息并处理。 - Realm
包括Realm、zonggroup、zone、period四部分;period用于管理realm配置信息,一个realm包括多个zonegroup,每个zonegroup包括多个zone;一个realm中只能有一个master zonegroup,这个zonegroup中只能有一个master zone。用户修改period时,通过.rgw.rootpool中的periods.{realm id}.control对象将通知Realm Watcher进行更改realm配置。