一.Ceph對象存儲的概念
ceph是一種分布式對象存儲系統,通過ceph對象網關提供對象存儲接口,也稱為RADOS網關(RGW)接口。它構建在Ceph RADOS之上。RGW使用librgw(RADOS Gateway library)和librados,允許應用程序與ceph對象存儲建立連接。RGW為應用程序提供了一個RESTful S3/swift兼容的接口,用於在ceph集群中以對象的形式存儲數據。ceph還支持多租戶對象存儲,可以通過RESTful API訪問。此外,RGW還支持ceph管理API,可以使用本機API調用來管理ceph存儲集群。librados軟件庫非常靈活,允許用戶應用程序通過C、C++、java、python和php綁定直接訪問ceph存儲集群。ceph對象存儲還具有多站點功能,即災難恢復提供解決方案。

根據架構圖可以看出,對於RGW來說,它對於上層的APP來講充當HTTP Server,對於下層的RADOS集群作為RADOS Client。RGW作為HTTP Server接收和解析HTTP客戶端的請求,RGW作為RADOS Client為對象存儲應用提供數據存儲的通道,將應用請求數據處理並發送至RADOS中存儲。
二.RGW對外的三類基礎數據邏輯實體
- 用戶
- 存儲桶
- 對象
2.1 用戶
RGW兼容AWS S3和OpenStack Swift。RGW User對應S3 User,也對應Swift Account,RGW subuser對應Swift user。
用戶數據信息包含:
- 用戶認證信息: S3(access key,secret key),Swift(secret key)
- 訪問控制權限信息: 包含操作訪問權限(read、write、delete等)和訪問控制列表
- 用戶配額信息: 防止某些用戶占用過多存儲空間,根據用戶付費情況配置存儲空間
2.2 存儲桶
存儲桶是對象的容器,是為了方便管理和操作具有相同屬性的一類對象而引入的一級管理單元。
存儲桶信息包含:
-
基礎信息: (保持在對應RADOS對象的數據部分)RGW關注的信息,包含bucket配額信息(最大對象數目和最大對象大小總和),bucket placement rule,bucket中的索引對象數目等等。其中bucket placement rule包含index pool(存儲桶的索引對象),data pool(對象數據),data extra pool(分段上傳的中間數據)
-
擴展信息: (保存在對應RADOS對象的擴展屬性)對RGW透明的一些信息,如用戶自定義的元數據信息。
2.3 對象
RGW中的應用對象對應RADOS對象。應用對象上傳分整體上傳和分段上傳,不同的上傳方式應用對象對應RADOS對象的方式不同。
這里涉及三個概念:
- rgw_max_chunk_size: 分塊大小,RGW下發至RADOS集群的單個IO的大小。
- rgw_obj_stripe_size: 條帶大小,multipart除首對象外的分段其它大小。
- class RGWObjManifest: 管理應用對象和RADOS對象的對應關系。
2.3.1 整體上傳
-
應用對象大小小於等於分塊大小: 用戶上傳的一個對象只對象一個RADOS對象,該RADOS對象以應用對象名稱命名,應用對象元數據也保存在該RADOS對象的擴展屬性中。
-
應用對象大小大於分塊大小: 應用對象被分解成一個大小等於分塊大小的首對象。多個大小等於條帶大小的中間鏡像,和一個大小小於條帶大小的尾對象。首對象以應用對象名稱命名,在RGW中將該對象稱為head_obj,該對象的數據部分保持了應用對象前rgw_max_chunk_size字節的數據。擴展屬性部分保存了應用對象的元數據和manifest信息。中間對象和尾對象保存應用對象剩余的數據,對象名稱為"shadow_" + "." + "32bit隨機字符串" + "_" + "條帶編號",其中條帶編號從1開始。

2.3.2 分段上傳

RGW依照條帶大小將應用對象的每一個分段分成多個RADOS對象,每個分段的第一個RADOS對象名稱為:
"multipart" + "用戶上傳對象名稱" + "分段上傳ID" + "分段編號"
其余對象名稱為:
"shadow" + "用戶上傳對象名稱" + "分段上傳ID" + "分段編號" + "_" + "條帶編號"
當所有的分段上傳結束后,RGW會從data_extra_pool中的分段上傳臨時對象中讀取各個分段信息。主要是各分段的manifest信息組成一個manifest,然后生成一個新的RADOS對象,即head obj,用來報錯分段上傳的應用對象的元數據信息和各分段的manifest
