RGW抽象來看就是基於rados集群之上的一個rados-client實例。
Object和pool簡述
Rados集群網上介紹的文章很多,這里就不一一敘述,主要要說明的是object和pool。在rados集群中任意一個對象都會映射為一個(pool,object)。其中pool是存儲池,object為對象名。如果你只是做rados集群上層應用的開發(類似開發rgw)。只需要設計如何將數據存儲到rados集群中哪個pool及哪個對象即可。
RGW中pool和object應用
RGW中存在的pool比較多,不同的pool管理不同的object數據。這里要關注2個數據結構:
struct RGWZoneParams {
rgw_bucket domain_root;
rgw_bucket control_pool;
rgw_bucket gc_pool;
rgw_bucket log_pool;
rgw_bucket intent_log_pool;
rgw_bucket usage_log_pool;
rgw_bucket user_keys_pool;
rgw_bucket user_email_pool;
rgw_bucket user_swift_pool;
rgw_bucket user_uid_pool;
};
struct RGWZonePlacementInfo {
string index_pool;
string data_pool;
string data_extra_pool;
}
RGW應用到rados中的對象分為2類,一類是普通對象,相當於普通文件的存儲。還一類是omap對象,用於存儲K-V對象。下面介紹RGW主要pool的用途:
domain_root pool:每個bucket都對應一個普通對象,用於存儲bucket元數據。
control pool:該pool上創建若干個普通對象用於watch-notify(librados提供的一種watch和notify機制)。目前RGW用這種機制來實現分布式緩存(后續會詳細介紹)。
gc pool:rgw中大文件數據一般在后台刪除,該pool用於記錄那些待刪除的文件對象。
log pool:用於存儲3種類型log,oplog,meta_log,data_log。其中oplog主要用於記錄用戶操作記錄。
Meta_log和data_log都是遠程復制功能中需要用到的,后續會詳細介紹。
Intent log pool:這個pool目前沒有用到。
usage log pool:存儲計量數據統計,比如上傳文件多少次,下載多少次,遍歷bucket多少次之類。
user keys pool:用於存儲用戶AK和uid的對應關系,方便通過用戶restful請求的ak找到用戶id。
user email pool:用於存儲用戶email和uid的對應關系。
user swift pool:用於存儲swift key和uid的對應關系
user uid pool:用於存儲用戶信息,每個用戶都有一個唯一的uid作為對象名。同時每個用戶還會有一個用於索引該用戶下桶的對象也存在該pool下面。
index pool:存儲bucket的文件索引對象。每個bucket對應在該pool下有一個索引對象,用來索引該bucket下所有的文件。同時遠程復制中用到的bilog也存儲在該pool的bucket索引對象上。
data pool:顧名思義,所有的文件數據都存在該pool下。
data extra pool:Multipart upload過程中一些中間態的數據,會存在該pool上。這些數據可以幫助用戶進行斷點續傳及垃圾數據回收。
另外還有2個pool也比較重要
zone root pool:用於存放zone的元數據信息,其實就是存放RGWZoneParams數據結構
region root pool:用於存放region的元數據信息。
