一、Ceph整體架構及RGW在Ceph中的位置
1.Ceph的整體架構
Ceph是一個統一的、分布式的的存儲系統,具有優秀的性能、可靠性和可擴展性。Ceph支持對象存儲(RADOSGW)、塊存儲(RBD)和文件存儲(CephFS)。一個Ceph存儲集群至少包含一個Ceph monitor、Ceph manager及Ceph OSD(Object Store Daemon)。若要運行CephFS client,還需要Ceph metadata server。以下是Ceph的整體架構圖:
由上面的架構圖可以看到,對於RGW來說,它對上層APP扮演一個HTTP server,對下層RADOS集群作為RADOS client。RGW作為HTTP server接收和解析HTTP客戶端請求,RGW作為RADOS client為對象存儲應用提供數據存儲的通道,將應用請求數據處理並發送至RADOS存儲。
2.RGW的內部結構和處理流
以下是RGW的內部邏輯處理層級結構圖:
-
HTTP 前端接收請求數據並保存在相應的數據結構中。
-
REST API 通用處理層從 HTTP 語義中解析出 S3 或 Swift 數據並進行一系列檢查。
-
檢查通過后,根據不同 API 操作請求執行不同的處理流程。
-
如需從 RADOS 集群中獲取數據或者往 RADOS 集群中寫入數據,則通過 RGW 與 RADOS 接口適配層調用 librados 接口將請求發送到 RADOS 集群中獲取或寫入相應數據。
二、RGW對外的的三類基礎數據邏輯實體
RGW對外提供三種基礎數據邏輯實體:
- 用戶
- 存儲桶
- 對象
1.用戶
RGW兼容AWS S3和OpenStack Swift。RGW user對應S3 user,RGW user對應Swift Account,RGW subuser對應Swift user。
用戶數據信息包含:
- 用戶認證信息:S3(access key, secret key), Swift(secret key)
- 訪問控制權限信息:包含操作訪問權限(read、write、delete等)和訪問控制列表ACL
- 用戶配額信息:防止某些用戶占用過多存儲空間,根據用戶付費情況配置存儲空間。
2.存儲桶(bucket)
存儲桶是對象的容器,是為了方便管理和操作具有相同屬性的一類對象而引入的一級管理單元。
存儲桶信息包含:
- 基礎信息:(保存在對應RADOS對象的數據部分)RGW關注的信息,包含bucket配額信息(最大對象數目或最大對象大小總和),bucket placement rule,bucket中的索引對象數目等等。
- 擴展信息:(保存在對應RADOS對象的擴展屬性)對RGW透明的一些信息,如用戶自定義的元數據信息。
對於bucket placement rule,
3.對象
RGW中的應用對象對應RADOS對象。應用對象上傳分整體上傳和分段上傳,不同的上傳方式應用對象對應RADOS對象的方式不同。
首先介紹三個概念:
- rgw_max_chunk_size:分塊大小,RGW下發至RADOS集群的單個IO的大小。
- rgw_obj_stripe_size:條帶大小,multipart除首對象外的分段其他大小
- class RGWObjManifest:管理應用對象和RADOS對象的對應關系。
3.1 整體上傳
- 應用對象大小小於等於分塊大小:用戶上傳的一個對象只對應一個 RADOS 對象,該 RADOS 對象以應用對象名稱命名,應用對象元數據也保存在該 RADOS 對象的擴展屬性中。
- 應用對象大小大於分塊大小:應用對象被分解成一個大小等於分塊大小的首對象,多個大小等於條帶大小的中間對象,和一個大小小於等於條帶大小的尾對象。首對象以應用對象名稱命名,在 RGW 中將該對象稱為head_obj,該對象的數據部分保存了應用對象前 rgw_max_chunk_size 字節的數據,擴展屬性部分保存了應用對象的元數據信息和manifest信息。中間對象和尾對象保存應用對象剩余的數據,對象名稱為
“shadow_” + “.” + “32bit 隨機字符串” + “_” + “條帶編號”
,其中條帶編號從1開始。
3.2 分段上傳
RGW依照條帶大小將應用對象的每一個分段分成多個RADOS對象,每個分段的第一個 RADOS 對象名稱為:
“_multipart_” + “用戶上傳對象名稱” + “分段上傳ID” + “分段編號”
其余對象的名稱為:“_shadow_” + “用戶上傳對象名稱” + “分段上傳ID” + “分段編號” + “_” + “條帶編號”
當所有的分段上傳結束后,RGW 會從 data_extra_pool 中的分段上傳臨時對象中讀取各個分段信息,主要是各分段的 manifest 信息,組成一個 manifest;然后生成一個新的 RADOS 對象,即 head obj,用來保存分段上傳的應用對象的元數據信息和各分段的manifest。