京東統(tǒng)一存儲(chǔ)實(shí)踐
一、概況簡(jiǎn)介
京東大數(shù)據(jù)平臺(tái)構(gòu)建了一個(gè)健全的基礎(chǔ)架構(gòu),它起著至關(guān)重要的作用,為多樣化的數(shù)據(jù)處理任務(wù)和高級(jí)分析工作提供了支持。該平臺(tái)的核心組成部分之一是 Hadoop Distributed File System(HDFS),這是一個(gè)高度可擴(kuò)展的分布式文件存儲(chǔ)系統(tǒng)。HDFS 在京東大數(shù)據(jù)平臺(tái)中承擔(dān)了重要的角色,它不僅是數(shù)據(jù)存儲(chǔ)的基石,同時(shí)也是數(shù)據(jù)處理流程的一個(gè)重要環(huán)節(jié)。它為上層的數(shù)據(jù)分析工具和應(yīng)用提供了數(shù)據(jù)支撐,并為下游的數(shù)據(jù)產(chǎn)品和服務(wù)提供了強(qiáng)有力的數(shù)據(jù)輸入。
為了強(qiáng)化數(shù)據(jù)管理和運(yùn)維效率,京東大數(shù)據(jù)平臺(tái)實(shí)施了可視化管理工具,這使得運(yùn)維團(tuán)隊(duì)能夠通過(guò)監(jiān)控系統(tǒng)輕松快捷地定位集群?jiǎn)栴}。實(shí)時(shí)監(jiān)控和可視化數(shù)據(jù)展現(xiàn),極大地簡(jiǎn)化了日常管理任務(wù),提高了運(yùn)維響應(yīng)速度。京東大數(shù)據(jù)平臺(tái)的離線存儲(chǔ)能力已經(jīng)達(dá)到了較大規(guī)模,擁有數(shù)萬(wàn)臺(tái)服務(wù)器,總存儲(chǔ)量達(dá)到 EB 級(jí)別。日常數(shù)據(jù)增長(zhǎng)量達(dá)到數(shù)十 PB。這種規(guī)模的存儲(chǔ)系統(tǒng)為平臺(tái)上每天百萬(wàn)次的作業(yè)提供了穩(wěn)定且高效的讀寫性能,保障了大數(shù)據(jù)平臺(tái)的平穩(wěn)運(yùn)行。
二、跨域存儲(chǔ)
1. 存在的問(wèn)題
隨著京東業(yè)務(wù)的持續(xù)發(fā)展,對(duì)底層數(shù)據(jù)存儲(chǔ)的要求也日益增高,單機(jī)房獨(dú)立部署的架構(gòu)已無(wú)法滿足日常的需求,也不符合未來(lái)多機(jī)房的發(fā)展需求,面臨著一系列跨域存儲(chǔ)問(wèn)題:
容災(zāi)能力:在當(dāng)前的多機(jī)房分布架構(gòu)中,雖然存在多個(gè)數(shù)據(jù)中心,但尚未實(shí)現(xiàn)真正的多機(jī)房容災(zāi)能力。
數(shù)據(jù)同步:當(dāng)業(yè)務(wù)層需要跨機(jī)房訪問(wèn)數(shù)據(jù)時(shí),目前采用的方案主要是數(shù)據(jù)同步。這種同步通過(guò) distcp 進(jìn)行,實(shí)現(xiàn)元數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)的復(fù)制。在這種模式下,元數(shù)據(jù)會(huì)在每個(gè)數(shù)據(jù)中心各自存儲(chǔ)一份,這種做法無(wú)法保證元數(shù)據(jù)的一致性,數(shù)據(jù)一致性的確保必須依賴于業(yè)務(wù)層的邏輯。
數(shù)據(jù)存儲(chǔ):由于數(shù)據(jù)在多個(gè)機(jī)房存儲(chǔ),導(dǎo)致了數(shù)據(jù)的大量冗余,這種冗余不僅占據(jù)了大量的存儲(chǔ)空間,也導(dǎo)致了單位數(shù)據(jù)存儲(chǔ)成本的顯著提高。
跨機(jī)房專線不受控:跨機(jī)房復(fù)制數(shù)據(jù)時(shí),通過(guò)跨機(jī)房的專線進(jìn)行數(shù)據(jù)表的讀取,這些操作可能導(dǎo)致機(jī)房間專線出現(xiàn)一些不可控的問(wèn)題。
2. 存儲(chǔ)架構(gòu)
針對(duì)上述問(wèn)題,我們決定采用全量存儲(chǔ)加上全網(wǎng)拓?fù)涞牟呗詠?lái)實(shí)現(xiàn)異地容災(zāi)和跨域存儲(chǔ)的能力。通過(guò)這種方法,可以提高數(shù)據(jù)的可用性和一致性,同時(shí)優(yōu)化存儲(chǔ)效率,降低成本。
在這一架構(gòu)中,多個(gè)數(shù)據(jù)節(jié)點(diǎn)(DN)同時(shí)向同一機(jī)房的元數(shù)據(jù)節(jié)點(diǎn)(NameNode)匯報(bào)信息,實(shí)現(xiàn)了全網(wǎng)拓?fù)浣Y(jié)構(gòu)和全量存儲(chǔ)的功能。這種設(shè)計(jì)允許單個(gè)元數(shù)據(jù)節(jié)點(diǎn)統(tǒng)一管理源數(shù)據(jù),有效解決了數(shù)據(jù)一致性問(wèn)題,并控制了數(shù)據(jù)遷移成本,達(dá)到無(wú)感知遷移的用戶體驗(yàn)。
在跨域存儲(chǔ)功能實(shí)施之前,機(jī)房間的數(shù)據(jù)同步主要通過(guò) distcp 完成。然而,在實(shí)際工作中,如在一個(gè)大規(guī)模機(jī)房遷移過(guò)程中,若采用 distcp 進(jìn)行遷移,涉及的數(shù)據(jù)量高達(dá)數(shù)十 PB,這將要求遷移所有相關(guān)業(yè)務(wù)表和任務(wù),帶來(lái)巨大的成本。
采用了跨域存儲(chǔ)架構(gòu)后,遷移效率得到顯著提升,提高了 350%。此架構(gòu)支持跨機(jī)房數(shù)據(jù)同步,業(yè)務(wù)無(wú)需分析上下游鏈路,極大簡(jiǎn)化了遷移過(guò)程。在一個(gè)實(shí)際案例中,遷移了上萬(wàn)張表,涉及數(shù)十個(gè)產(chǎn)品和上千個(gè)業(yè)務(wù)。
除了實(shí)現(xiàn)跨機(jī)房存儲(chǔ)節(jié)點(diǎn)的匯報(bào)功能外,架構(gòu)還在其他機(jī)房部署了只讀節(jié)點(diǎn),并支持跨機(jī)房切換能力,允許元數(shù)據(jù)節(jié)點(diǎn)實(shí)現(xiàn)跨機(jī)房容災(zāi)能力。只讀節(jié)點(diǎn)的引入,使得可以啟用讀寫分離,將讀流量全部轉(zhuǎn)移到只讀節(jié)點(diǎn),從而提高了整個(gè)集群的讀性能,性能提升超過(guò)了 70%。同時(shí),隨著讀流量從活躍節(jié)點(diǎn)遷移走,活躍節(jié)點(diǎn)可以專注于優(yōu)化寫性能。此外,開(kāi)啟聚合寫功能進(jìn)一步提升了集群寫數(shù)據(jù)的能力。
盡管跨機(jī)房存儲(chǔ)架構(gòu)帶來(lái)了多種優(yōu)勢(shì),但它也伴隨著一些挑戰(zhàn)需要克服。
首先,隨著跨機(jī)房存儲(chǔ)功能的實(shí)施,集群規(guī)??赡軙?huì)迅速擴(kuò)大,導(dǎo)致單一集群規(guī)模激增至數(shù)萬(wàn)的規(guī)模。這種快速擴(kuò)張帶來(lái)了管理和維護(hù)的難度,對(duì)集群管理能力提出了更高的要求。
其次,跨機(jī)房心跳(心跳機(jī)制用于監(jiān)測(cè)節(jié)點(diǎn)間的活躍狀態(tài))同樣面臨挑戰(zhàn)。由于物理距離和網(wǎng)絡(luò)延遲的存在,確??鐧C(jī)房心跳的穩(wěn)定和可靠性變得更加困難,需要采用高效的同步機(jī)制來(lái)減少心跳丟失和誤判的情況。
最后,多機(jī)房存儲(chǔ)節(jié)點(diǎn)的加入復(fù)雜化了元數(shù)據(jù)節(jié)點(diǎn)的拓?fù)浣Y(jié)構(gòu),同時(shí)對(duì)跨機(jī)房流量的控制也提出了新的要求。流量控制機(jī)制必須能夠應(yīng)對(duì)來(lái)自不同機(jī)房的數(shù)據(jù)流,確保數(shù)據(jù)同步的效率和準(zhǔn)確性,同時(shí)避免網(wǎng)絡(luò)擁堵和數(shù)據(jù)丟失。
總結(jié)而言,為了充分發(fā)揮跨機(jī)房存儲(chǔ)架構(gòu)的優(yōu)勢(shì),必須解決伴隨其帶來(lái)的規(guī)模擴(kuò)張、心跳同步和流量控制等一系列問(wèn)題。
3. 拓?fù)渑c數(shù)據(jù)存儲(chǔ)
針對(duì)跨機(jī)房數(shù)據(jù)分布問(wèn)題,采取了通過(guò)修改目錄上的 XTTR 屬性來(lái)解決的方案。該方案實(shí)現(xiàn)了跨域標(biāo)簽功能,該標(biāo)簽攜帶了關(guān)鍵信息,包括數(shù)據(jù)分布、標(biāo)簽狀態(tài)、標(biāo)簽的生命周期以及提交信息等。這些標(biāo)簽隨著 Editlog 生成,并持久化保存在對(duì)應(yīng)的文件系統(tǒng)鏡像(fsimage)中。
在新增文件時(shí),系統(tǒng)會(huì)檢查文件的父目錄來(lái)確定對(duì)應(yīng)的跨域標(biāo)簽。如果父目錄包含多層,并且有多個(gè)目錄都配置了跨域標(biāo)簽,系統(tǒng)將遵循“就近原則”,即選擇與文件最接近的跨域標(biāo)簽來(lái)進(jìn)行操作。這樣的處理原則確保了數(shù)據(jù)分布的合理性,并提高了存儲(chǔ)系統(tǒng)的效率和一致性。
4. 跨域數(shù)據(jù)流
跨域流量控制是跨域存儲(chǔ)特性的核心組成部分,它主要通過(guò)跨域標(biāo)簽來(lái)管理機(jī)房間的數(shù)據(jù)流動(dòng)。根據(jù)客戶端的訪問(wèn)請(qǐng)求及其所屬機(jī)房信息,系統(tǒng)可以確定數(shù)據(jù)應(yīng)當(dāng)寫入的目標(biāo)機(jī)房。
在數(shù)據(jù)寫入過(guò)程中,系統(tǒng)首先依據(jù)塊標(biāo)簽(跨域標(biāo)簽)決定同機(jī)房需要寫入的數(shù)據(jù)塊數(shù)量。完成數(shù)據(jù)塊的寫入后,這一操作將觸發(fā)元數(shù)據(jù)節(jié)點(diǎn)內(nèi)部的一個(gè)模塊——CR check 模塊。CR check 模塊負(fù)責(zé)下發(fā)補(bǔ)塊任務(wù),以實(shí)現(xiàn)異步的跨機(jī)房數(shù)據(jù)同步。
例如,當(dāng)客戶端訪問(wèn)屬于 A 機(jī)房時(shí),數(shù)據(jù)首先會(huì)被寫入 A 機(jī)房。隨后,元數(shù)據(jù)節(jié)點(diǎn)將下發(fā)補(bǔ)塊任務(wù),并通過(guò)異步操作在其他機(jī)房間進(jìn)行數(shù)據(jù)塊的相互拷貝。這個(gè)過(guò)程確保了數(shù)據(jù)在各個(gè)機(jī)房間能夠得到一致性的維護(hù),同時(shí)也滿足了數(shù)據(jù)冗余和可靠性的需求。通過(guò)這種方式,跨域存儲(chǔ)不僅優(yōu)化了數(shù)據(jù)的寫入流程,還提高了整個(gè)存儲(chǔ)系統(tǒng)的穩(wěn)定性和可擴(kuò)展性。
5. 跨域補(bǔ)塊
最初階段,跨域讀取和數(shù)據(jù)同步是通過(guò) distcp 來(lái)實(shí)現(xiàn)的。隨著架構(gòu)的演進(jìn),現(xiàn)有跨域存儲(chǔ)架構(gòu)在元數(shù)據(jù)節(jié)點(diǎn)內(nèi)部新增了一個(gè)名為 CR check 的模塊,該模塊負(fù)責(zé)創(chuàng)建數(shù)據(jù)拷貝任務(wù),以便執(zhí)行跨機(jī)房間的數(shù)據(jù)復(fù)制。
就性能而言,元數(shù)據(jù)節(jié)點(diǎn)內(nèi)部通過(guò) CR check 模塊下發(fā)的異步補(bǔ)塊任務(wù)效率明顯高于 distcp 同步效率。這是因?yàn)?CR check 模塊下發(fā)的補(bǔ)塊任務(wù)可以分發(fā)至多個(gè)數(shù)據(jù)節(jié)點(diǎn)(DN)上執(zhí)行,其并發(fā)性顯著提升。此外,在節(jié)點(diǎn)選擇方面,CR check 模塊的性能也優(yōu)于 distcp。
在實(shí)際應(yīng)用中,除了處理新數(shù)據(jù)的跨機(jī)房復(fù)制過(guò)程,還需要處理現(xiàn)有的存量數(shù)據(jù)。這涉及到批量變更目錄下跨域標(biāo)簽的操作,主要源于三種操作:新增跨域標(biāo)簽、刪除跨域標(biāo)簽以及修改跨域標(biāo)簽。特別地,修改跨域標(biāo)簽通常涉及目錄的重命名操作,例如將目錄從跨域目錄轉(zhuǎn)移至非跨域目錄,或從一個(gè)跨域目錄移動(dòng)到另一個(gè)跨域目錄。
這些目錄相關(guān)的操作通過(guò)內(nèi)部的異步更新器模塊進(jìn)行處理。該模塊調(diào)用 CR check 模塊掃描目錄下的所有文件,以判斷哪些文件需要進(jìn)行跨域補(bǔ)充處理。這樣的設(shè)計(jì)確保了在文件層面上,跨域存儲(chǔ)能夠靈活地響應(yīng)目錄變化,維護(hù)數(shù)據(jù)的一致性和完整性。
6. 異步更新器
異步更新器是一個(gè)關(guān)鍵組件,用于處理存量數(shù)據(jù)的異步更新任務(wù)。為了優(yōu)先保障電商等優(yōu)先級(jí)較高的表盡快完成跨機(jī)房數(shù)據(jù)流動(dòng),異步更新器采用了帶有優(yōu)先級(jí)的隊(duì)列設(shè)計(jì)。
在處理隊(duì)列中的任務(wù)時(shí),異步更新器會(huì)啟動(dòng)一個(gè)線程,該線程會(huì)按照任務(wù)的優(yōu)先級(jí)進(jìn)行排序處理。在處理過(guò)程中,線程不會(huì)一次性完成一個(gè)目錄下的所有任務(wù),而是采取輪詢方式,分步處理不同目錄下的任務(wù)。這樣的設(shè)計(jì)保證了在處理過(guò)程中,一旦有新的高優(yōu)先級(jí)目錄任務(wù)加入,系統(tǒng)可以及時(shí)調(diào)整處理順序,優(yōu)先處理這些高優(yōu)先級(jí)任務(wù)。同時(shí)避免了單個(gè)大表(如 PB 級(jí)別的表)占用過(guò)多時(shí)間而導(dǎo)致其他任務(wù)阻塞的問(wèn)題。異步更新器不會(huì)等待一個(gè)目錄下的所有任務(wù)全部完成后才開(kāi)始處理下一個(gè)目錄。這種設(shè)計(jì)確保了系統(tǒng)處理的高效性和響應(yīng)性,不僅符合了初期的設(shè)計(jì)理念,同時(shí)也避免了大表在數(shù)據(jù)遷移中對(duì)系統(tǒng)造成的影響。
7. 跨域流控
跨域流控是跨域存儲(chǔ)架構(gòu)中的一個(gè)重要機(jī)制,用于管理和控制不同機(jī)房間的數(shù)據(jù)傳輸速度。在初始版本的跨域架構(gòu)設(shè)計(jì)中,存在單一的跨域模塊隊(duì)列。然而,在大規(guī)模使用場(chǎng)景下,由于不同機(jī)房間數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)的數(shù)量和專線帶寬的差異,出現(xiàn)了數(shù)據(jù)補(bǔ)塊速度不一致的問(wèn)題。這導(dǎo)致了在某些小機(jī)房中數(shù)據(jù)補(bǔ)塊速度緩慢,進(jìn)而造成了跨域模塊隊(duì)列和異步更新器隊(duì)列的大量積壓。
這種積壓不僅影響了其他機(jī)房補(bǔ)塊的速度,還可能出現(xiàn)跨區(qū)域讀取數(shù)據(jù),專線不可控的現(xiàn)象。為解決此問(wèn)題,我們根據(jù)機(jī)房分布和數(shù)據(jù)流動(dòng)方向,進(jìn)行了補(bǔ)塊隊(duì)列的拆分,從而避免了不同機(jī)房間數(shù)據(jù)流控制的相互影響。
處理補(bǔ)塊任務(wù)的是 CrossRegionRedundancyMonitor 線程,它負(fù)責(zé)處理補(bǔ)塊隊(duì)列中的所有數(shù)據(jù)塊,并將這些塊轉(zhuǎn)化為異步補(bǔ)塊任務(wù),下發(fā)到數(shù)據(jù)節(jié)點(diǎn)(DN)端執(zhí)行。該線程復(fù)用了社區(qū)版本 ReduceMonitor 線程中處理補(bǔ)塊的部分邏輯,這樣既保證了非跨域補(bǔ)塊的時(shí)效性,同時(shí)也提升了跨域補(bǔ)塊的處理速度。
由于跨機(jī)房拷貝涉及專線的使用,為了減輕對(duì)專線的沖擊,我們引入了限速器。隨著模塊隊(duì)列積壓?jiǎn)栴}的出現(xiàn),我們意識(shí)到統(tǒng)一限速存在不合理性。因此,在二次優(yōu)化時(shí),我們對(duì)限速器也進(jìn)行了拆分,每個(gè)補(bǔ)塊隊(duì)列對(duì)應(yīng)一個(gè)限速器,并且限速值可以根據(jù)專線的實(shí)時(shí)使用量動(dòng)態(tài)調(diào)整。這樣的優(yōu)化不僅保障了專線的穩(wěn)定性,還加快了數(shù)據(jù)傳輸?shù)乃俣龋岣吡苏麄€(gè)跨域存儲(chǔ)架構(gòu)的效率。
跨機(jī)房流量的管理不僅涉及數(shù)據(jù)的跨機(jī)房流動(dòng),還包括跨機(jī)房的數(shù)據(jù)讀寫操作。如前所述,所有的 RPC 請(qǐng)求均攜帶機(jī)房信息,系統(tǒng)依據(jù)該信息返回指定的存儲(chǔ)節(jié)點(diǎn)。例如,如果請(qǐng)求來(lái)自機(jī)房 A,則會(huì)優(yōu)先寫入或讀取機(jī)房 A 的數(shù)據(jù);若來(lái)自機(jī)房 B,則相應(yīng)地操作機(jī)房 B 的數(shù)據(jù)。這種機(jī)制有效避免了大部分的跨域流量。
然而,存在一些異常情況,比如使用非標(biāo)準(zhǔn)客戶端訪問(wèn)或機(jī)房信息缺失的情況,這時(shí)候存儲(chǔ)系統(tǒng)中可能沒(méi)有可用的節(jié)點(diǎn)信息。為了兼容這類情況,系統(tǒng)會(huì)根據(jù)IP 信息推斷機(jī)房位置。在獲取到機(jī)房信息后,系統(tǒng)按照訪問(wèn)流程選擇對(duì)應(yīng)的節(jié)點(diǎn)。如果無(wú)法選擇到合適的節(jié)點(diǎn),系統(tǒng)可能會(huì)進(jìn)行降級(jí)處理,例如允許訪問(wèn)跨域標(biāo)簽所指定的其他機(jī)房節(jié)點(diǎn)。
針對(duì)異常訪問(wèn)情況,系統(tǒng)設(shè)有專門的任務(wù)進(jìn)行監(jiān)控和統(tǒng)計(jì),該任務(wù)會(huì)針對(duì)異常情況進(jìn)行匯總。系統(tǒng)需要根據(jù)關(guān)鍵信息追蹤任務(wù)來(lái)源。一旦確定了任務(wù)來(lái)源,可以通知相關(guān)的數(shù)據(jù)治理團(tuán)隊(duì)進(jìn)行處理,以確保數(shù)據(jù)的正確管理和優(yōu)化跨機(jī)房流量的使用。通過(guò)這種方式,系統(tǒng)旨在減少非必要的跨機(jī)房流量,提高數(shù)據(jù)讀寫的效率。
三、分層存儲(chǔ)
隨著集群存儲(chǔ)規(guī)模的擴(kuò)大,數(shù)據(jù)量的增長(zhǎng)以及存儲(chǔ)節(jié)點(diǎn)機(jī)器類型的多樣化,一系列的挑戰(zhàn)和問(wèn)題隨之浮現(xiàn)。
其中一個(gè)顯著問(wèn)題是冷熱數(shù)據(jù)的管理。未對(duì)冷熱數(shù)據(jù)進(jìn)行區(qū)分對(duì)待可能導(dǎo)致存儲(chǔ)資源的浪費(fèi),因?yàn)槔鋽?shù)據(jù)(很少訪問(wèn)的數(shù)據(jù))占用了與熱數(shù)據(jù)(頻繁訪問(wèn)的數(shù)據(jù))同等的存儲(chǔ)資源,對(duì)效率和成本都造成了影響。
另外,不同硬件間的差異也是一個(gè)需要關(guān)注的問(wèn)題。不同硬件的存儲(chǔ)節(jié)點(diǎn)性能差異可能導(dǎo)致數(shù)據(jù)存取效率不一,這要求存儲(chǔ)系統(tǒng)能夠識(shí)別和優(yōu)化使用不同硬件特性,以提高整體存儲(chǔ)性能。
數(shù)據(jù)治理的推進(jìn)也是隨著存儲(chǔ)規(guī)模的增長(zhǎng)而變得更加復(fù)雜和重要。有效的數(shù)據(jù)治理能夠確保數(shù)據(jù)的安全、合規(guī)以及有效使用,同時(shí)降低數(shù)據(jù)冗余和管理成本。
為了應(yīng)對(duì)這些挑戰(zhàn),存儲(chǔ)系統(tǒng)需要一系列的優(yōu)化措施,如智能數(shù)據(jù)分層、自適應(yīng)數(shù)據(jù)遷移、不同硬件性能的優(yōu)化利用,以及持續(xù)的數(shù)據(jù)治理和質(zhì)量控制。這些措施旨在保證存儲(chǔ)系統(tǒng)的高效運(yùn)作,同時(shí)確保數(shù)據(jù)的安全性和可訪問(wèn)性。
1. 存儲(chǔ)對(duì)比
微服務(wù)架構(gòu)中,常見(jiàn)的存儲(chǔ)方案包括本地緩存、Redis 和 MySQL。這三種存儲(chǔ)方式各自適用于不同的數(shù)據(jù)訪問(wèn)頻率和數(shù)據(jù)熱度。具體來(lái)說(shuō):
(1)本地緩存
- 存儲(chǔ)最頻繁訪問(wèn)的數(shù)據(jù),性能最高。
- 數(shù)據(jù)讀取速度最快,因?yàn)楸苊饬司W(wǎng)絡(luò)傳輸?shù)拈_(kāi)銷。
(2)Redis
- 存儲(chǔ)在內(nèi)存中,但訪問(wèn)數(shù)據(jù)需要通過(guò)網(wǎng)絡(luò)。
- 相比本地緩存,性能略有下降,但仍遠(yuǎn)高于磁盤存儲(chǔ)。
(3)MySQL
- 通常用于持久化存儲(chǔ),涉及到磁盤 I/O,因此性能較低。
- 適用于不頻繁訪問(wèn)的數(shù)據(jù)或需要持久化保證的數(shù)據(jù)。
這種數(shù)據(jù)存儲(chǔ)的分層策略與 HDFS 社區(qū)提出的異構(gòu)存儲(chǔ)策略相呼應(yīng)。HDFS 的異構(gòu)存儲(chǔ)允許將不同類型的數(shù)據(jù)存儲(chǔ)在不同性能的本地磁盤上。我們可以根據(jù)數(shù)據(jù)的熱度將其存儲(chǔ)在相應(yīng)的磁盤類型上。HDFS 異構(gòu)存儲(chǔ)的優(yōu)勢(shì)在于能夠更細(xì)粒度地管理存儲(chǔ),支持到磁盤級(jí)別的類型定義。然而,這種優(yōu)勢(shì)在某些情況下也可能轉(zhuǎn)變?yōu)榱觿?shì):
- 由于磁盤類型有限,不支持過(guò)多層次的定義。
- 存儲(chǔ)節(jié)點(diǎn)類型的變更可能需要重啟服務(wù)才能生效。
- 若涉及到磁盤類型新增,可能需要修改存儲(chǔ)節(jié)點(diǎn)代碼,并進(jìn)行滾動(dòng)升級(jí),這對(duì)大型集群是一個(gè)復(fù)雜的過(guò)程。
- 冷熱數(shù)據(jù)之間的狀態(tài)轉(zhuǎn)換不夠靈活。
為了更高效地管理冷熱數(shù)據(jù),我們需要一種支持冷熱數(shù)據(jù)自動(dòng)轉(zhuǎn)換的分層存儲(chǔ)方案。這種方案能夠動(dòng)態(tài)根據(jù)數(shù)據(jù)的訪問(wèn)模式和熱度進(jìn)行數(shù)據(jù)遷移,優(yōu)化存儲(chǔ)資源使用,提高系統(tǒng)性能。
2. 京東分層存儲(chǔ)
京東存儲(chǔ)機(jī)器主要分為三種類型:SSD 盤機(jī)器、HDD 盤機(jī)器和多 HDD 盤的高密存儲(chǔ)機(jī)器。這三種機(jī)型的主要區(qū)別在于磁盤的性能和磁盤數(shù)量。由于 SSD 的性能優(yōu)于 HDD,HDD 的小盤機(jī)器的性能又優(yōu)于多磁盤 HDD 機(jī)器的性能?;趯?duì)京東存儲(chǔ)機(jī)器分布現(xiàn)狀的分析,決定采用以下分層存儲(chǔ)策略:
- 熱數(shù)據(jù):存儲(chǔ)在性能較高的 SSD 盤上,以提供快速的數(shù)據(jù)訪問(wèn)速度。
- 溫?cái)?shù)據(jù):存儲(chǔ)在性能適中的 HDD 盤上。
- 冷數(shù)據(jù):存儲(chǔ)在高密度 HDD 盤上。
這種策略不僅充分利用了不同機(jī)器類型的硬件特性,還解決了冷熱數(shù)據(jù)分層的問(wèn)題,優(yōu)化了存儲(chǔ)資源的使用。為了實(shí)現(xiàn)這種分層存儲(chǔ),京東對(duì)網(wǎng)絡(luò)拓?fù)溥M(jìn)行了調(diào)整,以標(biāo)識(shí)不同的機(jī)器類型,并確定它們應(yīng)當(dāng)存儲(chǔ)哪些類型的數(shù)據(jù)。此外,通過(guò)修改目錄的XATTR(擴(kuò)展屬性)來(lái)標(biāo)識(shí)目錄中數(shù)據(jù)的冷熱需求。通過(guò)這種策略和調(diào)整,我們能夠有效地將數(shù)據(jù)定位到適合其訪問(wèn)的存儲(chǔ)介質(zhì)上,從而提高了存儲(chǔ)系統(tǒng)的整體性能。
為了實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)轉(zhuǎn)換,即熱數(shù)據(jù)與溫?cái)?shù)據(jù)的互轉(zhuǎn)以及溫?cái)?shù)據(jù)與冷數(shù)據(jù)的互轉(zhuǎn),我們?cè)谠獢?shù)據(jù)節(jié)點(diǎn)(NameNode)內(nèi)部引入了一個(gè)自動(dòng)轉(zhuǎn)換模塊。該模塊基于元數(shù)據(jù)節(jié)點(diǎn)內(nèi)部的多個(gè)組件協(xié)同工作,實(shí)現(xiàn)了數(shù)據(jù)的動(dòng)態(tài)遷移和存儲(chǔ)類型轉(zhuǎn)換。
數(shù)據(jù)自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)細(xì)節(jié)如下:
- 熱數(shù)據(jù)轉(zhuǎn)換為溫?cái)?shù)據(jù):通過(guò)內(nèi)部的數(shù)據(jù)搬移機(jī)制實(shí)現(xiàn)節(jié)點(diǎn)替換。
- 溫?cái)?shù)據(jù)轉(zhuǎn)換為熱數(shù)據(jù):同樣依靠數(shù)據(jù)搬移機(jī)制進(jìn)行節(jié)點(diǎn)替換。
- 冷數(shù)據(jù)處理:利用時(shí)間生存期(TTL)功能,當(dāng)數(shù)據(jù)存儲(chǔ)到冷數(shù)據(jù)節(jié)點(diǎn)時(shí),會(huì)進(jìn)行副本轉(zhuǎn)換為糾刪碼(Erasure Coding, EC)的過(guò)程,以優(yōu)化存儲(chǔ)效率和耐久性。
為了根據(jù)不同的機(jī)器類型區(qū)分?jǐn)?shù)據(jù)存儲(chǔ)位置,數(shù)據(jù)節(jié)點(diǎn)(DataNode,DN)上新增了多個(gè)屬性,包括但不限于:
- 讀寫權(quán)重:決定節(jié)點(diǎn)在讀寫操作中的優(yōu)先級(jí)。
- 存儲(chǔ)使用量:反映節(jié)點(diǎn)的存儲(chǔ)空間占用情況。
- 節(jié)點(diǎn)健康度:指示節(jié)點(diǎn)的健康狀況。
在進(jìn)行數(shù)據(jù)塊的選擇和寫入時(shí),不僅可以根據(jù)存儲(chǔ)類型進(jìn)行劃分,還可以根據(jù) DN 節(jié)點(diǎn)上的這些屬性值來(lái)做出決策。這些屬性值會(huì)向上匯總到機(jī)架和更高層次的元數(shù)據(jù)中。因此,在選定機(jī)架之后,可以基于節(jié)點(diǎn)的健康度或讀寫權(quán)重等因素,選擇健康性更高的節(jié)點(diǎn)來(lái)進(jìn)行數(shù)據(jù)的讀寫操作。通過(guò)這種方式,我們實(shí)現(xiàn)了一種動(dòng)態(tài)的數(shù)據(jù)存儲(chǔ)策略,既優(yōu)化了存儲(chǔ)資源的使用,又提高了數(shù)據(jù)訪問(wèn)的性能和可靠性。
在實(shí)施的分層存儲(chǔ)方案中,涉及到多個(gè)內(nèi)部模塊的修改,特別是三個(gè)核心模塊的設(shè)計(jì)與實(shí)現(xiàn)對(duì)于數(shù)據(jù)冷熱狀態(tài)的轉(zhuǎn)換至關(guān)重要:
- 數(shù)據(jù)訪問(wèn)監(jiān)視器:
該監(jiān)視器默認(rèn)采用最近最少使用(LRU)算法統(tǒng)計(jì)文件目錄的訪問(wèn)情況,篩選出熱點(diǎn)數(shù)據(jù)。
提供 API 支持,允許變更已實(shí)現(xiàn)的其他策略。 - 分層管理模塊:
主要功能是掃描已標(biāo)記分層標(biāo)簽的目錄,結(jié)合訪問(wèn)監(jiān)視器提供的熱點(diǎn)數(shù)據(jù)信息。
對(duì)這些目錄處理,創(chuàng)建數(shù)據(jù)轉(zhuǎn)換任務(wù),并提交到任務(wù)管理模塊。 - 任務(wù)管理模塊:
京東在元數(shù)據(jù)節(jié)點(diǎn)內(nèi)部實(shí)現(xiàn)了一個(gè)分布式調(diào)度平臺(tái),包含多種功能,如數(shù)據(jù)節(jié)點(diǎn)變更、數(shù)據(jù)類型轉(zhuǎn)換和數(shù)據(jù)生命周期管理等。
該模塊復(fù)用社區(qū)原有的任務(wù)下發(fā)機(jī)制,例如在數(shù)據(jù)節(jié)點(diǎn)(DN)心跳時(shí),從元數(shù)據(jù)節(jié)點(diǎn)獲取數(shù)據(jù)塊刪除、復(fù)制或恢復(fù)任務(wù)。
模塊擴(kuò)展了任務(wù)類型,具體任務(wù)的處理則在存儲(chǔ)節(jié)點(diǎn)上實(shí)現(xiàn)。
通過(guò)這些模塊的協(xié)同工作,京東的分層存儲(chǔ)方案有效提高了核心鏈路的整體性能。數(shù)據(jù)訪問(wèn)監(jiān)視器的策略改進(jìn),使得高頻訪問(wèn)數(shù)據(jù)得到加速,提升了 L0 和 L1 任務(wù)的時(shí)效性,整體性能提高了 10%。同時(shí),分層存儲(chǔ)方案也降低了平均存儲(chǔ)成本,通過(guò)高密存儲(chǔ)和 EC(糾刪碼)轉(zhuǎn)換,提升了 EC 數(shù)據(jù)的覆蓋率,達(dá)到 30%,并且使得冷數(shù)據(jù)存儲(chǔ)成本降低了90%。
京東的分層存儲(chǔ)方案不僅提升了數(shù)據(jù)處理的效率和速度,也顯著降低了存儲(chǔ)資源的成本,實(shí)現(xiàn)了存儲(chǔ)系統(tǒng)性能與成本的雙重優(yōu)化。
3. 實(shí)踐結(jié)合
京東結(jié)合跨域存儲(chǔ)和分層存儲(chǔ)實(shí)現(xiàn)了兩個(gè)具體的應(yīng)用場(chǎng)景,分別是跨域生命周期管理和數(shù)據(jù)調(diào)度功能。
(1)跨域生命周期管理
- 社區(qū)版本中的跨地方存儲(chǔ)可能會(huì)造成數(shù)據(jù)的過(guò)度冗余,提高存儲(chǔ)成本。京東的跨域存儲(chǔ)方案也面臨類似問(wèn)題,但冗余度有所降低。
- 某些數(shù)據(jù)在平臺(tái)上寫入后很久不會(huì)被讀取,可以根據(jù)文件創(chuàng)建時(shí)間和跨域標(biāo)簽對(duì)數(shù)據(jù)進(jìn)行流動(dòng)處理。從多機(jī)房數(shù)據(jù)轉(zhuǎn)換為單機(jī)房數(shù)據(jù),并引入分層存儲(chǔ)功能,將單機(jī)房數(shù)據(jù)通過(guò)EC 轉(zhuǎn)換為高密存儲(chǔ),從而將數(shù)據(jù)冗余度降低。這種策略大幅度降低了數(shù)據(jù)的冗余度,并將數(shù)據(jù)從性能較好的機(jī)器轉(zhuǎn)移到了適合冷存儲(chǔ)的機(jī)器上。
(2)數(shù)據(jù)調(diào)度功能
- 可以理解為反生命周期過(guò)程,即通過(guò)訪問(wèn)監(jiān)視器統(tǒng)計(jì)結(jié)果進(jìn)行數(shù)據(jù)反向加熱。數(shù)據(jù)加熱后,結(jié)合跨域標(biāo)簽進(jìn)行多機(jī)房分布,提升數(shù)據(jù)讀取效率。
- 任務(wù)漂移的支持。根據(jù)計(jì)算資源的動(dòng)態(tài)分配,將任務(wù)分配到資源較多的集群執(zhí)行,優(yōu)化線上任務(wù)的時(shí)效性。多機(jī)房之間的計(jì)算資源可能在不同時(shí)間段不一樣,任務(wù)漂移功能能夠智能地分配任務(wù),確保數(shù)據(jù)就近處理,進(jìn)一步提升任務(wù)處理的效率。
這兩個(gè)場(chǎng)景展示了京東如何通過(guò)智能化的存儲(chǔ)和數(shù)據(jù)管理策略,實(shí)現(xiàn)了存儲(chǔ)成本的優(yōu)化和數(shù)據(jù)處理性能的提升??缬蛏芷诠芾硗ㄟ^(guò)動(dòng)態(tài)調(diào)整數(shù)據(jù)存儲(chǔ)位置和方式,大幅度降低了存儲(chǔ)成本;而數(shù)據(jù)調(diào)度功能則確保了數(shù)據(jù)和計(jì)算資源的有效配合,提高了任務(wù)執(zhí)行的時(shí)效性和效率。這些創(chuàng)新的存儲(chǔ)管理方法對(duì)于大規(guī)模分布式存儲(chǔ)系統(tǒng)來(lái)說(shuō)至關(guān)重要,幫助我們實(shí)現(xiàn)了資源的最優(yōu)化利用。