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