天天看點

《存儲漫談Ceph原理與實踐》第三章接入層3.2對象存儲RGW(三)

3.2.3       I/O 路徑

RGW是 RADOSGateway, 顧名思義是 RADOS對象存儲系統上層的一個網關服務,根據網關的功能定義,網關負責完成不同協定的轉換和對接。在Ceph場景中,RGW即完成類似的功能:接收使用者 S3/Swift接口規則的資料存取請求,然後将其轉化為後端RADOS能夠處理的操作。

RGW 的請求處理經曆了3 個階段:

(1)  Web架構主要負責接收使用者請求,RGW中常用的 Web架構包括 CivetWeb、Apache、Beast等;

(2)   根據使用者請求類型,分别選擇不同的RESTMgr(針對不同的Resource)、 Handler、RGWOp來處理使用者的具體業務,梳理出使用者的請求資料;

(3)   将使用者的業務請求轉換為對 RADOS層資料讀寫請求的封裝, 具體操作由RGWRados完成。

RGW的業務架構示意如圖 3-29所示。請求到達 RGW網關後,在 RGWFrontend層做相應轉發,請求到達RGWRESTMgr層,RGWRESTMgr依照請求資源類型,對請求做相應的 RGWHandler層的資源執行個體化工作。

在 RGWHandler層中執行個體化後的請求,首先進行前置處理,完成基本資訊的校驗等工作,在校驗完成後,調用相關的業務接口RGWOp完成 Bucket和 Object的請求處理, 并在 RGWOp中,調用終極接口 RGWRados,完成 RGW資料的最終落盤(RGWRados是 RGW網關子產品和後端的 RADOS底層存儲系統互動的視窗)。RGW請求處理流程見圖 3-30。

《存儲漫談Ceph原理與實踐》第三章接入層3.2對象存儲RGW(三)

圖3-29    RGw 業務架構示意

《存儲漫談Ceph原理與實踐》第三章接入層3.2對象存儲RGW(三)

圖3-30    RGw 請求處理流程

對應上述業務處理過程,RGW中會有 3個重要的資料結構:RGWFrontend、RGWRESTMgr及 RGWHandler。

◆  RGWFrontend:RGWFrontend是 RGW的 WEB前端類的封裝,用于處理 HTTP(s)相關的請求,完成RGW業務邏輯中的 WEB 架構接收使用者請求的功能。目前最新的 WEB架構是 Beast。

◆  RGWRESTMgr:RGWRESTMgr負責RGW 處理的資源類型區分,RGWRESTMgr包含了多種不同類型的路徑和資源,并可根據請求資源類型的不同,将請求“路由”到不同的業務邏輯來進行處理(請求的執行個體化工作)。

◆  RGWHandler:RGWHandler負責具體的使用者請求處理,如客戶使用 S3規範進行業務請求,該層中會調用S3相關的 RGWHandler,後續操作如下。

(1) RGWHandler_REST_Service_S3

負責處理S3 使用者類型請求,包括擷取使用者的統計資訊、使用者的桶清單、S3賬戶通路權限設定等。

(2) RGWHandler_REST_Bucket_S3

負責處理S3桶類型請求,包括桶的ACL權限清單、生命周期規則以及具體的建立/删除桶等操作。

(3) RGWHandler_REST_Obj_S3

負責處理 S3Object類型請求, 包括 Object的 ACL權限清單、Tagging及具體的Object資料操作(簡單上傳、分塊上傳、删除)等。

3.2.4   中繼資料/ 資料布局

前面提到過,CephRGW将資料組織分為 3種類型:Metadata、bucketindex及data。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:用來維護 bucketname和bucketinstanceID的映射。

◆  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

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

"mfa_ids":[]

"attrs":[]

這些 user資訊存儲在存儲池 {zone}.rgw.meta的 users:{field}命名空間裡,field字段目前有 keys、swift、email、uid,分别對應使用者的 S3密鑰對、Swift密鑰對、郵箱、使用者 ID等資訊。

例如,users.uid命名空間裡,包含了使用者john對應的兩個 RADOS對象 {uid} 和 {uid}.bucket(如john和john.bucket),john對象裡存儲着使用者基本資訊資料,john.buckets則以 OMAP形式儲存着使用者的存儲桶資訊。通過 RADOS指令可以檢視。

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

john.bucketsjohn

{user_id}.buckets以 OMAP形式儲存。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"

"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"

"bucket_info":{

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

"flags": 0

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

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

"quota": {

"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.meta的 root命名空間裡。

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

.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

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

#### 解析 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

"permission": {"flags":15

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

"owner": {

"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

"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維護着 bucket和 bucket裡對象的映射資訊, 這個映射資訊存儲在RADOS對象的 OMAP 裡。如果存儲桶開啟了分片功能,這些映射關系會被切分,儲存在多個 RADOS對象的 OMAP裡。

OMAPKey為 RGW 對象名,當列出桶内對象時,實際上就是周遊這些存儲桶索引的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

每個 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版本支援MFA。MFA(Multi-FactorAuthentication)即多重要素認證,是 AWSS3 提供的一個提高資料安全性的功能。它能夠在使用者名稱和密碼之外再額外增加一層保護,當使用者啟用 MFA功能後,在進行操作時,除了要提供使用者名和密碼外,還需要提供來自MFA裝置的身份驗證代碼。

目前在 AWSS3中,MFA 主要應用于對啟用版本控制功能的存儲桶的資料删除場景。目前Ceph支援基于時間的一次性密碼算法(TOTP)。

為使用者配置了 MFA後,OTP 中繼資料通過以下指令檢視。

#./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

OMAPKey的 header對應使用者的 MFAID,otp/{totp-serial}對應使用者相應的 MFA的配置。