分布式存儲(姚文輝)


1.大數據對分布式存儲的需求

  • 存儲容量(>100PB)
  • 高吞吐量(1PB sort < 2小時 350GB/每秒的吞吐量)
  • 高可靠性(8個9)
  • 服務高可靠性(99.95%時間可用)
  • 運維簡單
  • 成本低,廉價pc服務器,數據壓縮,混合存儲。

2.大規模分布式存儲系統的挑戰

 大規模分布式存儲中小概率事件變為常態,如何高效的處理這些小概率事件是分布式系統工程中的巨大挑戰。

  • 磁盤機器損壞:磁盤損壞率大概為4%,機器宕機率為1%%,5000台機器的集群,磁盤機器損壞就會很常見。一旦出現宕機,IO流量需要自動導向到其他機器上的存儲節點上。
  • 網絡故障:連接meta管理節點的網絡發生異常,會導致“腦裂”現象,由於腦裂導致導致心跳異常,Meta服務自動切換的另外的機器,切換期間多個節點並行對外提供meta服務,會導致新寫入的數據在老的meta管理節點不可見而作為垃圾數據刪除,這種異常需要利用完善可靠的分布式協議來避免。
  • 電源故障:數據副本跨機架,在架構設計上和物理部署上要求分布式存儲系統需要有跨數據中心和地域的能力。
  • 系統異常:時鍾不一致等,NTP漂移等情況要求系統邏輯不能強依賴於時間精度和時鍾同步,需要重新設置虛擬時鍾來保證時序,達到數據一致性。
  • 熱點:通常會采用資源隔離和限制的方法來避免一個業務的計算過度消耗資源,同時分布式系統的客戶端需要有主動繞過熱點機器的功能來避免熱點給整個系統帶來的影響。

3.典型的分布式存儲系統

  HDFS:http://www.cnblogs.com/wxquare/p/4846438.html

        ceph:http://docs.ceph.com/docs/v0.80.5/

