RAID 4/5/6 快取

除了正常的 RAID 磁碟之外,Raid 4/5/6 可以包含一個額外的磁碟用於資料快取。快取磁碟不會改變 RAID 磁碟的角色。快取磁碟將資料快取到 RAID 磁碟。快取可以是直寫模式(自 4.4 起支援)或回寫模式(自 4.10 起支援)。mdadm(自 3.4 起支援)有一個新選項 '--write-journal' 來建立帶快取的陣列。有關詳細資訊,請參閱 mdadm 手冊。預設情況下(RAID 陣列啟動時),快取處於直寫模式。使用者可以透過以下方式將其切換到回寫模式:

echo "write-back" > /sys/block/md0/md/journal_mode

並透過以下方式將其切換回直寫模式:

echo "write-through" > /sys/block/md0/md/journal_mode

在這兩種模式下,所有對陣列的寫入都會先到達快取磁碟。這意味著快取磁碟必須快速且可持續。

直寫模式

此模式主要修復“寫入空洞”問題。對於 RAID 4/5/6 陣列,不乾淨的關機可能會導致某些條帶中的資料處於不一致的狀態,例如,資料和奇偶校驗不匹配。原因是條帶寫入涉及多個 RAID 磁碟,並且可能在不乾淨的關機之前寫入尚未到達所有 RAID 磁碟。如果陣列資料不一致,我們稱之為陣列降級。MD 嘗試重新同步陣列以使其恢復到正常狀態。但在重新同步完成之前,任何系統崩潰都將暴露 RAID 陣列中真實資料損壞的機會。這個問題被稱為“寫入空洞”。

直寫快取將首先將所有資料快取在快取磁碟上。在資料在快取磁碟上安全後,資料將被重新整理到 RAID 磁碟上。兩步寫入將保證 MD 可以在不乾淨的關機後恢復正確的資料,即使陣列已降級。因此,快取可以關閉“寫入空洞”。

在直寫模式下,MD 在資料在 RAID 磁碟上安全後,向上層(通常是檔案系統)報告 IO 完成,因此快取磁碟故障不會導致資料丟失。當然,快取磁碟故障意味著陣列再次暴露於“寫入空洞”。

在直寫模式下,不需要大的快取磁碟。幾百兆位元組就足夠了。

回寫模式

回寫模式也修復了“寫入空洞”問題,因為所有寫入資料都快取在快取磁碟上。但是“回寫”快取的主要目標是加速寫入。如果寫入跨越條帶的所有 RAID 磁碟,我們稱之為全條帶寫入。對於非全條帶寫入,MD 必須讀取舊資料才能計算新的奇偶校驗。這些同步讀取會降低寫入吞吐量。一些按順序但未在同一時間分派的寫入也會受到這種開銷的影響。回寫快取將聚合資料,並在資料成為全條帶寫入後才將資料重新整理到 RAID 磁碟。這將完全避免開銷,因此對某些工作負載非常有幫助。一個典型的例子是先進行順序寫入,然後進行 fsync 的工作負載。

在回寫模式下,MD 在資料到達快取磁碟後立即向上層(通常是檔案系統)報告 IO 完成。在滿足特定條件後,資料會稍後重新整理到 raid 磁碟。因此,快取磁碟故障將導致資料丟失。

在回寫模式下,MD 還會將資料快取在記憶體中。記憶體快取包含與快取磁碟上儲存的相同資料,因此斷電不會導致資料丟失。記憶體快取大小對陣列的效能有影響。建議尺寸大一點。使用者可以透過以下方式配置大小:

echo "2048" > /sys/block/md0/md/stripe_cache_size

在這種模式下,太小的快取磁碟會降低寫入聚合的效率,具體取決於工作負載。建議在回寫模式下使用至少幾個 GB 大小的快取磁碟。

實現

直寫和回寫快取使用相同的磁碟格式。快取磁碟被組織為一個簡單的寫入日誌。該日誌由“元資料”和“資料”對組成。元資料描述資料。它還包括校驗和和序列 ID 用於恢復識別。資料可以是 IO 資料和奇偶校驗資料。資料也經過校驗和。校驗和儲存在資料前面的元資料中。校驗和是一種最佳化,因為 MD 可以自由寫入元資料和資料,而無需擔心順序。MD 超級塊有一個欄位指向日誌頭的有效元資料。

日誌的實現非常簡單。困難的部分是 MD 將資料寫入快取磁碟和 RAID 磁碟的順序。具體來說,在直寫模式下,MD 計算 IO 資料的奇偶校驗,將 IO 資料和奇偶校驗都寫入日誌,在資料和奇偶校驗在日誌中穩定下來後,將資料和奇偶校驗寫入 RAID 磁碟,最後完成 IO。讀取就像往常一樣從 raid 磁碟讀取。

在回寫模式下,MD 將 IO 資料寫入日誌並報告 IO 完成。此時資料也完全快取在記憶體中,這意味著讀取必須查詢記憶體快取。如果滿足某些條件,MD 會將資料重新整理到 RAID 磁碟。MD 將計算資料的奇偶校驗並將奇偶校驗寫入日誌。完成後,MD 會將資料和奇偶校驗都寫入 RAID 磁碟,然後 MD 可以釋放記憶體快取。重新整理條件可能是條帶變成全條帶寫入,快取磁碟空間不足或核心記憶體快取空間不足。

在不乾淨的關機後,MD 會進行恢復。MD 從日誌中讀取所有元資料和資料。序列 ID 和校驗和將幫助我們檢測損壞的元資料和資料。如果 MD 找到一個包含資料和有效奇偶校驗的條帶(raid4/5 為 1 個奇偶校驗,raid6 為 2 個),MD 會將資料和奇偶校驗寫入 RAID 磁碟。如果奇偶校驗不完整,則會被丟棄。如果部分資料損壞,也會被丟棄。然後 MD 載入有效資料並以正常方式將它們寫入 RAID 磁碟。