一個(gè)大系統(tǒng)一般都有超過(guò) 30 個(gè)環(huán)節(jié)(串行):如果每個(gè)環(huán)節(jié)都做到 99% 的準(zhǔn)確率,最終系統(tǒng)的準(zhǔn)確率是 74%;如果每個(gè)環(huán)節(jié)都做到98%的準(zhǔn)確率,最終系統(tǒng)的準(zhǔn)確率 54%。一個(gè) 74% 的系統(tǒng)是可用的(有商業(yè)價(jià)值的),一個(gè) 54%的系統(tǒng)僅比隨機(jī)稍好一點(diǎn),不可用。這就是做大系統(tǒng)的魅力和挑戰(zhàn)!
而對(duì)系統(tǒng)單一模塊優(yōu)化,準(zhǔn)確性和可用性提升一個(gè)百分點(diǎn),越接近100%,難度越大,投入成本越不可控(系統(tǒng)熵永不為零)
分布式系統(tǒng)架構(gòu)的實(shí)踐
1.分布式存儲(chǔ)架構(gòu)
分布式存儲(chǔ)架構(gòu)現(xiàn)階段有3種模式
1.1一種是物理存儲(chǔ)采用集中式,存儲(chǔ)節(jié)點(diǎn)采用多實(shí)例的方式,如NFS掛載SAN、NAS等等
1.2第二種是帶有中央控制器的分布式存儲(chǔ),如luster、moosefs、googlefs等等,一般特征是具備2個(gè)角色metadataserver和storage node,將文件的元數(shù)據(jù)(描述數(shù)據(jù)的數(shù)據(jù),如文件位置、大小等等)和數(shù)據(jù)塊文件分開(kāi)存儲(chǔ)
其中metadataserver除保存文件的元數(shù)據(jù)外,還維護(hù)存儲(chǔ)節(jié)點(diǎn)的ip、狀態(tài)等信息
luster的典型架構(gòu)
MDS--meatadata server
MDT--metadata target
OSS--objstorage server
OST--objstarage target
其中MDT和OST是可以掛在NAS等中央存儲(chǔ)上的;可見(jiàn),luster借鑒了上面中央存儲(chǔ)的模式,無(wú)論元數(shù)據(jù)服務(wù)還是節(jié)點(diǎn)服務(wù)都將服務(wù)實(shí)例和存儲(chǔ)分離,但進(jìn)化了一步,將元數(shù)據(jù)和數(shù)據(jù)塊分離
luster系統(tǒng)很好解決了數(shù)據(jù)分布式存儲(chǔ),,在超級(jí)計(jì)算領(lǐng)域Lustre應(yīng)用廣泛,如美國(guó)LLNL國(guó)家實(shí)驗(yàn)室計(jì)算機(jī)系統(tǒng)、我國(guó)的天河超級(jí)計(jì)算機(jī)系統(tǒng)均采用Lustre搭建分布式存儲(chǔ)系統(tǒng)。Lustre在全球排名前30個(gè)超級(jí)計(jì)算機(jī)系統(tǒng)中有15個(gè)在使用。
但有一個(gè)問(wèn)題,就是metadata server的SPoF(single point offailure)問(wèn)題,即單點(diǎn)故障;一旦metadataserver掛了,整個(gè)集群也就掛了。實(shí)際應(yīng)用中,是有解決方案的,如dell的官網(wǎng)有個(gè)pdf,就是采用heartbeat和drbd網(wǎng)絡(luò)raid的方式,啟動(dòng)2個(gè)實(shí)例,再如和keepalived一起組成故障轉(zhuǎn)移的方案等等,可以自己試試
再來(lái)看moosefs架構(gòu)
moosefs架構(gòu)和luster很相似,但進(jìn)化了一步,mater(也就是metadataserver)可以有從機(jī)備份了,而且可以多個(gè)
而且服務(wù)實(shí)例和存儲(chǔ)放在一起,沒(méi)有像luster,自此服務(wù)和數(shù)據(jù)不離不棄了;其實(shí)luster也可以簡(jiǎn)化成不離不棄模式,moosefs也可以學(xué)他搞個(gè)后端存儲(chǔ),但隨著云計(jì)算、追求低成本的趨勢(shì),采用SAN這樣存儲(chǔ)設(shè)備就太貴了
1.3第三種分布式存儲(chǔ)是去中心化、全對(duì)稱(chēng)的架構(gòu)(non-center or symmetric)
其設(shè)計(jì)思想是采用一致性哈希consistenthash算法(DHT的一種實(shí)現(xiàn),關(guān)于一致性hash具體參考后面的鏈接)來(lái)定位文件在存儲(chǔ)節(jié)點(diǎn)中的位置,從而取消了metadataserver的角色
整個(gè)系統(tǒng)只有storage node一個(gè)角色,不區(qū)分元數(shù)據(jù)和數(shù)據(jù)塊;
典型系統(tǒng)如sheepdog,但sheepdog是為滿足kvm鏡像和類(lèi)EBS塊存儲(chǔ)而設(shè)計(jì)的,不是常規(guī)的分布式文件系統(tǒng),架構(gòu)如下
為了維護(hù)存儲(chǔ)節(jié)點(diǎn)的信息,一般采用P2P技術(shù)的totem singlering算法(corosync是一種實(shí)現(xiàn))來(lái)維護(hù)和更新node路由信息
對(duì)稱(chēng)架構(gòu)有一個(gè)問(wèn)題,采用totemsingle ring算法的存儲(chǔ)節(jié)點(diǎn)數(shù)量有限,因?yàn)閚ode數(shù)量超過(guò)1000,集群內(nèi)的通信風(fēng)暴就會(huì)產(chǎn)生(此處更正,應(yīng)該是環(huán)太大,令牌傳遞效率下降,不會(huì)產(chǎn)生通信風(fēng)暴),效率下降,sheepdog提出了一個(gè)解決方案,就是在一致性hash環(huán)上做嵌套處理,如圖
1.4半對(duì)稱(chēng)結(jié)構(gòu)
其實(shí)介于1.2metadataserver中央控制和1.3全對(duì)稱(chēng)的架構(gòu)之間還有一種,就是把metadata也做成對(duì)稱(chēng)結(jié)構(gòu),我們可以稱(chēng)半對(duì)稱(chēng)結(jié)構(gòu),典型應(yīng)用如fastdfs,淘寶一大牛fishman寫(xiě)的,主要用作圖片存儲(chǔ),可以實(shí)現(xiàn)排重存儲(chǔ)
看圖,tracker cluster就是metadata server的角色,實(shí)現(xiàn)了對(duì)稱(chēng)架構(gòu)設(shè)計(jì)
國(guó)內(nèi)幾個(gè)大的網(wǎng)站都使用了fastdfs,在實(shí)際使用中,發(fā)現(xiàn)storageserver之間同步數(shù)據(jù)較慢,一直沒(méi)仔細(xì)研究
2.分布式數(shù)據(jù)庫(kù)
分布式數(shù)據(jù)庫(kù)一般都基于分布式文件系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)的分片sharding,每中數(shù)據(jù)庫(kù)都有自己的應(yīng)用特性,就不做介紹,列出幾個(gè)典型的應(yīng)用,供參考
Google的big table,實(shí)現(xiàn)數(shù)據(jù)的追加存儲(chǔ)append,順序?qū)懭肟焖?,不適合隨機(jī)讀的場(chǎng)景
hadoop的HBase
mongodb
hypertable2010年以前,百度在用,今年infoq的中國(guó)qcon,百度的楊棟也講了百度用hypertable的血淚史
3.分布式應(yīng)用架構(gòu)
分布式應(yīng)用架構(gòu)涉及具體應(yīng)用場(chǎng)景,設(shè)計(jì)上除考慮上面的CAP和C10K等等經(jīng)典分布式理論,還應(yīng)根據(jù)業(yè)務(wù)進(jìn)行權(quán)衡。
基本的思路是
3.1在做完需求和模塊設(shè)計(jì)后,要對(duì)各模塊進(jìn)行解藕Decoupling
傳統(tǒng)的企業(yè)應(yīng)用設(shè)計(jì)一般是一條操作從頭跑到尾(串行系統(tǒng)),拿視頻網(wǎng)站的流程距離,傳統(tǒng)應(yīng)用設(shè)計(jì)是先上傳是視頻,然后存儲(chǔ),編碼,最后發(fā)布一條龍
如下圖
3.2在進(jìn)行分布式設(shè)計(jì)時(shí),先將各模塊解藕,通過(guò)異步消息通知的方式將各模塊鏈接,如下圖
3.3最后,要考慮這個(gè)應(yīng)用的壓力承載點(diǎn)在哪,根據(jù)用戶(hù)規(guī)模估算各模塊的并行數(shù)量(如本例中的encode壓力大,就增加encode模塊的并行系統(tǒng)數(shù)量),如下圖
以上是分布式系統(tǒng)構(gòu)建的基本原則和實(shí)踐步驟,在實(shí)際應(yīng)用中,仍有很多細(xì)節(jié)要考慮。但有一點(diǎn)要再?gòu)?qiáng)調(diào),就是要根據(jù)業(yè)務(wù)來(lái)選擇各層、各模塊的技術(shù),做好業(yè)務(wù)適用、成本和難度之間的權(quán)衡。
技術(shù)本無(wú)好壞,在于適當(dāng)?shù)氖褂煤头e累。
參考: