原文首發於我的博客「tobe的囈語」歡迎你們的訪問收藏啊~php
咱們知道,在面對大規模數據的計算和存儲時,有兩種處理思路:服務器
在分佈式技術還沒有成熟的時候,小型機、中型機、大型機、超級計算機逐步升級的方案几乎是大型公司的惟一選擇,可是這種垂直擴展是有天花板的,硬件升級的速度遠遠比不上數據規模的增速,即便是超級計算機也沒法知足人們對計算資源的需求。網絡
水平擴展方案,也就是在一個系統裏不斷添加機器的方案,就這麼走上了歷史舞臺。這就是如今的分佈式技術。併發
在這篇文章裏,我將分別介紹單機系統下的 RAID 存儲技術以及分佈式系統下的存儲分佈技術,這兩種技術在思想上有很相近的地方,但願讀者慢慢體會。app
RAID,全稱是Redundant Array of Inexpensive/Independent Disks,也就是磁盤冗餘陣列,這裏的 I 有兩種說法,一種是 Inexpensive,廉價,另外一種是Independent ,獨立。所謂 RAID 就是將多塊磁盤組合在一塊兒,對外抽象成一個容量大,讀寫速度高,容錯性好的大型磁盤。負載均衡
我很喜歡「抽象」這個概念,由於它爲咱們屏蔽了更底層的細節,好比操做系統中的文件系統,虛擬內存等。在我看來,RAID 就是對多個獨立磁盤的抽象。分佈式
注意,上面的圖裏的三個方面(存儲容量、讀寫速度、數據可靠性)是衡量存儲系統的重要標準,咱們在分佈式系統裏也會說起,不過如今讓咱們先來看看經常使用的 RAID 技術。優化
RAID 0 是數據在從內存緩衝區寫入磁盤時,根據磁盤的數量,將數據分紅 N 份,而後把這些數據併發寫入 N 塊磁盤,每塊磁盤上存儲不一樣的數據,這樣總體的數據寫入速度是單個磁盤的 N 倍,讀取固然也是併發執行的。操作系統
所以 RAID 0 具備極快的數據讀寫速度。可是RAID 0不作數據備份,N塊磁盤中只要有一塊損壞,數據完整性就被破壞,其餘磁盤的數據就沒法使用了。設計
RAID 1 的策略更爲簡單,無論你有幾個磁盤,都給我存同樣的數據,這樣數據的可靠性極高,可是寫入速度收到很大影響。
Any read request can be serviced by any drive in the set. If a request is broadcast to every drive in the set, it can be serviced by the drive that accesses the data first (depending on its seek time and rotational latency), improving performance. Sustained read throughput, if the controller or software is optimized for it, approaches the sum of throughputs of every drive in the set, just as for RAID 0. Actual read throughput of most RAID 1 implementations is slower than the fastest drive. Write throughput is always slower because every drive must be updated, and the slowest drive limits the write performance. The array continues to operate as long as at least one drive is functioning.^1
這段話意思是說,RAID 1 的讀取速度取決於哪個硬盤能最早訪問到待讀取的數據,若是軟件上有優化,能夠達到 RAID 0 的讀取速度。可是最慢的磁盤限制了寫入速度,由於系統須要等待最慢的磁盤完成寫入並作好檢驗工做。RAID 1 的可靠性好,只要陣列裏有任意一塊磁盤還能用,陣列就能繼續工做,並且當新磁盤替代舊磁盤後,系統會自動複製數據。
RAID 0 讀寫速度高,但沒有數據冗餘, RAID 1 作了數據備份,但讀寫速度受到制約,因此就須要想辦法結合 RAID 0 和 RAID 1,揚長避短,RAID 10 就這麼出現了。
RAID 10 就是將 N 個磁盤平均分紅兩份,這兩份互爲鏡像,至關因而 RAID 1,但對於每份磁盤中的 N/2 塊磁盤來講,其存儲方式像 RAID 0 同樣,能夠作到併發讀寫。這樣就作到了折中,在讀寫速度和容錯能力上有一個平衡。
咱們不難看出來,RAID 10 的磁盤利用率較低,有一半的磁盤都拿來作備份了,着實有些奢侈。
就通常狀況而言,服務器上不多出現同時損壞兩塊磁盤的狀況,每每是損壞一塊磁盤的時候,就換上新的磁盤,而後利用恢復技術恢復損壞磁盤上的數據,因此咱們能夠據此設計一個磁盤利用率更高的方案。
有了前面的討論,咱們能夠想到,若是任何一塊磁盤上的數據,都能經過其它 N-1 塊磁盤上的數據恢復出來,不就解決咱們的問題了嗎?
校驗機制正好知足咱們的要求。
在寫入磁盤的時候,咱們把數據分紅 N-1 份,併發寫入 N-1 塊磁盤,而後用剩下的一塊磁盤記錄校驗數據,這樣咱們就能夠容忍任意一塊磁盤的損壞。
根據校驗數據寫入的位置,咱們有了兩種方案:
相較於 RAID 5,RAID 6 的可靠性更高,由於 RAID 6 採用了兩種校驗碼螺旋寫入的方案,這樣能夠容忍兩塊磁盤同時損壞。
什麼狀況下須要這樣的容錯能力?在大型服務器上,每塊磁盤的容量每每很大,在某一塊磁盤損壞後,即便立馬替換上了新磁盤,也須要很長時間才能把全部數據恢復完畢,那麼在這段時間裏,若是有另外一塊磁盤損壞,數據就沒辦法恢復了,這是咱們不能接受的,所以就須要 RAID 6 來確保數據的完整性。
PS:本文着重於分佈式系統的副本與數據分佈的關係,由於這部分的思想與 RAID 有類似之處,關於一致性哈希等問題將單獨寫一篇文章介紹。
分佈式系統應對的存儲規模要比單機大不少,但基本思想和設計目標都是一致的:
與單機狀況不一樣,分佈式系統面臨的問題要多得多,由於服務器之間的數據是經過網絡傳輸,延時較高,甚至可能會出現網絡中斷,致使某些機器沒法訪問。這對咱們的存儲方案有很大影響,好比,咱們還能用相似 RAID 5 的校驗方式來作冗餘嗎?
答案是否認的,由於作校驗的成本過高了,一次校驗須要其它 N-1 臺機器的響應,一等就是幾十毫秒,效率極低,並且網絡負載太大了。相反,RAID 10 的方案看起來更適合如今的狀況。
在該方式下,若干機器互爲副本,副本機器之間的數據是徹底同樣的,就像 RAID 1 的方案同樣。這種方式的優勢就是簡單,但缺點也很明顯:
所以,以機器做爲副本單位不適合當前的場景,咱們須要尋找其它的途徑。
相較於以機器爲副本單位,將數據拆分紅以數據段爲單位做爲副本的靈活性更佳,下面我就用一個更直觀例子來講明該方案的優勢。
該例子下,機器 1 的全部數據都分佈在其餘的 7 臺機器上,忽略集羣中其餘的機器。
這種方案爲咱們帶來了什麼好處?
可是這種方案不是沒有問題,由於咱們須要一臺服務器來記錄數據段與機器的對應關係,這臺服務器稱爲元數據服務器。能夠想象,隨着集羣規模的增加,須要管理的元數據的開銷也會不斷增大,副本的維護難度相應增大,因此如今一種折中的方案是,將某些數據段組成一個數據段分組,以數據段分組爲粒度進行副本管理,這樣,能夠將副本粒度控制在一個較爲合適的範圍。
分佈式存儲的副本分佈內容就介紹到這裏了,但願你在看完個人文章以後有所收穫,期待你的贊和轉發!
若是本文對你有幫助,歡迎關注個人公衆號 tobe的囈語 ,帶你深刻計算機的世界~ 公衆號後臺回覆關鍵詞【計算機】有驚喜哦~