分布式存储(姚文辉)
1.大數(shù)據(jù)對分布式存儲(chǔ)的需求
- 存儲(chǔ)容量(>100PB)
- 高吞吐量(1PB sort < 2小時(shí) 350GB/每秒的吞吐量)
- 高可靠性(8個(gè)9)
- 服務(wù)高可靠性(99.95%時(shí)間可用)
- 運(yùn)維簡單
- 成本低,廉價(jià)pc服務(wù)器,數(shù)據(jù)壓縮,混合存儲(chǔ)。
2.大規(guī)模分布式存儲(chǔ)系統(tǒng)的挑戰(zhàn)
大規(guī)模分布式存儲(chǔ)中小概率事件變?yōu)槌B(tài),如何高效的處理這些小概率事件是分布式系統(tǒng)工程中的巨大挑戰(zhàn)。
- 磁盤機(jī)器損壞:磁盤損壞率大概為4%,機(jī)器宕機(jī)率為1%%,5000臺(tái)機(jī)器的集群,磁盤機(jī)器損壞就會(huì)很常見。一旦出現(xiàn)宕機(jī),IO流量需要自動(dòng)導(dǎo)向到其他機(jī)器上的存儲(chǔ)節(jié)點(diǎn)上。
- 網(wǎng)絡(luò)故障:連接meta管理節(jié)點(diǎn)的網(wǎng)絡(luò)發(fā)生異常,會(huì)導(dǎo)致“腦裂”現(xiàn)象,由于腦裂導(dǎo)致導(dǎo)致心跳異常,Meta服務(wù)自動(dòng)切換的另外的機(jī)器,切換期間多個(gè)節(jié)點(diǎn)并行對外提供meta服務(wù),會(huì)導(dǎo)致新寫入的數(shù)據(jù)在老的meta管理節(jié)點(diǎn)不可見而作為垃圾數(shù)據(jù)刪除,這種異常需要利用完善可靠的分布式協(xié)議來避免。
- 電源故障:數(shù)據(jù)副本跨機(jī)架,在架構(gòu)設(shè)計(jì)上和物理部署上要求分布式存儲(chǔ)系統(tǒng)需要有跨數(shù)據(jù)中心和地域的能力。
- 系統(tǒng)異常:時(shí)鐘不一致等,NTP漂移等情況要求系統(tǒng)邏輯不能強(qiáng)依賴于時(shí)間精度和時(shí)鐘同步,需要重新設(shè)置虛擬時(shí)鐘來保證時(shí)序,達(dá)到數(shù)據(jù)一致性。
- 熱點(diǎn):通常會(huì)采用資源隔離和限制的方法來避免一個(gè)業(yè)務(wù)的計(jì)算過度消耗資源,同時(shí)分布式系統(tǒng)的客戶端需要有主動(dòng)繞過熱點(diǎn)機(jī)器的功能來避免熱點(diǎn)給整個(gè)系統(tǒng)帶來的影響。
3.典型的分布式存儲(chǔ)系統(tǒng)
HDFS:http://www.cnblogs.com/wxquare/p/4846438.html
? ? ? ? ceph:http://docs.ceph.com/docs/v0.80.5/
4.分布式系統(tǒng)重要功能設(shè)計(jì)要點(diǎn)剖析
?第一步client進(jìn)程在Master上打開文件寫,在請求中傳輸文件名作為參數(shù),在返回結(jié)果中會(huì)包含數(shù)據(jù)寫入位置信息;第?步,client端以鏈?zhǔn)絺鬏數(shù)姆绞綄?shù)據(jù)寫入到多個(gè)CS中,顧名思義,數(shù)據(jù)會(huì)在一個(gè)傳輸鏈條上被傳遞。首先client將數(shù)據(jù)傳輸給CS1,CS1將數(shù)據(jù)傳輸給CS2,以此類推,直到最后一個(gè)CS收到數(shù)據(jù),并返回給前一個(gè)鏈條節(jié)點(diǎn)CS,最終數(shù)據(jù)寫入成功的返回傳遞給client端,表明數(shù)據(jù)已經(jīng)寫入成功,這樣就完成了一次數(shù)據(jù)寫入操作。從寫入流程上來看,這寫入過程中,每個(gè)數(shù)據(jù)經(jīng)過的結(jié)點(diǎn)都只消耗了一份網(wǎng)絡(luò)帶寬,可以充分利用網(wǎng)絡(luò)資源;對于有大量數(shù)據(jù)寫入的應(yīng)用,例如數(shù)據(jù)導(dǎo)入作業(yè)可以達(dá)到更高的流量。但從數(shù)據(jù)寫入的返回消息上來看,返回鏈路相對較長,會(huì)給數(shù)據(jù)寫入的latency有較大影響。
? ? ? ? ?
?
鏈?zhǔn)綄懭肽J奖容^適合于數(shù)據(jù)流量大,但是不注重latency的業(yè)務(wù);上圖所示的主從模式,比較適合于數(shù)據(jù)寫入頻繁要求低延遲的業(yè)務(wù)。 在此圖中省略了文件打開流程的描述,并且數(shù)據(jù)接收的對應(yīng)的CS會(huì)分成兩種,一種為Primary,作為寫操作的協(xié)調(diào)者和接收者,另一種Replica只作為數(shù)據(jù)的接收者。client數(shù)據(jù)會(huì)首先發(fā)送給Primary,Primary將數(shù)據(jù)接收并轉(zhuǎn)發(fā)給另外兩臺(tái)Replica,并等待所有的拷貝都已經(jīng)合并入內(nèi)存cache后,由Primary 返回client一個(gè)確認(rèn)消息,此時(shí)數(shù)據(jù)并沒有確認(rèn)寫入成功;等所有數(shù)據(jù)從內(nèi)存中刷入到物理磁盤后,Replica將刷入磁盤成功的消息發(fā)送給Primary,并且Primary也寫入成功后將最終數(shù)據(jù)寫入成功的確認(rèn)消息返回給client。 從上面的寫入過程分析,Primary的網(wǎng)絡(luò)流量是兩份數(shù)據(jù)流量,在極限情況下也只能利用網(wǎng)絡(luò)流量的一半,所以若果是數(shù)據(jù)導(dǎo)入的大流量業(yè)務(wù)不適合。單從數(shù)據(jù)寫入成功的確認(rèn)過程來看,寫入3個(gè)副本的情況下只需要兩跳即可到達(dá)Client,這樣網(wǎng)絡(luò)延遲相對減小,對應(yīng)寫入的latency降低。
?
? ? ?2. IO QOS (服務(wù)質(zhì)量)
?問題:當(dāng)多個(gè)用戶訪問存儲(chǔ)系統(tǒng)時(shí)如何保證優(yōu)先級(jí)和公平性
? ? ? ? ? 阿里盤古文件系統(tǒng)中采用的方案:
- 將IO請求按優(yōu)先級(jí)分成多個(gè)類別,每個(gè)類有相應(yīng)的權(quán)重表示該類請求占用IO帶寬的比例
- IO請求根據(jù)分類放入相應(yīng)的隊(duì)列,隊(duì)列內(nèi)根據(jù)隊(duì)列限制和任務(wù)做調(diào)度和丟棄
- 調(diào)度器根據(jù)相應(yīng)權(quán)重從隊(duì)列取出請求進(jìn)行調(diào)度
? ? ? ?3.數(shù)據(jù)正確性:checkSum
? ? ? ?在集群中網(wǎng)絡(luò)、內(nèi)存、磁盤和軟件都有可能導(dǎo)致數(shù)據(jù)錯(cuò)誤,那么在分布式存儲(chǔ)系統(tǒng)中如何保證海量數(shù)據(jù)中沒有任何數(shù)據(jù)錯(cuò)誤呢? 數(shù)據(jù)應(yīng)該給全程保護(hù),否則任何一個(gè)環(huán)節(jié)出現(xiàn)問題導(dǎo)致數(shù)據(jù)錯(cuò)誤未被檢查到,都可能會(huì)導(dǎo)致數(shù)據(jù)出錯(cuò)。被保護(hù)的數(shù)據(jù)至少應(yīng)該具有數(shù)據(jù)、數(shù)據(jù)長度和CRC校驗(yàn)值這樣的三元組,而且在任何后續(xù)的處理中,都應(yīng)該先對數(shù)據(jù)進(jìn)行處理后,再校驗(yàn)這個(gè)3元組的一致性,來保證剛被處理過的數(shù)據(jù)是正確的。
4.數(shù)據(jù)可靠性(Replication)
當(dāng)機(jī)器/磁盤出現(xiàn)異常,應(yīng)通過其它副本快速恢復(fù),充分利用多臺(tái)機(jī)器的復(fù)制帶寬,但是實(shí)際中,應(yīng)考慮復(fù)制的優(yōu)先級(jí)以及復(fù)制的流量控制。
5.節(jié)點(diǎn)的負(fù)載均衡(Rebalance)
當(dāng)有新的機(jī)器/磁盤上線時(shí),遷移數(shù)據(jù)保證負(fù)載均衡。充分利用多臺(tái)機(jī)器的復(fù)制帶寬,同上,實(shí)際中,也需要考慮控制因?yàn)樨?fù)載均衡而導(dǎo)致復(fù)制優(yōu)先級(jí)和流量控制。
? ? ? ? 6.垃圾回收(Garbage collection)
垃圾回收在分布式系統(tǒng)中就好像我們平時(shí)對屋子的整理過程,將無用的扔掉給有用物品留下足夠的空間.
? ? ? ??7.糾刪碼 (Erasure coding)
?糾刪碼能降低系統(tǒng)的存儲(chǔ)代價(jià),但是增加了計(jì)算和恢復(fù)的代價(jià)。
8.元數(shù)據(jù)的高可用性和可擴(kuò)展性
?通常分布式存儲(chǔ)中meta管理節(jié)點(diǎn)不多,但是數(shù)據(jù)讀取過程都依賴meta節(jié)點(diǎn),因此元數(shù)據(jù)管理需要做到高可用性非常重要。
?通常的做法是可以將這些節(jié)點(diǎn)做成多個(gè)備份,保證在一個(gè)備份出現(xiàn)問題的時(shí)候,仍然可以提供服務(wù)。但是多個(gè)備份間需要維護(hù)數(shù)據(jù)一致性,防止服務(wù)切換造成的數(shù)據(jù)不一致或者丟失。
?高可用性方案:
- ?方案一:HDFS中元數(shù)據(jù)的高可用性方案是引入了分布式鎖服務(wù)ZooKeeper,每個(gè)NameNode的FailoverController來維護(hù)分布式鎖狀態(tài),在出現(xiàn)鎖丟失的情況下,觸發(fā)主備切換。主NameNode將操作日志寫入到共享數(shù)據(jù)存儲(chǔ)的設(shè)備上,這樣的設(shè)備可以是有DRBD功能的磁盤或者NFS系統(tǒng)。 這個(gè)實(shí)現(xiàn)方案相對簡單,因?yàn)榻粡?fù)雜的功能都放到了鎖服務(wù)和共享存儲(chǔ)系統(tǒng)中。這樣的做法也是非常經(jīng)濟(jì)實(shí)惠的,復(fù)雜性均由分布式系統(tǒng)的單個(gè)模塊來維護(hù),其他服務(wù)進(jìn)行依賴的做法降低了軟件的實(shí)現(xiàn)難度和維護(hù)工作量。
- 方案二:阿里的盤古分布式文件系統(tǒng)Meta server之間采用了Paxos的特化Raft實(shí)現(xiàn)數(shù)據(jù)選舉和同步,可以在任意多個(gè)master的備份。
- 方案三:在Ceph系統(tǒng)的元數(shù)據(jù)管理模塊MDS從原理上來說使用了共享存儲(chǔ),每個(gè)MDS有一個(gè)Standby進(jìn)程作為熱備。但是其獨(dú)特之處在于是利用了OSD同Ceph monitor組成的RADOS最為共享存儲(chǔ),這樣的實(shí)現(xiàn)方法即保證了元數(shù)據(jù)管理的高可用,又提供了無限可擴(kuò)展的能力,同時(shí)可以不依賴于其他系統(tǒng)做到了獨(dú)立自包含。
? ? ?? 可擴(kuò)展性方案:
- ?方案一:HDFS的可擴(kuò)展性,Namespace切分的Fedeation。在HDFS Federation中NameNode的擴(kuò)展性依賴于目錄樹的靜態(tài)切分,每個(gè)目錄子樹被稱為一個(gè)Volume,并將切分后的Volume分配到不同的NameNode上。DataNode則作為數(shù)據(jù)存儲(chǔ)池,被所有的NameNode共享使用。為了讓客戶端可以找到某棵樹中的節(jié)點(diǎn),在client端需要加載ClientSideMountTable,這里記錄了目錄樹同NameNode的對應(yīng)關(guān)系,用戶使用文件名訪問元數(shù)據(jù)時(shí),客戶端首先用文件名從MountTable中獲取NameNode的服務(wù)端口后,再發(fā)送元數(shù)據(jù)請求。 Federation的這種做法簡單高效,靜態(tài)劃分的方法需要提前對各個(gè)NameNode未來元數(shù)據(jù)量有比較準(zhǔn)確的估計(jì),否則很容易造成各個(gè)NameNode間元數(shù)據(jù)的不平衡,給整個(gè)存儲(chǔ)系統(tǒng)帶來瓶頸。 盤古系統(tǒng)采用了同HDFS一樣的解決方案,在實(shí)現(xiàn)過程中對應(yīng)每個(gè)HDFS中的NameNode會(huì)部署一組盤古多master。盤古Federation除了用MountTable讓用戶透明訪問系統(tǒng)外,還提供了新的訪問方式。用戶可以在文件名前指定Volume名稱,這樣可以繞過mount table的訪問直接請求到某組盤古master上,這個(gè)功能可以有效防止集群中大量進(jìn)程短時(shí)間啟動(dòng)時(shí)集中獲取mount table帶來的流量沖擊。為了應(yīng)對元數(shù)據(jù)不均衡的問題,盤古提供了在兩個(gè)Volume間的元數(shù)據(jù)遷移工具。
- 方案二:Ceph系統(tǒng)的MDS的擴(kuò)展性用動(dòng)態(tài)分裂功能實(shí)現(xiàn),分裂依據(jù)是目錄或者文件的請求頻率。當(dāng)用戶請求某個(gè)路徑的時(shí)候,將路徑中的每個(gè)目錄以及最終末端的節(jié)點(diǎn)或者目錄上的請求統(tǒng)計(jì)值增加,然后通過定期來計(jì)算每個(gè)MDS中目錄的請求頻率來決定是否已經(jīng)超過了MDS的負(fù)載而需要?jiǎng)討B(tài)分裂。分裂過程中源MDS會(huì)元信息發(fā)送給目標(biāo)MDS,并分別記錄遷移日志。這種動(dòng)態(tài)分裂的方式可以有效解決局部訪問熱點(diǎn)帶來的性能瓶頸,在元數(shù)據(jù)規(guī)模和處理能力方面都做了擴(kuò)展,是比靜態(tài)劃分方法更好的設(shè)計(jì)和實(shí)現(xiàn)方式。
9.混合存儲(chǔ)
?混合存儲(chǔ)原因是要根據(jù)不同存儲(chǔ)介質(zhì)合理使用,提高存儲(chǔ)系統(tǒng)性能的同時(shí)又不會(huì)太大的增大成本。例如HDFS中可以將一個(gè)副本放在SSD中,其他副本放在此盤上,Heterogeneous Storages in HDFS,http://hortonworks.com/blog/heterogeneous-storages-hdfs/;阿里的盤古文件系統(tǒng)中,后臺(tái)程序定期將SSD上記錄的多次隨機(jī)寫合并成一次批量寫,將數(shù)據(jù)寫入到HDD的chunk replica文件中,這樣能在一定程度上降低寫的延遲;
RAMCloud內(nèi)存存RAMCloud,https://ramcloud.atlassian.net/wiki/display/RAM/RAMCloud
RAMCloud內(nèi)存存儲(chǔ)方案同盤古的混合存儲(chǔ)方案比較接近,最明顯的不同點(diǎn)是將SSD換成了內(nèi)存存儲(chǔ)。 當(dāng)數(shù)據(jù)寫入是,所以數(shù)據(jù)均寫入到內(nèi)存,為了高效利用內(nèi)存,采用了連續(xù)記錄日志的方式將數(shù)據(jù)存放在內(nèi)存中。同時(shí)將數(shù)據(jù)按照數(shù)據(jù)所屬應(yīng)用進(jìn)行劃分,分別建立索引,方便對數(shù)據(jù)進(jìn)行隨機(jī)訪問。由于內(nèi)存存儲(chǔ)的易失性,所以需要將內(nèi)存中的數(shù)據(jù)以異步方式保存到磁盤中。 這種實(shí)現(xiàn)策略非常適用于分布式的cache服務(wù),可以充分利用內(nèi)存的高帶寬和低延遲,但是在分布式環(huán)境中需要同時(shí)配備高速網(wǎng)絡(luò),否則其威力得不到發(fā)揮。
從上面的例子可以看到,混合存儲(chǔ)技術(shù)基本是利用高性能小容量高成本的介質(zhì)來作為低性能大容量低成本的cache來滿足業(yè)務(wù)需求。
| ? | 磁盤 | SSD | 內(nèi)存 |
| 容量 | 1–4?TB | 400–800?GB | 24–128?GB |
| 延時(shí) | ?10?ms | 50–75?us | 100?ns |
| 吞吐 | 100–200?MB/s | 400?MB/s | 20?GB/s |
| 成本 | 0.06?$/GB | 1?$/GB | 10?$/GB |
? ? ? ? 老師上課的課件:http://www.xuetangx.com/c4x/TsinghuaX/60240202X/asset/%E7%AC%AC%E4%BA%8C%E8%AE%B2_%E5%88%86%E5%B8%83%E5%BC%8F%E5%AD%98%E5%82%A8_%E5%A7%9A%E6%96%87%E8%BE%89_.pptx
?
轉(zhuǎn)載于:https://www.cnblogs.com/wxquare/p/4850167.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的分布式存储(姚文辉)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML 各种鼠标手势
- 下一篇: 电动车什么发票有用?