Radosgw 架构

概述

Ceph对象网关是一个构建在librados之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个RESTful风格的网关。

Ceph 对象存储支持 2 种接口:

  1. 兼容S3: 提供了对象存储接口,兼容Amazon S3 RESTful接口的一个大子集。
  2. 兼容Swift: 提供了对象存储接口,兼容Openstack Swift接口的一个大子集。

Ceph对象存储使用Ceph对象网关守护进程(radosgw 以下简称RGW),它是个与Ceph存储集群交互的FastCGI模块。因为它提供了与OpenStack SwiftAmazon S3兼容的接口,RADOS要有它自己的用户管理。Ceph对象网关可与CephFS客户端或Ceph 块设备客户端共用一个存储集群。S3和Swift接口共用一个通用命名空间,所以你可以用一个接口写如数据、然后用另一个接口取出数据。

版本: Mimic

radosgw-Frame.png

架构

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_requestprocess_request通过RESTMgr取得handler,handler再根据Http Method取得Op,Op再对数据进行读写操作。

REST Resource

S3

组成

  • RESTMgr
    有1个RGWRESTMgr_S3组成。
  • Handler
    有6个Handler组成,分别是:RGWHandler_REST_Service_S3RGWHandler_REST_Bucket_S3RGWHandler_REST_Obj_S3RGWHandler_REST_Service_S3WebsiteRGWHandler_REST_Bucket_S3WebsiteRGWHandler_REST_Obj_S3Website

功能

  • RGWHandler_REST_Service_S3, 完成如下功能:
    1. 获取Usage信息
    2. List Buckets
    3. Role信息操作
  • RGWHandler_REST_Bucket_S3,完成如下功能:
    1. Bucket ACL信息操作
    2. Bucket Core信息操作
    3. Bucket Payment信息操作
    4. Bucket LC信息操作
    5. Bucket Policy信息操作
    6. Bucket操作
  • RGWHandler_REST_Obj_S3,完成如下功能:
    1. Object ACL操作
    2. Object tagging操作
    3. Object Multipart上传操作
    4. Object 操作
    5. Object Copy操作

Swift

组成

  • RESTMgr
    RGWRESTMgr_SWIFTRGWRESTMgr_SWIFT_CrossDomainRGWRESTMgr_SWIFT_HealthCheckRGWRESTMgr_SWIFT_Info组成。
  • Handler
    RGWHandler_REST_Service_SWIFTRGWHandler_REST_Bucket_SWIFTRGWHandler_REST_Obj_SWIFTRGWHandler_REST_SWIFT_InfoRGWHandler_SWIFT_HealthCheckRGWHandler_SWIFT_CrossDomain组成。

Swift auth

组成

  • RESTMgr
    由1个RGWRESTMgr_SWIFT_Auth组成。
  • Handler
    由1个RGWHandler_SWIFT_Auth组成。

Admin

组成

  • RESTMgr
    RGWRESTMgr_UsageRGWRESTMgr_UserRGWRESTMgr_BucketRGWRESTMgr_MetadataRGWRESTMgr_LogRGWRESTMgr_OpstateRGWRESTMgr_ReplicaLogRGWRESTMgr_ConfigRGWRESTMgr_RealmRGWRESTMgr_Period组成。
  • Handler
    RGWHandler_UsageRGWHandler_UserRGWHandler_BucketRGWHandler_MetadataRGWHandler_LogRGWHandler_OpstateRGWHandler_ReplicaLogRGWHandler_ConfigRGWHandler_RealmRGWHandler_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
    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状态

AdminOp

  • Usage
    RGWOp_Usage_Get RGWOp_Usage_Delete获取usage信息操作
  • User
    RGWOp_User_Info RGWOp_User_Create RGWOp_User_Modify RGWOp_User_Removeuser信息的获取、创建、修改、删除操作
    RGWOp_Subuser_Create RGWOp_Subuser_Modify RGWOp_Subuser_Removeswift user的创建、修改、删除操作
    RGWOp_Key_Create RGWOp_Key_RemoveAccessKey、SecretKey的创建、删除操作
    RGWOp_Caps_Add RGWOp_Caps_RemoveCaps属性的增加、删除操作
    RGWOp_Quota_Info RGWOp_Quota_SetQuota的信息的获取、设置操作
  • 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_DeleteBoundsObject同步日志管理
    RGWOp_BILog_GetBounds RGWOp_BILog_SetBounds RGWOp_BILog_DeleteBoundsBucket同步日志管理
  • 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处理过程十分重要。

处理流程

  1. 获取RGWHandler_REST
    1.1. 获取RGWRESTMgr对象
    各种REST resource 都保存在一个map中,当请求到来时根据传入的frontend_prefix和uri信息在map中查找对应的RGWRESTMgr
    1.2. 通过RGWRESTMgrget_handler获取RGWHandler_REST对象
    1.3. 调用RGWHandler_REST对象的init方法进行初始化
  2. 调用RGWHandler_REST对象的get_op方法获取RGWOp对象
  3. 调用RGWOp对象的verify_request的方法,根据不同的操作进行不同的请求授权检查
  4. 调用RGWHandler_REST对象的postauth_init方法,进行bucket和tenant解析及验证等操作
  5. 调用RGWHandler_REST对象的init_permissions方法,进行初始化权限
    5.1. 如果是创建Bucket操作(RGW_OP_CREATE_BUCKET)直接忽略此操作
    5.2. 非创建Bucket操作,通过调用RGWHandler_REST对象的do_init_permissions方法进行初始化权限
  6. 调用RGWHandler_REST对象的read_permissions方法,获取Object的AccessControlPolicy,若处理的是Bucket直接忽略
  7. 调用RGWOp对象的init_processing方法,获取bucket和user的quota信息
  8. 调用RGWOp对象的verify_op_mask验证操作的种类是否为RGW_OP_TYPE_READRGW_OP_TYPE_WRITERGW_OP_TYPE_DELETE中的一个或多个
  9. 调用RGWOp对象的verify_permission检查当前的操作在之前的init_permissions获取的策略之下是否有权限
  10. 调用RGWOp对象的verify_params检查当前操作的参数
  11. 调用RGWOp对象的pre_exec执行预执行操作
  12. 调用RGWOp对象的execute执行操作
  13. 调用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_cacheuser_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配置。