** 概述 **
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
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
RGWPutMetadataAccount
Swift专享保存user所有属性信息(RGWUserInfo
)
RGWPutMetadataBucket
Swift专享保存bucket所有属性信息
RGWPutMetadataObject
Swift专享保存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操作
RGWGetCrossDomainPolicy
Swift专享获取CrossDomain策略信息操作 - Payment
RGWGetRequestPayment
RGWSetRequestPayment
实现对bucket的payment属性的获取、设置操作 - Multipart
RGWInitMultipart
RGWCompleteMultipart
RGWAbortMultipart
RGWListMultipart
RGWListBucketMultiparts
RGWDeleteMultiObj
实现对Object的分片上传的操作 - HealthCheck
RGWGetHealthCheck
Swift专享访问判断配置文件中的rgw_healthcheck_disabling_path
是否可以被访问操作 - Swift Info
RGWInfo
Swift专享获取Swift信息 - Layout
RGWGetObjLayout
获取Object的layout信息 - Bucket MateSearch Config
RGWConfigBucketMetaSearch
RGWGetBucketMetaSearch
RGWDelBucketMetaSearch
实现对Bucket的MetaSearch Config属性的配置、查询、删除操作 - Cluster
RGWGetClusterStat
获取Cluster状态
AdminOp
- Usage
RGWOp_Usage_Get
RGWOp_Usage_Delete
获取usage信息操作 - User
RGWOp_User_Info
RGWOp_User_Create
RGWOp_User_Modify
RGWOp_User_Remove
user信息的获取、创建、修改、删除操作
RGWOp_Subuser_Create
RGWOp_Subuser_Modify
RGWOp_Subuser_Remove
swift user的创建、修改、删除操作
RGWOp_Key_Create
RGWOp_Key_Remove
AccessKey、SecretKey的创建、删除操作
RGWOp_Caps_Add
RGWOp_Caps_Remove
Caps属性的增加、删除操作
RGWOp_Quota_Info
RGWOp_Quota_Set
Quota的信息的获取、设置操作 - Bucket
RGWOp_Bucket_Info
获取bucket信息操作
RGWOp_Get_Policy
获取bucket的policy信息操作
RGWOp_Check_Bucket_Index
检查bucket index操作
RGWOp_Bucket_Link
RGWOp_Bucket_Unlink
关联、去关联bucket与user操作
RGWOp_Bucket_Remove
删除bucket操作
RGWOp_Set_Bucket_Quota
设置bucket quota属性操作
RGWOp_Object_Remove
删除bucket内的object操作 - Metadata
RGWOp_Metadata_List
RGWOp_Metadata_Get
RGWOp_Metadata_Put
RGWOp_Metadata_Delete
RGWOp_Metadata_Lock
RGWOp_Metadata_Unlock
实现对Metadata数据的管理操作 - Log
RGWOp_BILog_List
RGWOp_BILog_Info
RGWOp_BILog_Delete
RGWOp_BILog_Status
实现对bucket index log的管理
RGWOp_MDLog_List
RGWOp_MDLog_Info
RGWOp_MDLog_ShardInfo
RGWOp_MDLog_Lock
RGWOp_MDLog_Unlock
RGWOp_MDLog_Notify
RGWOp_MDLog_Delete
RGWOp_MDLog_Status
实现对Metadata log的管理
RGWOp_DATALog_List
RGWOp_DATALog_Info
RGWOp_DATALog_ShardInfo
RGWOp_DATALog_Lock
RGWOp_DATALog_Unlock
RGWOp_DATALog_Notify
RGWOp_DATALog_Delete
RGWOp_DATALog_Status
实现对Data log的管理 - Opstate
RGWOp_Opstate_List
RGWOp_Opstate_Set
RGWOp_Opstate_Renew
RGWOp_Opstate_Delete
获取远端object的操作日志管理 - ReplicaLog
RGWOp_OBJLog_GetBounds
RGWOp_OBJLog_SetBounds
RGWOp_OBJLog_DeleteBounds
Object同步日志管理
RGWOp_BILog_GetBounds
RGWOp_BILog_SetBounds
RGWOp_BILog_DeleteBounds
Bucket同步日志管理 - Zone
RGWOp_ZoneGroupMap_Get
RGWOp_ZoneConfig_Get
获取zonegroup map 和 zone config操作 - Realm
RGWOp_Realm_Get
获取realm信息操作
RGWOp_Period_Get
RGWOp_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.control
pool中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.lc
pool的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.root
pool中的periods.{realm id}.control
对象将通知Realm Watcher
进行更改realm配置。