天天看點

集中式存儲和分布式存儲

分布式存儲是相對于集中式存儲來說的,在介紹分布式存儲之前,我們先看看什麼是集中式存儲。不久之前,企業級的儲存設備都是集中式存儲。所謂集中式存儲,從概念上可以看出來是具有集中性的,也就是整個存儲是集中在一個系統中的。但集中式存儲并不是一個單獨的裝置,是集中在一套系統當中的多個裝置。以EMX公司的存儲為例,整個存儲系統可能需要幾個機櫃來存放。

集中式存儲和分布式存儲

圖1 集中式存儲實體示意圖

集中式存儲基本架構

在這個存儲系統中包含很多元件,除了核心的機頭(控制器)、磁盤陣列(JBOD)和交換機等裝置外,還有管理裝置等輔助裝置。如圖2是一個集中式存儲的基本邏輯示意圖。

集中式存儲和分布式存儲

圖2 集中式存儲邏輯示意圖

在集中式存儲中通常包含一個機頭,這個是存儲系統中最為核心的部件。通常在機頭中有包含兩個控制器,這兩個控制器實作互備的作用,避免硬體故障導緻整個存儲系統的不可用。在該機頭中通常包含前端端口和後端端口,前端端口使用者為伺服器提供存儲服務,而後端端口用于擴充存儲系統的容量。通過後端端口機頭可以連接配接更多的儲存設備,進而形成一個非常大的存儲資源池。

機頭中是整個存儲系統的核心部件,整個存儲系統的進階功能都在其中實作。控制器中的軟體實作對磁盤的管理,将磁盤抽象化為存儲資源池,然後劃分為LUN提供給伺服器使用。這裡的LUN其實就是在伺服器上看到的磁盤。當然,一些集中式存儲本身也是檔案伺服器,可以為伺服器提供共享檔案服務。無論如何,從上面我們可以看出集中式存儲最大的特點是有一個統一的入口,所有資料都要經過這個入口,這個入口就是存儲系統的機頭。

分布式存儲是一個大的概念,其包含的種類繁多,除了傳統意義上的分布式檔案系統、分布式塊存儲和分布式對象存儲外,還包括分布式資料庫和分布式緩存等。本文局限在分布式檔案系統等傳統意義上的存儲架構,對于資料庫等不做介紹。

中間控制節點架構(HDFS)

分布式存儲最早是由谷歌提出的,其目的是通過廉價的伺服器來提供使用與大規模,高并發場景下的Web通路問題。如圖3是谷歌分布式存儲(HDFS)的簡化的模型。在該系統的整個架構中将伺服器分為兩種類型,一種名為namenode,這種類型的節點負責管理管理資料(中繼資料),另外一種名為datanode,這種類型的伺服器負責實際資料的管理。

集中式存儲和分布式存儲

圖3 HDFS簡化架構圖示意圖

上圖分布式存儲中,如果用戶端需要從某個檔案讀取資料,首先從namenode擷取該檔案的位置(具體在哪個datanode),然後從該位置擷取具體的資料。在該架構中namenode通常是主備部署,而datanode則是由大量節點構成一個叢集。由于中繼資料的通路頻度和通路量相對資料都要小很多,是以namenode通常不會成為性能瓶頸,而datanode叢集可以分散用戶端的請求。是以,通過這種分布式存儲架構可以通過橫向擴充datanode的數量來增加承載能力,也即實作了動态橫向擴充的能力。

完全無中心架構---計算模式(Ceph)

如圖是Ceph存儲系統的架構,在該架構中與HDFS不同的地方在于該架構中沒有中心節點。用戶端是通過一個裝置映射關系計算出來其寫入資料的位置,這樣用戶端可以直接與存儲節點通信,進而避免中心節點的性能瓶頸。

集中式存儲和分布式存儲

圖4 Ceph無中心架構

在Ceph存儲系統架構中核心元件有Mon服務、OSD服務和MDS服務等。對于塊存儲類型隻需要Mon服務、OSD服務和用戶端的軟體即可。其中Mon服務用于維護存儲系統的硬體邏輯關系,主要是伺服器和硬碟等線上資訊。Mon服務通過叢集的方式保證其服務的可用性。OSD服務用于實作對磁盤的管理,實作真正的資料讀寫,通常一個磁盤對應一個OSD服務。

用戶端通路存儲的大緻流程是,用戶端在啟動後會首先從Mon服務拉取存儲資源布局資訊,然後根據該布局資訊和寫入資料的名稱等資訊計算出期望資料的位置(包含具體的實體伺服器資訊和磁盤資訊),然後該位置資訊直接通信,讀取或者寫入資料。

完全無中心架構---一緻性哈希(Swift)

與Ceph的通過計算方式獲得資料位置的方式不同,另外一種方式是通過一緻性哈希的方式獲得資料位置。一緻性哈希的方式就是将裝置做成一個哈希環,然後根據資料名稱計算出的哈希值映射到哈希環的某個位置,進而實作資料的定位。

集中式存儲和分布式存儲

圖5 一緻性哈希原理

如圖5是一緻性哈希的基本原理,為了繪制簡單,本文以一個伺服器上的一個磁盤為例進行介紹。為了保證資料配置設定的均勻性及出現裝置故障時資料遷移的均勻性,一緻性哈希将磁盤劃分為比較多的虛拟分區,每個虛拟分區是哈希環上的一個節點。整個環是一個從0到32位最大值的一個區間,并且首尾相接。當計算出資料(或者資料名稱)的哈希值後,必然落到哈希環的某個區間,然後以順時針,必然能夠找到一個節點。那麼,這個節點就是存儲資料的位置。

Swift存儲的整個資料定位算法就是基于上述一緻性哈希實作的。在Swift對象存儲中,通過賬戶名/容器名/對象名三個名稱組成一個位置的辨別,通過該唯一辨別可以計算出一個整型數來。而在儲存設備方面,Swift建構一個虛拟分區表,表的大小在建立叢集是确定(通常為幾十萬),這個表其實就是一個數組。這樣,根據上面計算的整數值,以及這個數組,通過一緻性雜湊演算法就可以确定該整數在數組的位置。而數組中的每項内容是資料3個副本(也可以是其它副本數量)的裝置資訊(包含伺服器和磁盤等資訊)。也就是經過上述計算,可以确定一個資料存儲的具體位置。這樣,Swift就可以将請求重新定向到該裝置進行處理。

集中式存儲和分布式存儲

圖6 Swift資料定位示意圖

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

本文介紹了3中最為通用的分布式存儲架構及存儲形式。其它存儲架構也基本上基于上述架構,并沒有太大的變化。是以,了解上述架構後,對于了解其它分布式存儲會有很大的幫助。

繼續閱讀