副本和就刪碼

*一炁化三清*發表於2024-04-19

分類
按照儲存的結構儲存可以分為集中式儲存和分散式儲存

  • 集中式儲存
    傳統集中式儲存採用控制器+硬碟櫃的方式,透過冗餘的雙控制器提供資料管理和讀寫能力(也有超過2個控制器的多控儲存,多見於高階儲存),透過控制器自帶的硬碟槽位或擴充套件硬碟櫃提供儲存空間,如下圖。

    集中式儲存的硬碟資料保護多采用RAID技術,比如RAID5、RAID6、RAID10等
  • 分散式儲存
    分散式儲存為了實現更靈活的擴充套件性和更大的儲存規模,採用無中心的組網方式,每個儲存節點都可以同時提供計算和儲存資源。它們透過內部交換機互聯起來,基於分散式儲存軟體提供統一的儲存資源池。比如1個節點是200TB容量,那麼5個節點就是1000TB容量,並可以擴充套件到數千個節點EB級別的容量,所以更適合用在海量資料的場景下。

副本和就刪碼

  • 多副本
    多副本,顧名思義就是多個資料副本,簡單來說就是一個資料複製多份完全一樣的副本,分別存放在多個不同節點上。比如我們常用的3副本(如下圖所示)就是將A這個資料複製了3份,分別存放在節點1、3、4上,這三個節點是在整個叢集中隨機選擇的,下一個B資料有可能就放在節點1、2、4上了。

    我們來看下多副本的資料保護效果,很明顯,當節點1和3同時故障時,節點4上仍然會儲存有A資料。以此類推,我們可以知道,N副本技術可以允許N-1個節點同時故障資料不丟失。如果是硬碟故障,只要故障硬碟的範圍不超過N-1個節點,資料也不會丟失,比如節點1壞了3塊盤、節點3壞了4塊盤,資料仍然不會丟失。
  • 就刪碼
    糾刪碼的英文全稱是Erasure Code,所以有時我們也會簡稱為EC。糾刪碼顧名思義是一種糾正資料丟失的校驗碼,大家可以把它類比成一個方程組。我們如果知道4個數a、b、c、d,就可以透過2個不同的公式算出2個校驗資料x和y,把6個資料一起儲存起來,那麼當a、b、c、d其中1個或2個資料丟失的話,就可以透過剩餘的2個值和計算公式,反推出丟失的2個資料。比如:
    已知:a+b+c+d=x=10,a+2b+3c+4d=y=20,c=2,d=1
    那麼:a+b=7,a+2b=10,則a=4,b=3
    當然以上計算只是一個簡化的方案,目的是幫助大家理解,真正儲存中用的校驗方式會比這個複雜得多,但效果是類似的。
    如果我們用M+N表示糾刪碼的話,以上就是一個4+2的糾刪碼方案,資料會被切分成4個相同大小的分片,並透過校驗演算法生成2個同樣大小的校驗分片P和Q。比如32KB的資料會被切成4個8KB的分片,再生出2個8KB的分片,總計48KB資料。當6個資料分片生成後,它們會被隨機存到6個不同的節點上(如下圖所示)。

    和多副本一樣,我們來看下4+2糾刪碼的資料保護效果。從上圖可以看出,當任意2個節點故障時,資料是不會丟失的,因為只會丟失2個資料分片,還是可以反算出來的。當然如果同時故障了3個節點,4+2的糾刪碼是無能為力的,就像1個方程有2個未知數怎麼也解不出來一樣。而且4+2糾刪碼也可以允許2個節點內任意個數硬碟故障時,資料不丟失。比如節點1、節點2分別故障了5塊硬碟,也完全不會有影響,因為每一組4+2分片都有4個分片還在,資料還是可靠的。

多副本和糾刪碼對儲存節點有什麼要求?

