寫入漏洞:哪些 RAID 級別受到影響?
在我了解 RAIDZ 優勢的過程中,我遇到了write hole的概念。
正如本頁所解釋的,寫入漏洞是在寫入期間斷電時陣列磁碟之間出現的不一致。該頁面還解釋說它會影響 RAID-5/6(如果在寫入數據後但在計算奇偶校驗之前斷電)和 RAID-1(數據寫入一個磁碟而不是其他磁碟) ,並且這是一個陰險的問題,只能在重新同步/清理期間或(災難性地)在重建其中一個磁碟期間檢測到……但是,大多數 其他來源都 在 談論它,因為它只影響奇偶校驗- 基於 RAID 級別。
據我了解,我認為這對於 RAID-1 也可能是一個問題,因為從包含該孔的磁碟讀取會返回垃圾,所以……是否每個RAID 級別都有問題?它依賴於實現嗎?它是否僅影響軟體 RAID 或硬體控制器?(補充:
mdadm
這方面的票價如何?)
術語寫入孔用於描述處理非電池保護 RAID 陣列時出現的兩個相似但不同的問題:
- 有時它被錯誤地定義為由於突然斷電而導致 RAID 陣列中的*任何損壞。*使用這個(錯誤的)定義,RAID1 很容易出現寫入漏洞,因為您不能原子地寫入兩個不同的磁碟;
- write hole的正確定義,即在條帶更新期間由於突然斷電而失去*整個條帶數據冗餘,*僅適用於基於奇偶校驗的 RAID。
第二個也是正確的寫入漏洞的定義需要更多解釋:讓我們假設一個 3 磁碟 RAID5 具有 64K 塊大小和 128K 條帶大小(每個條帶 +64K 奇偶校驗大小)。如果在將 4K 寫入磁碟 #1 但在磁碟 #3 上進行奇偶校驗更新期間斷電,我們可能會遇到偽造的(即:損壞的)奇偶校驗塊和未檢測到的數據一致性問題。如果稍後磁碟#2 當機並且奇偶校驗用於通過異或磁碟#1 和磁碟#3 來恢復原始數據,那麼最初駐留在磁碟#2 上並且最近沒有寫入的重建的64K 仍然會損壞。
這是一個人為的例子,但它應該暴露與 寫入漏洞相關的主要問題:失去未觸及的、靜止的、不相關的數據與最新的中斷寫入共享同一條帶。換句話說,如果 fileA 是多年前寫入的,但與剛剛寫入的 fileB 共享相同的條帶,並且系統在 fileB 更新期間斷電,則 fileA 將處於危險之中。
要考慮的另一件事是數組的寫策略:使用讀/重構/寫(即:當部分寫發生時重寫整個條帶)與讀/修改/寫(即:僅更新受影響的塊+奇偶校驗)暴露於不同類型的寫孔。
從上面可以清楚地看出,因為 RAID0 和 RAID1 不會遭受適當的寫入漏洞:它們沒有奇偶校驗,這可能會“不同步”而使整個條帶無效。請注意,RAID1 鏡像分支在不正常關機後*可能會不同步,但唯一的損壞是最新寫入的數據。*以前寫入的數據(即:靜態數據)不會遇到任何麻煩。
定義並確定了適當的寫入漏洞後,如何避免?
- HW RAID 使用非易失性寫入記憶體(即:BBU+DRAM 或電容支持的快閃記憶體模組)來持久儲存要寫入的更新。如果斷電,當電源恢復和系統啟動時,硬體 RAID 卡將重新發出任何掛起的操作,將其記憶體刷新到磁碟盤片。這不僅可以防止適當的寫入漏洞,還可以防止最後寫入的數據損壞;
- Linux MD RAID 使用寫入點陣圖,在更新之前記錄要寫入的條帶。如果斷電,臟點陣圖用於重新計算受影響條帶的任何奇偶校驗數據。這只能防止真正的寫入漏洞;最新寫入的數據可能會損壞(除非有 fsync()+write 屏障支持)。相同的方法用於重新同步 RAID1 陣列的不同步部分(以確保兩個鏡像支路同步,儘管鏡像不存在寫入孔);
- 較新的 Linux MD RAID5/6 應該可以選擇使用日誌/日誌設備,部分模擬適當硬體 RAID 卡的非易失性回寫記憶體(並且,根據特定的更新檔/實現,防止寫入漏洞和最後-寫入數據損壞或僅來自寫入孔);
- 最後,RAIDZ 使用最“優雅”但影響性能的方法避免寫入漏洞和最後數據損壞:僅寫入全尺寸條帶(並在 ZIL/SLOG 中記錄任何同步寫入)。
有用的連結:
https://neil.brown.name/blog/20110614101708
https://www.kernel.org/doc/Documentation/md/raid5-ppl.txt
https://www.kernel.org/doc/Documentation /md/raid5-cache.txt
這就是為什麼 raid 需要記憶體電池或其他一些記憶體一致性驗證方法。所有的raid卡都應該有電池支持的記憶體,所有的儲存控制器都應該有鏡像記憶體。對於軟體突襲,我認為沒有一個好的答案。我認為即使是突襲 Z 也會因斷電而失敗。