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。
圖3-29 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的配置。