多副本和糾刪碼對分散式儲存的節點數量和硬碟配置都有一定要求,主要是2點:

  • N個副本至少需要N個節點才能部署,比如3副本至少需要3個儲存節點,而M+N糾刪碼至少需要(M+N)個節點,比如4+2糾刪碼至少需要6個節點,當然這只是最低要求,上限並沒有限制,另外也不會有倍數比例的要求,比如3副本並不要求一定是6個、9個節點,5個、7個節點也可以;

  • 每個節點的硬碟數量和單盤容量建議相同,因為如果不同的話,就會出現水桶的短板效應,兩個節點,一個節點配置8TB硬碟,一個節點配置4TB硬碟,8TB硬碟只能當4TB硬碟用,因為每個節點的資料儲存容量是隨機分佈、幾乎相同的。

什麼是M+N:1糾刪碼?

除了常見的M+N糾刪碼之外,我們還經常見到一種M+N:1的糾刪碼,這是一種特殊的糾刪碼技術,我們稱之為亞節點糾刪碼。

這種技術的出現是為了滿足小規模叢集的部署要求,我們舉個例子,有一個使用者採購了3個分散式儲存節點,因為節點數量比較少,他可選的資料冗餘策略就只有3副本和2+1糾刪碼(2副本暫不考慮,後文我們來詳細說明原因)。選擇3副本的話,儲存的空間利用率就只有33%了,如果我們再考慮其他因素,比如硬碟標稱值的差異、系統預留空間、熱備空間的話,可用空間可能只有26%左右,這對於很多看重容量的使用者來講是比較難以接受的。但如果我們選擇2+1糾刪碼呢,問題出現了,2+1糾刪碼只能允許1個分片資料丟失,當叢集中2個節點分別故障1塊硬碟的時候,資料就丟失了!

在實際使用場景下,2塊硬碟同時故障的情況雖然比較少見,但機率也並不算低,因為很多使用者在1塊硬碟故障時可能並沒有發覺。這段時間儲存就是在極其危險的狀態下執行,任何硬碟出問題都會導致叢集資料丟失,很顯然,2+1糾刪碼的方案並不好。

基於以上原因,4+2:1的糾刪碼出現了。為什麼叫亞節點糾刪碼呢,因為預設的糾刪碼是按照節點來分配資料的,但4+2:1只會按照硬碟來分配資料,它把3個節點當6個節點用,每個節點選擇2塊硬碟,整個叢集選擇6塊不同的硬碟來存放4+2總計6個分片資料(如下圖所示)。

我們看到,4+2:1相比2+1糾刪碼,雖然能容忍節點故障數量仍然是1個,但它可以允許2個節點分別故障1塊硬碟(總計故障2塊硬碟)而資料不丟失。而實際情況下,硬碟故障的機率是遠遠低於整個節點故障的,所以4+2:1還是非常可靠的,而且它的空間利用率遠高於3副本。當然如果你擔心的是2個節點同時故障,那你只能選擇3副本了。

類似於4+2:1,也存在8+2:1、16+2:1等亞節點糾刪碼,這裡我們就不多討論了。

對比


在可用容量上,糾刪碼的優勢是較大的,比如4+2糾刪碼的利用率是66%,但3副本只有33%,兩者差了2倍,8+2糾刪碼更可以做到80%,這一局糾刪碼完勝!

  • 在讀寫效能上,多副本往往會更高,因為糾刪碼在寫入時涉及資料校驗,而且可能會產生寫懲罰,在讀取時更會橫跨多個節點。比如4+2糾刪碼在讀取1個資料時,需要從4個節點分別讀取4個分片再進行拼接,任何1個節點時延過高,都會對效能造成很大影響。而多副本只需要讀取1個完整的分片即可,不涉及節點的資料拼接。這兩者的效能差異在小塊IO時會較為明顯,但如果IO塊比較大的話,比如1MB,那麼兩者的效能差距就會逐漸縮小,因為這時候寫懲罰較少,糾刪碼也能很好發揮多個節點併發的優勢,這一局多副本略勝一籌!

  • 在重構效能上,多副本也會有明顯優勢,因為不涉及資料校驗,只是單純的資料複製,所以速度比較快。而糾刪碼的重構涉及反向校驗的計算過程,所需要的讀寫資料量和CPU計算消耗都會更大,這一局多副本同樣略勝一籌!(說明:重構指的是儲存硬碟故障後的資料恢復過程,把故障硬碟的資料恢復到正常的硬碟上,保證資料的完整性)

  • 在可靠性上,多副本和糾刪碼的故障冗餘程度往往差別不大,比如3副本和4+2糾刪碼都可以允許任意2個節點故障而資料不丟失。但我們也需要注意兩點,一是多副本的重構效能往往比糾刪碼更快,所以硬碟故障恢復也更快,會帶來一些可靠性上的優勢。二是糾刪碼可以採用+3、+4的策略來容忍更多節點故障,而且空間利用率並不會太低,但如果多副本採用4副本、5副本的話代價就太大了,所以這一點上糾刪碼有優勢。這一局兩者難分伯仲!

  • 綜合來看,如果使用者更關注效能,尤其是小IO的場景,多副本往往是更好的選擇,如果使用者更關注可用容量,而且是大檔案場景的話,糾刪碼會更合適。

