集中式存儲 vs 分佈式存儲

      過去幾年中,企業級存儲設備主要採用集中式存儲架構。集中式存儲是一種具有集中性的存儲方式,整個存儲系統集中在一個系統中。儘管集中式存儲並非單獨的設備,而是由多個設備組成的系統,以 EMC 公司的 VMAX 存儲系統爲例,可能需要多個機櫃來容納整個存儲系統。

在集中式存儲系統中,包含多個組件,除了核心的機頭(控制器)、磁盤陣列(JBOD)和交換機等設備,還包括管理設備等輔助設備。

通常,集中式存儲包含一個機頭 EMC 產品裏面叫 Engine ,這是存儲系統中最關鍵的部件。機頭通常包含兩個控制器,實現互備功能,以防止硬件故障導致整個存儲系統不可用。機頭還包括前端端口和後端端口。前端端口用於爲服務器提供存儲服務,後端端口用於擴展存儲系統的容量。通過後端端口,機頭可以連接更多的存儲設備,形成一個龐大的存儲資源池。

機頭是整個存儲系統的核心組件,承載着存儲系統的高級功能。控制器的軟件負責管理磁盤,將其抽象爲存儲資源池,並將其劃分爲邏輯單元(LUN),供服務器使用。在服務器上,LUN 實際上是可見的磁盤。此外,一些集中式存儲還可以作爲文件服務器,爲服務器提供共享文件服務。總之,集中式存儲的最大特點是具有統一的入口,所有數據必須經過存儲系統的機頭。

▉ 分佈式存儲

分佈式存儲是一個廣義的概念,涵蓋了許多類型,包括傳統的分佈式文件系統、分佈式塊存儲、分佈式對象存儲,以及分佈式數據庫和分佈式緩存等。本文主要關注傳統意義上的分佈式文件系統等存儲架構,不涉及數據庫等方面的介紹。

▉ 中心控制節點架構(HDFS)

分佈式存儲最早由谷歌提出,其目的是通過廉價服務器提供適用於大規模高併發 Web 訪問的解決方案。圖 3 展示了谷歌分佈式文件系統(HDFS)的簡化模型。在該架構中,服務器被分爲兩種類型:名稱節點(namenode)和數據節點(datanode)。名稱節點負責管理數據的元數據,而數據節點負責實際數據的管理。

在 HDFS 分佈式存儲中,如果客戶端需要讀取某個文件的數據,首先會向名稱節點請求該文件的位置信息(即具體在哪個數據節點),然後直接與該數據節點通信來獲取數據。在該架構中,名稱節點通常以主備部署方式運行,而數據節點構成一個集羣。由於對元數據的訪問頻率和訪問量遠遠小於數據訪問量,因此名稱節點通常不會成爲性能瓶頸,而數據節點集羣可以分擔客戶端請求。通過這種分佈式存儲架構,可以通過橫向擴展數據節點的數量來增加負載能力,實現動態橫向擴展的能力。

▉ 完全去中心化架構 - 計算模式(Ceph)

圖 4 展示了 Ceph 存儲系統的架構,與 HDFS 的區別在於沒有中心節點。客戶端通過計算確定數據的存儲位置,直接與存儲節點通信,避免了中心節點的性能瓶頸。

在 Ceph 存儲系統架構中,核心組件包括 Monitor 服務、OSD 服務和 MDS 服務等。對於塊存儲類型,只需要 Monitor 服務、OSD 服務和客戶端軟件。Monitor 服務用於維護存儲系統的硬件邏輯關係,主要是在線信息,如服務器和硬盤。Monitor 服務通過集羣方式確保其服務的可用性。OSD 服務用於管理磁盤,實現實際的數據讀寫,通常一個磁盤對應一個 OSD 服務。

客戶端訪問存儲的大致流程如下:客戶端啓動後,首先從 Monitor 服務獲取存儲資源佈局信息,然後根據佈局信息和要寫入數據的名稱等信息計算出數據的位置(包括具體的物理服務器和磁盤信息),然後直接與該位置通信以讀取或寫入數據。

▉ 完全去中心化架構 - 一致性哈希(Swift)

與 Ceph 通過計算方式獲取數據位置的方式不同,另一種方式是使用一致性哈希。一致性哈希將設備構建爲一個哈希環,根據數據名稱的哈希值將其映射到環上的某個位置,從而確定數據的位置。

      爲了簡化,本文以服務器上的一個磁盤爲例進行說明。爲了確保數據分配均勻性和在設備故障時的數據遷移均衡性,一致性哈希將磁盤劃分爲多個虛擬分區,每個虛擬分區是哈希環上的一個節點。整個環是一個從 0 到最大 32 位值的區間,首尾相連。當計算出數據(或數據名稱)的哈希值後,它必定落在哈希環的某個區間內,然後沿順時針方向,一定能夠找到一個節點,該節點即爲數據的存儲位置。

    假設集羣此時要添加一個節點 N4, 在 N1,N2 中間, 那麼, 按照順時針計算的方法, 原本存儲到節點 N2 上的關鍵字 a 將轉移到 N4 上, 其他不變.

     Swift 存儲的數據定位算法基於上述一致性哈希實現。在 Swift 對象存儲中,通過帳戶名 / 容器名 / 對象名這三個名稱來標識位置,根據這個唯一標識可以計算出一個整數。在存儲設備方面,Swift 構建了一個虛擬分區表,表的大小在集羣創建時確定(通常爲幾十萬個)。這個表實際上是一個數組。通過計算得到的整數值以及這個數組,通過一致性哈希算法可以確定該整數在數組中的位置。數組中的每個條目都包含數據的三個副本(或其他副本數量)的設備信息(包括服務器和磁盤信息)。換句話說,通過上述計算可以確定數據的具體存儲位置。這樣,Swift 可以將請求重定向到相應的設備進行處理。

     上述計算過程在一個名爲 Proxy 的服務中進行,該服務可以部署爲集羣。因此,請求負載可以分攤,不會成爲性能瓶頸。

      本文介紹了三種最常見的分佈式存儲架構和存儲形式。其他存儲架構基本上都基於這些架構,沒有太大的變化。因此,一旦理解了這些架構,就可以更好地理解其他分佈式存儲架構。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Q3zWjp9ywCQPRfNVzVJPAg