4.分布式系統重要功能設計要點剖析

  1. 讀寫流程:鏈式寫和主從寫

   

    第一步client進程在Master上打開文件寫,在請求中傳輸文件名作為參數,在返回結果中會包含數據寫入位置信息;第⼆步,client端以鏈式傳輸的方式將數據寫入到多個CS中,顧名思義,數據會在一個傳輸鏈條上被傳遞。首先client將數據傳輸給CS1,CS1將數據傳輸給CS2,以此類推,直到最后一個CS收到數據,並返回給前一個鏈條節點CS,最終數據寫入成功的返回傳遞給client端,表明數據已經寫入成功,這樣就完成了一次數據寫入操作。從寫入流程上來看,這寫入過程中,每個數據經過的結點都只消耗了一份網絡帶寬,可以充分利用網絡資源;對於有大量數據寫入的應用,例如數據導入作業可以達到更高的流量。但從數據寫入的返回消息上來看,返回鏈路相對較長,會給數據寫入的latency有較大影響。

         

 

  鏈式寫入模式比較適合於數據流量大,但是不注重latency的業務;上圖所示的主從模式,比較適合於數據寫入頻繁要求低延遲的業務。 在此圖中省略了文件打開流程的描述,並且數據接收的對應的CS會分成兩種,一種為Primary,作為寫操作的協調者和接收者,另一種Replica只作為數據的接收者。client數據會首先發送給Primary,Primary將數據接收並轉發給另外兩台Replica,並等待所有的拷貝都已經合並入內存cache后,由Primary 返回client一個確認消息,此時數據並沒有確認寫入成功;等所有數據從內存中刷入到物理磁盤后,Replica將刷入磁盤成功的消息發送給Primary,並且Primary也寫入成功后將最終數據寫入成功的確認消息返回給client。 從上面的寫入過程分析,Primary的網絡流量是兩份數據流量,在極限情況下也只能利用網絡流量的一半,所以若果是數據導入的大流量業務不適合。單從數據寫入成功的確認過程來看,寫入3個副本的情況下只需要兩跳即可到達Client,這樣網絡延遲相對減小,對應寫入的latency降低。

 

     2. IO QOS (服務質量)

    問題:當多個用戶訪問存儲系統時如何保證優先級和公平性

          阿里盤古文件系統中采用的方案:

  • 將IO請求按優先級分成多個類別,每個類有相應的權重表示該類請求占用IO帶寬的比例
  • IO請求根據分類放入相應的隊列,隊列內根據隊列限制和任務做調度和丟棄
  • 調度器根據相應權重從隊列取出請求進行調度

       3.數據正確性:checkSum

       在集群中網絡、內存、磁盤和軟件都有可能導致數據錯誤,那么在分布式存儲系統中如何保證海量數據中沒有任何數據錯誤呢? 數據應該給全程保護,否則任何一個環節出現問題導致數據錯誤未被檢查到,都可能會導致數據出錯。被保護的數據至少應該具有數據、數據長度和CRC校驗值這樣的三元組,而且在任何后續的處理中,都應該先對數據進行處理后,再校驗這個3元組的一致性,來保證剛被處理過的數據是正確的。

  4.數據可靠性(Replication)

  當機器/磁盤出現異常,應通過其它副本快速恢復,充分利用多台機器的復制帶寬,但是實際中,應考慮復制的優先級以及復制的流量控制。

  5.節點的負載均衡(Rebalance)

  當有新的機器/磁盤上線時,遷移數據保證負載均衡。充分利用多台機器的復制帶寬,同上,實際中,也需要考慮控制因為負載均衡而導致復制優先級和流量控制。

        6.垃圾回收(Garbage collection)

  垃圾回收在分布式系統中就好像我們平時對屋子的整理過程,將無用的扔掉給有用物品留下足夠的空間.

        7.糾刪碼 (Erasure coding)

    糾刪碼能降低系統的存儲代價,但是增加了計算和恢復的代價。

  8.元數據的高可用性和可擴展性

    通常分布式存儲中meta管理節點不多,但是數據讀取過程都依賴meta節點,因此元數據管理需要做到高可用性非常重要。

    通常的做法是可以將這些節點做成多個備份,保證在一個備份出現問題的時候,仍然可以提供服務。但是多個備份間需要維護數據一致性,防止服務切換造成的數據不一致或者丟失。

    高可用性方案:

  •  方案一:HDFS中元數據的高可用性方案是引入了分布式鎖服務ZooKeeper,每個NameNode的FailoverController來維護分布式鎖狀態,在出現鎖丟失的情況下,觸發主備切換。主NameNode將操作日志寫入到共享數據存儲的設備上,這樣的設備可以是有DRBD功能的磁盤或者NFS系統。 這個實現方案相對簡單,因為交復雜的功能都放到了鎖服務和共享存儲系統中。這樣的做法也是非常經濟實惠的,復雜性均由分布式系統的單個模塊來維護,其他服務進行依賴的做法降低了軟件的實現難度和維護工作量。
  • 方案二:阿里的盤古分布式文件系統Meta server之間采用了Paxos的特化Raft實現數據選舉和同步,可以在任意多個master的備份。
  • 方案三:在Ceph系統的元數據管理模塊MDS從原理上來說使用了共享存儲,每個MDS有一個Standby進程作為熱備。但是其獨特之處在於是利用了OSD同Ceph monitor組成的RADOS最為共享存儲,這樣的實現方法即保證了元數據管理的高可用,又提供了無限可擴展的能力,同時可以不依賴於其他系統做到了獨立自包含。

       可擴展性方案:

  •  方案一:HDFS的可擴展性,Namespace切分的Fedeation。在HDFS Federation中NameNode的擴展性依賴於目錄樹的靜態切分,每個目錄子樹被稱為一個Volume,並將切分后的Volume分配到不同的NameNode上。DataNode則作為數據存儲池,被所有的NameNode共享使用。為了讓客戶端可以找到某棵樹中的節點,在client端需要加載ClientSideMountTable,這里記錄了目錄樹同NameNode的對應關系,用戶使用文件名訪問元數據時,客戶端首先用文件名從MountTable中獲取NameNode的服務端口后,再發送元數據請求。 Federation的這種做法簡單高效,靜態划分的方法需要提前對各個NameNode未來元數據量有比較准確的估計,否則很容易造成各個NameNode間元數據的不平衡,給整個存儲系統帶來瓶頸。 盤古系統采用了同HDFS一樣的解決方案,在實現過程中對應每個HDFS中的NameNode會部署一組盤古多master。盤古Federation除了用MountTable讓用戶透明訪問系統外,還提供了新的訪問方式。用戶可以在文件名前指定Volume名稱,這樣可以繞過mount table的訪問直接請求到某組盤古master上,這個功能可以有效防止集群中大量進程短時間啟動時集中獲取mount table帶來的流量沖擊。為了應對元數據不均衡的問題,盤古提供了在兩個Volume間的元數據遷移工具。
  • 方案二:Ceph系統的MDS的擴展性用動態分裂功能實現,分裂依據是目錄或者文件的請求頻率。當用戶請求某個路徑的時候,將路徑中的每個目錄以及最終末端的節點或者目錄上的請求統計值增加,然后通過定期來計算每個MDS中目錄的請求頻率來決定是否已經超過了MDS的負載而需要動態分裂。分裂過程中源MDS會元信息發送給目標MDS,並分別記錄遷移日志。這種動態分裂的方式可以有效解決局部訪問熱點帶來的性能瓶頸,在元數據規模和處理能力方面都做了擴展,是比靜態划分方法更好的設計和實現方式。

  9.混合存儲

    混合存儲原因是要根據不同存儲介質合理使用,提高存儲系統性能的同時又不會太大的增大成本。例如HDFS中可以將一個副本放在SSD中,其他副本放在此盤上,Heterogeneous Storages in HDFS,http://hortonworks.com/blog/heterogeneous-storages-hdfs/;阿里的盤古文件系統中,后台程序定期將SSD上記錄的多次隨機寫合並成一次批量寫,將數據寫入到HDD的chunk replica文件中,這樣能在一定程度上降低寫的延遲;

RAMCloud內存存RAMCloud,https://ramcloud.atlassian.net/wiki/display/RAM/RAMCloud

RAMCloud內存存儲方案同盤古的混合存儲方案比較接近,最明顯的不同點是將SSD換成了內存存儲。 當數據寫入是,所以數據均寫入到內存,為了高效利用內存,采用了連續記錄日志的方式將數據存放在內存中。同時將數據按照數據所屬應用進行划分,分別建立索引,方便對數據進行隨機訪問。由於內存存儲的易失性,所以需要將內存中的數據以異步方式保存到磁盤中。 這種實現策略非常適用於分布式的cache服務,可以充分利用內存的高帶寬和低延遲,但是在分布式環境中需要同時配備高速網絡,否則其威力得不到發揮。

從上面的例子可以看到,混合存儲技術基本是利用高性能小容量高成本的介質來作為低性能大容量低成本的cache來滿足業務需求。

 

磁盤

SSD

內存

容量

1–4 TB

400–800 GB

24–128 GB

延時

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM