盤古 阿里雲飛天分布式儲存系統設計深度解析

2021-07-24 18:43:50 字數 3061 閱讀 5638

上圖列舉了目前主流的雲計算廠商,我們發現乙個很有趣的事情:所有雲計算廠商都是「富二代」,它們的分布式儲存技術全部採用自研技術,而沒有用大家耳熟能詳的開源分布式系統。

第一代飛天人的夢想是在大量廉價的pc伺服器上,對外提供各種計算和儲存服務。具體到以下幾個元件:夸父,主要負責網路;女媧,主要負責協同;伏羲,主要負責排程;盤古,主要負責儲存;神農,主要負責監控。

單機的硬體或者系統總是不完美的,總是會小概率的出錯,但是它又需要具有大規模下水平擴充套件的能力,因為它要管理大量的機器。這兩個層面放在一起意味著出錯是常態。

從上圖可以看到,作為統一儲存,要支援虛擬機器中的塊儲存,物件儲存,**儲存,檔案儲存,離線大資料處理,大資料分析等諸多業務,其面臨的挑戰是很大的,甚至有些挑戰是自相矛盾的。

分為三個部分:client,master,chunkserver。需要發起一次寫入的時候,client向master建立乙個檔案,並且開啟這個檔案,此時master會選好三個副本的位置反饋給client。client根據三個副本的位置找到chunkserver,把資料寫進去。也就是說,client做整體的控制,master提供源資料的儲存,chunkserver提供資料的儲存。系統中的單點是非常脆弱的,如何保證其高可用?盤古的第一步是加入乙個paxos,也就是說用很多臺master組成乙個group來實現高可用。即使用很多臺伺服器來實現高可用,最終對外服務的只能是一台伺服器,當記憶體資料足夠多的時候,就需要水平擴充套件。mounttable可以把目錄樹劃分成volume,通過不同的volume就可以實現master的水平擴充套件。

盤古三副本強一致,三副本位於不同的故障域,故障時自動資料複製。如上圖所示,乙個資料中心有3份資料存放在4個rack中,如果rack-1突然斷電或者網路有問題。此時,比如菱形的資料原來在rack-3、rack-4上,當rack-1的菱形資料丟失時,盤古會通過高效的演算法從rack-3上覆制乙份出來放入rack-2,保證了資料的安全可靠。

盤古主要做了兩件事:端到端的資料校驗,靜默錯誤檢查。在小概率下,記憶體儲存的資料是可能發生變化的,磁碟上儲存的資料也會發生變化。每段資料後面都有crc,這樣,一旦寫入磁碟,資料和crc是能夠匹配上的,後台週期性掃瞄,發現資料和crc不匹配時就判定這段資料發生了位反轉,那麼用其他好的副本將其覆蓋。

盤古進行了合理成本的優化。比如,線下執行的單集群有上萬台,數百pb的資料。單組master也進行了優化,讀能達到15w qps,寫能達到5w qps。單資料節點進行了軟體棧極限優化,使得軟體的消耗非常低,並且分層儲存。最後,為了實現低成本,使用了普通pc伺服器、erasure code。

運維是非常重要的,盤古實現了熱公升級應用無感知,運維操作根據配置自動化執行,不需要人工干預,通過環境標準化及時糾正,通過問題診斷自我解決問題。結構如上圖所示,有乙個集中管理的配置管理庫,盤古管控中心會把配置管理庫推送到盤古的各個元件,自動執行配置變更,發現配置不對時能夠實現自動對齊,執行環境標準化檢查對於大規模的分布式系統是非常重要的。

分布式系統的核心是面向容錯的設計:

以上的設計大大減小了運維的壓力。

master需要解決的主要是三類問題:大容量、高效、穩定。大容量是指:federation水平擴充套件,記憶體緊緻排列單組支援8億檔案,讀寫ops 100k/s。高效意味著最優的演算法,硬體錯誤觸發快速複製保證資料安全,資料流量動態規劃實現最大吞吐,安全域動態調整保證資料高可用。穩定即paxos資料一致、防止單點,多角度監控自動觸發切換,多使用者隔離防打死。由於盤古是多租戶的系統,比如一萬台的集群上面會跑著各種各樣的應用,其相互之間是不知道的,但是它們在共用乙個master機器。如果乙個使用者大量訪問master,這時整個集群都不能提供對外服務,怎麼杜絕這種情況?盤古做了多重隔離解決了上述問題。

chunkserver面臨的問題是:快閃儲存器的**高,iops高;機械硬碟**低,iops低;只寫入記憶體的方案掉電會丟失資料。如果整個集群都掉電,那麼記憶體中還沒寫入資料就會丟掉,如果三份備份資料都丟掉,這對雲計算是不能接受的事情。怎麼結合快閃儲存器、機械式硬碟以最低的成本解決上述問題?有些解決方案使用ups,但是ups也存在不可靠問題,資料仍然會丟失。所以,最終的解決方案是使用少量的快取搭配大量的機械硬碟,資料前台先寫入快取,後台將其轉儲到機械式硬碟。

client

面臨很多問題,很多現在的程式語言中,協程是非常普及的事情。傳統的多執行緒程式設計中,多核系統上線程較多時,切換代價非常高,高效能的程式無法容忍這一點。有些解決方案是非同步的程式設計,這樣就使用少數的執行緒、不切線程。怎麼樣既有同步程式設計的便利,又有非同步程式設計的效能?協程就是解決方案,很多現在的程式語言本身已經提供了協程,但是c++沒有提供協程,所以盤古自己通過實現協程獲得了高效能。client面臨的問題是:有些使用者需要極致的效能,有些使用者需要程式設計的簡便,已有的海量程式要無縫支援。解決上述問題的方案是使用執行緒同步原語同時支援協程和非協程使用者。在協程中是不切線程的,所以意味著所有的task都在乙個執行緒中執行,如果任何乙個task有阻塞操作,都會導致整個執行緒吞吐率的降低。

伏羲 阿里雲分布式排程系統

今天,大資料已經從概念發展到在很多行業落地生根。廣泛用在電商 金融 企業等行業,幫助行業分析資料 挖掘資料的價值。即使在傳統的醫療 安全 交通等領域也越來越多的應用大資料的技術。資料 價值二者之間的聯絡是計算,計算是大資料中最核心的部分。大資料計算就是將原來一台臺的伺服器通過網路連線起來成為乙個整體...

python分布式儲存系統 分布式系統

danger 什麼是分布式系統 分布式系統是由一組通過網路進行通訊 為了完成共同的任務而協調工作的計算機節點組成的系統。分布式系統的出現是為了用廉價的 普通的機器完成單個計算機無法完成的計算 儲存任務。其目的是利用更多的機器,處理更多的資料。首先需要明確的是,只有當單個節點的處理能力無法滿足日益增長...

JEESZ分布式架構整合阿里雲OSS儲存

1.服務介面定義 檔案上傳 1 頭像 2 顯示 3 個人封面 4 基礎 param request param response param uid 使用者id param files 上傳的檔案物件 上傳檔案新名字 string newname string.valueof new date ge...