基礎(chǔ)概念
object/part/
一個(gè) RGW Object 由 N 個(gè) part 組成废麻,每個(gè) part 由 M 個(gè) strip 組成酣溃。對(duì)于簡(jiǎn)單上傳同蜻,我們認(rèn)為 N 為 1闪湾, part number 為 0。對(duì)于分塊上傳尊搬,我們認(rèn)為每塊就是一個(gè) part叁鉴,part number 也是相對(duì)應(yīng)的 1~N。
對(duì)于一個(gè) part佛寿,會(huì)分為 M 個(gè) strip幌墓,每個(gè) strip 對(duì)應(yīng)于一個(gè) rados obj。第一個(gè) strip 稱之為 HEAD obj冀泻,其他 M-1 個(gè)strip 稱之為 TAIL obj常侣。一般情況下,對(duì)象的一些元數(shù)據(jù)都會(huì)保存在 HEAD 對(duì)象的 attr/omap 中弹渔。
如何從一個(gè)對(duì)象名找到該對(duì)象所有的 part 和 strip 呢胳施? RGW 通過 manifest 類來實(shí)現(xiàn),manifest 會(huì)描述對(duì)象每個(gè)區(qū)間的數(shù)據(jù)分別由什么對(duì)象存儲(chǔ)肢专。在用戶讀取對(duì)象 foo 的時(shí)候舞肆,RGW 直接定位到同名的 HEAD obj(名字為 <bucket_id>_<obj_id>
),并讀取該對(duì)象的 attr鸟召,拿到 manifest 數(shù)據(jù)胆绊。通過 manifest 可以得到文件由哪些 strip 組成,并分別去讀取這些 strip obj欧募,返回給用戶压状。
atomic upload
atomic upload 是在一次請(qǐng)求內(nèi)完成的上傳操作,屬于實(shí)現(xiàn)比較清晰的跟继。對(duì)于 atomic upload 的對(duì)象看成 part 為1种冬,part number 為 0 的情況。在實(shí)際的數(shù)據(jù)存儲(chǔ)層(RADOS)上舔糖,會(huì)有一個(gè)名字為 <bucket_id>_<obj_name>
的 head 對(duì)象娱两,以及若干個(gè)在 shadow namespace 下的 tail 對(duì)象,名字為 <bucket_id>.1__shadow_.<prefix_id>_<strip_num>
金吗,如
9b60b3ba-81d5-4319-9092-a7b1921a3491.4240.1__shadow_.09YONY-GM_tn2FiW3e92YOHQ7qX-fE9_.1_1
十兢。該對(duì)象所有的元數(shù)據(jù)都存儲(chǔ)在 head obj 的 attr 中,包括 manifest 信息摇庙。
multipart upload
multipart upload 是經(jīng)過 InitMultipart, N*UploadPart, CompleteMultipart
多個(gè)請(qǐng)求來完成的上傳操作旱物,比較復(fù)雜。與 atomic upload 不同的是卫袒,multipart upload 額外使用了一個(gè) extra pool 來存儲(chǔ)關(guān)于本次上傳的分塊信息宵呛, rgw_obj(bucket, oid+upload_id+”meta”)
對(duì)象會(huì)在 omap 中存儲(chǔ)每個(gè)分塊對(duì)應(yīng)的 RGWUploadPartInfo
信息,RGWUploadPartInfo
中包含了每個(gè)分塊的 manifest夕凝。在最終 CompleteMultipart 時(shí)宝穗,合并 mp meta obj 上所有分塊的 manifest 數(shù)據(jù)户秤,存儲(chǔ)到 head obj 的 attr 中,并刪除 mp meta obj逮矛。
因?yàn)榧牛瑢?duì)于一個(gè) multipart upload 的對(duì)象,會(huì)有一個(gè)同名的 head obj橱鹏,每個(gè) part 會(huì)有若干個(gè)對(duì)象組成膜蠢,這些對(duì)象中第一個(gè)位于 multi namespace,其它位于 shadow namespace莉兰。