講到這個對象存儲,大家可能不會很陌生,因為現(xiàn)在很多用到我們對象存儲,很多手機的備份,無論是這些小米,或者Apple,手機備份傳到對象存儲系統(tǒng)上面。然后,百度對象存儲為大家所熟知的百度網(wǎng)盤,百度網(wǎng)盤底層系統(tǒng),就是這一套對象存儲系統(tǒng),這個在產(chǎn)品形態(tài)上面有兩種。第一種標(biāo)準(zhǔn)對象存儲系統(tǒng),提供一種多副本存儲形式,保存一些比較頻繁訪問的數(shù)據(jù),比如網(wǎng)站首頁、圖片數(shù)據(jù)。然后,我們還提供一個低頻BOS,提供一些訪問頻度不是很高的數(shù)據(jù)存儲,采用EC編碼降低成本。
然后,我們最近做了新存儲,就是一個網(wǎng)關(guān)。百度云在運營過程當(dāng)中發(fā)現(xiàn),很多傳統(tǒng)客戶上云,他們的數(shù)據(jù)是符合對象存儲的場景的,因為他數(shù)據(jù)可能非常多,比較在意降低成本。所以,他們數(shù)據(jù)如果上對象存儲,大量的這些數(shù)據(jù)往對象存儲上面搬遷需要很大成本,因為接口原因搬遷成本比較高。我們開發(fā)了一個網(wǎng)關(guān),客戶可以直接在云上面買一個云服務(wù)器,這個云服務(wù)器通過這個網(wǎng)關(guān),通過一些協(xié)議直接訪問對象存儲。這個產(chǎn)品將會在明年的Q1面市。
百度云存儲挑戰(zhàn)與應(yīng)對
講了那么多云存儲,我們的目的是什么?在我看來4個方面,一是提供一種非常非常易用的云存儲,接口非常簡單,服務(wù)非常好;第二,提供一個高可靠的環(huán)境,客戶交了錢,存儲數(shù)據(jù),必須保證這個可靠性;第三就是高可用,因為存儲基礎(chǔ)設(shè)施部署在云上,云提供一個4個9以上的服務(wù)可用。第四就是低成本,很多情況下是因為成本,在云上面一些存儲可以規(guī)?;少?,規(guī)?;\維,從而降低整個采購運營成本。
云存儲有什么挑戰(zhàn)?這個里面第一部分介紹一下云存儲面向就是天災(zāi)跟人禍。其實這個是遇到過,14年時候,百度曾經(jīng)有一個機房被雷擊了,整個機房就不可以提供服務(wù)了。像在今年夏天,有一些移動互聯(lián)網(wǎng)公司服務(wù)出現(xiàn)中斷,這是因為機房進(jìn)水了,這個也是天災(zāi)的因素。所以,在一些云上就是考慮怎么避免天災(zāi),還有人禍,某某某因為修管道等等之類把光纖挖斷了,導(dǎo)致互聯(lián)網(wǎng)服務(wù)受損了。
除了這些天災(zāi)跟人禍之外,我們做云存儲的時候,還要遇到很多的一些存儲的硬件故障。包括交換機、存儲服務(wù)器、硬盤等。
對抗天災(zāi),最主要的手段是什么?就是跨地域,做一些冗余備份,有幾種方式。第一級,我們提供了地域的冗余,一些重要的服務(wù),我們在華北,華東,華南,三個地域分別部署存儲服務(wù)。然后,即使在同樣一個地域,我們同樣也是會部署多個機房,北京,有一些比較大一些機房提供這些數(shù)據(jù)跨區(qū)域的冗余。
然后,針對同樣一個區(qū)域,我們依然會提供很多的一些服務(wù),就是機房里面提供跨節(jié)點,通過一些機制保障數(shù)據(jù)可靠性。這個里面需要做存儲系統(tǒng)的時候,還有很多控制節(jié)點,這個也是需要做到一些高可用,這樣才可以根本上保障系統(tǒng)是OK的。
OK,這個圖是我們的拿一個機房舉例,比較純粹的一個系統(tǒng),我們在構(gòu)建這個訪問原則的時候,一個機房依然有一個隔離的策略。第一級就是交換機,然后,初期的時候,故障率很高。買的部件也是會出現(xiàn)問題,還有就是節(jié)點,因為電源故障,總是有一些故障的。然后,其實我們面臨最多的就是第三級,就是磁盤有一些故障,磁盤故障率都是有千分之五故障率,頭三年,還沒有過保修范圍之內(nèi)。
所以,這個后面右面舉了一個例子,有一個數(shù)據(jù),這個數(shù)據(jù)就是三個副本,放三個不同的交換機,還有不同的機器,不同的磁盤里面去,一個機器一個磁盤壞的時候不影響整個數(shù)據(jù)的可靠性。對于控制節(jié)點的冗余,實際上就是通過構(gòu)建一個這種復(fù)制狀態(tài)機,提供多個副本,解決數(shù)據(jù)一致性。具體來講,實現(xiàn)業(yè)界的Raft一致性協(xié)議,解決master修復(fù),復(fù)制,節(jié)點變更。因為Master也是進(jìn)行一些維護,這個時候頻繁替換一些master節(jié)點,我們要做很多的冗余。
百度云塊存儲
首先,介紹一下塊存儲,塊存儲其實跟云主機綁定在一起的,云主機跟云磁盤其實是提供一個可用區(qū)域級別,一個部署一個服務(wù)。每一個可用區(qū)內(nèi)部部署一套系統(tǒng),提供服務(wù)。然后,同時,就是把快照放一個地域范圍內(nèi),整個就是這個范圍內(nèi)生效。北京兩個機房,你這個主機,磁盤放在那個機房的有時候就是進(jìn)行遷移的時候,先通過快照放在北京,共享一個快照池子,再把主機遷到另外一個機房。
討論任何云存儲的系統(tǒng)之前,我們先要明確一下存儲模型是什么樣子?對于云磁盤這個存儲產(chǎn)品,我們設(shè)置存儲模型兩個字,第一個就是拆,第二個就是聚。由于提供這種邏輯的一種形態(tài),那么,我們需要把這個拆成一個數(shù)據(jù)的一個塊兒,因為這個云磁盤使用當(dāng)中有很多空洞率。這個使用十幾個G,不需要把沒有使用過的塊兒都是分配出來。所以,可以節(jié)省一些成本。
第二點就是什么呢?如果我把所有這個都拆成一個固定大小的塊之后,就面臨一個問題。大家如果熟悉這個架構(gòu)設(shè)計,其實就是明白,這個當(dāng)中有一個問題:我為每一個存儲設(shè)計一個塊兒,內(nèi)存是吃不住的。就是非常的消耗內(nèi)存,而且沒有必要,就是64兆搞一個原型機。就是把拆好的這些,再聚合成一個一個的BlockGroup。然后,我們集群去管理這些BlockGroup就可以了。這樣的話把整個量級降低兩個量級左右。比如說,一個BlockGroup是64兆,如果我這個副本是一個6.4級,就是兩個量級,要不然就是三個量級的降低。
OK。云磁盤這個模型之后,就考慮云磁盤架構(gòu)怎么實現(xiàn)的。比較像傳統(tǒng)分布式存儲的架構(gòu),幾個常見的BlockServer必不可少的。我們的Master,這個限速多少?就是這樣一些信息。另外一個,就是剛剛講到了,聚合很多很多BlockGroup,就是管理這些BlockGroup,這些怎么復(fù)制?怎么調(diào)度他們?什么節(jié)點上來?這個是控制層面一些東西
然后,數(shù)據(jù)就是存在BlockServer,后面簡單講到數(shù)據(jù)一個復(fù)制跟修復(fù)的一些東西。這個里面單獨提出一個模塊,我們有一個叫做什么呢?SnapshotExecutor,包括執(zhí)行創(chuàng)建一個快照,回滾一個快照,整個相當(dāng)于一個分布式任務(wù)調(diào)度系統(tǒng),這個是相當(dāng)于一個分布式調(diào)度系統(tǒng),Master調(diào)度任務(wù),就是對應(yīng)不同的BlockServer,把相應(yīng)的BlockServer進(jìn)行快照,然后把數(shù)據(jù)寫到對象存儲里面。
剛剛講到了這個BlockServer進(jìn)行數(shù)據(jù)復(fù)制,實現(xiàn)這個數(shù)據(jù)的冗余,還有就是可靠性。
這是一個復(fù)制結(jié)構(gòu),這個復(fù)制結(jié)構(gòu)在業(yè)界就是比較折中的一個方式,在延遲上面達(dá)到比較優(yōu)的一個折中。然后,另外,我們就是沒有實現(xiàn)那種什么呢?就是三副本,都是寫成功才可以成功,如果有一個磁盤卡了一下,這個IO就是抖了一下。有時候抖的不是一秒,兩秒,甚至是10秒以上的情況。我們實現(xiàn)了什么?就是多數(shù)復(fù)制成功這樣一個機制。那么,主掛了,這個副本有一些成功的可以成功。有一個掛了,有一個慢了,不影響整個復(fù)制的過程。
對于云磁盤服務(wù)來講,任何一個塊兒,用戶都可能在下一時刻訪問這些塊兒,所以,必須做一個不影響用戶現(xiàn)在的讀寫一種修復(fù)機制。我們實現(xiàn)的就是寫時修復(fù)一種方案。
百度云對象存儲系統(tǒng)
介紹一下百度存儲系統(tǒng)。這個不單單是簡單存儲系統(tǒng),就是一個生態(tài)。從這個數(shù)據(jù)的傳輸存儲,到數(shù)據(jù)處理,數(shù)據(jù)分發(fā),整個一個生態(tài)。
這個數(shù)據(jù)傳輸,亞馬遜都是拿一些機箱,一些卡車運輸。百度也是一樣的,也是進(jìn)行一些服務(wù)。
架構(gòu)就是三個系統(tǒng),第一個系統(tǒng)就是接入系統(tǒng),CloudStorage,等等一系列接入事情。第二個,MetaStorage,這個里面就是什么呢?對象存儲提供一種目錄數(shù)的概念。最后一個叫做DataStorage,難度比較高,提供對應(yīng)的一些數(shù)據(jù)存儲。
其實對象存儲提供這種跨地域容災(zāi),上面就是一個接入層,用戶數(shù)據(jù),先寫入接入層。這個時候數(shù)據(jù)可以雙寫。把原型機雙寫,接下來,寫成功了,這個消息隊列就是分布式,也是跨區(qū)域容災(zāi)的。這樣的話多個機房可以同步這個列表,看一下有沒有成功。
OK,討論一下,剛剛介紹整個架構(gòu),提供了近期一個數(shù)據(jù),就是多副本數(shù)據(jù),歷史數(shù)據(jù)就是采用編碼,跟整個對象存儲編碼差不多。對于低頻BOS,就是采用一些編碼,索引跟數(shù)據(jù)是分離的。這些EC編碼使用低功耗。對于低頻存儲也是用這個接的,我們一個引擎解決這個問題了,把數(shù)據(jù)放內(nèi)存當(dāng)中。EC編碼進(jìn)行什么呢?然后,然后進(jìn)行編碼,然后,存下某一個(英文),存在EC存儲里面具體的位置。
所以,依賴內(nèi)部一個故障預(yù)警一個系統(tǒng),就是可以做到85%正確率,就是對應(yīng)這個數(shù)據(jù),這樣不用讀8份數(shù)據(jù)。這個是RBS架構(gòu)。