應該具體選擇什麼規格的糾刪碼和多副本?

常見的多副本和糾刪碼策略如下表,我們逐個分析:

  • 2副本:
    不推薦!不推薦!不推薦!重要的事情說3遍,因為真的很危險!可能很多使用者看重了2副本還不錯的空間利用率(50%),同時效能也非常好,但選擇儲存的底線很多時候往往是資料的可靠性,千萬不能因小失大。2副本只能允許任意1塊硬碟故障,一旦1塊硬碟故障後,整個叢集就處於岌岌可危的狀態,任何問題都可能導致所有資料全部丟失。而想想硬碟每年1%-2%的平均故障率,整個叢集可能有上百塊硬碟,你還想每年都擔驚受怕好幾次嗎?所以除了開發測試場景,完全不擔心資料丟失這種情況外,忘了2副本吧,它真的很危險!

  • 3副本:
    如果你要選擇多副本,那麼2副本太危險,4副本太浪費空間,所以3副本是最好的選擇。它除了空間利用率低一點之外就沒有其他缺點了,在容量要求不高的時候其實成本還是可以接受的。在塊儲存、小檔案的場景建議採用這種方案。

  • 2+1糾刪碼:
    同樣不推薦,理由和2副本一樣,太危險了,而且有4+2:1糾刪碼這個處處比它好的方案在,為什麼還要多看2+1糾刪碼一眼呢。

  • 4+2:1糾刪碼:
    當叢集節點數量不足6個,沒法用4+2的情況下,4+2:1亞節點糾刪碼無疑是最好的選擇,它既可以允許任意2塊硬碟故障資料不丟失,空間利用率也和2+1完全相同。

  • 4+2糾刪碼:
    當叢集節點數≥6個時,4+2糾刪碼是不錯的選擇,因為它可以容忍任意2個節點的硬碟故障資料不丟失,空間利用率也很高(66%)。

  • 8+2糾刪碼:
    當叢集節點數≥10個,而且看重空間利用率大於效能時,8+2糾刪碼也是一個選擇,它的空間利用率高達80%,但注意效能可能不理想。

綜上所述,當你選擇了多副本,3副本幾乎是唯一的選項,當你選擇了糾刪碼,可以根據叢集的節點數量進行選擇,3-5個節點時選擇4+2:1,≥6個節點時選擇4+2,如果你更看重空間利用率,而且不要求高效能的情況,也可以考慮8+2糾刪碼。

除此之外,可能會有人問,5+2、8+3、16+2等糾刪碼可不可以用呢?實際上,因為計算機二進位制的特點,M+N糾刪碼的M我們往往取2的冪次方,比如2、4、8、16,這樣切片的效率更高,所以5+2這類糾刪碼很少會用。
8+3、8+4這類糾刪碼雖然比+2更可靠,但因為同時故障3個、4個節點的機率太低了,由此帶來的效能性下降並不划算,所以也很少使用。16+2的優勢是空間利用率比較高(89%),但效能也較低,所以如果使用者的叢集規模比較大,對空間利用率要求極高,而且可以容忍一定效能下降的話,16+2或16+2:1在少數場景下也是會被使用的。

空間的利用率怎麼算

參考和轉載至

https://mints.blog.csdn.net/article/details/118692526?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-8-118692526-blog-122967008.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-8-118692526-blog-122967008.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=13

相關文章