Linux檔案系統 Btrfs 資料損毀 檔案系統

「無聲資料損毀」難防 Btrfs檔案系統來保護

2019-01-22
Btrfs是下一世代的Linux檔案系統,實際採用的案例越來越多,有必要加以理解,本文將先著墨於無聲資料損毀,再解說Btrfs檔案系統如何使用Data Checksum抵抗無聲資料損毀,以及對於損毀檔案的修復方式,也將介紹Synology怎樣在DSM中運用Btrfs來保護使用者資料的正確性。

在偵錯代價方面,以剛剛RAID-5的例子而言,如圖3所示,若要在每次讀取Disk A時都驗證資料的正確性,就必須同時將Disk B、C、D相對應的區塊也都讀起來,才有辦法做RAID-5同位元(Parity)的檢查。

 

▲圖3 隨機小檔案讀取加入同位元檢查,造成I/O放大的額外負擔。

如此一來,會造成隨機小檔案讀取時I/O放大的現象,尤其是硬碟數量多的情況下,所造成的額外讀取負擔會是原本想要讀取的原始資料的好幾倍,對效能的傷害非常大,因此在大多數情況下,RAID讀取時是不會特別去做同位元檢查。

而在定位錯誤方面,延續剛剛四顆硬碟RAID-5的例子,假設不辭辛勞真的把每顆硬碟的資料都讀起來比對(即RAID Data Scrubbing),當發現Parity不一致時,也無法確認到底誰是對的,誰是錯的。如圖4所描述,因為Disk B、C、D中任何一顆硬碟的資料跑掉都會造成Parity改變,如果在發現不一致時,總是假設Parity正確並去修復資料,越修越壞的可能性其實蠻大。

 

▲圖4 若有一個無聲資料損毀,且隨機發生在任一顆硬碟上,此時造成資料錯誤的機率是四分之一,造成Parity錯誤的機率是四分之三,結果當檢查出不一致時,不管以資料或以Parity當基準去修復,越修越壞的可能性都非常高。

以上這些限制與RAID是軟體式或硬體式無關,因為都是套用相同的邏輯,會碰到相同的問題。

Btrfs利用Checksum抵抗無聲資料損毀

從前面的說明可以了解,傳統RAID架構的Parity適合在錯誤已知的情況下修復錯誤,但不適用於主動偵測及定位錯誤。為了補足這個部分,通常會使用Checksum來驗證資料的正確性。因為Checksum本身相較於原始資料,長度相當短,又不必平均分散在所有硬碟中,所以在驗證Checksum時不容易有Parity碰到的I/O放大的問題。

事實上,在Linux系統中廣受歡迎的Ext4和XFS檔案系統,已經在後期的版本中將Metadata Checksum列為可選的功能。而在一些新一代的檔案系統例如ZFS與ReFS,則全面為Metadata和Data提供Checksum的能力。Btrfs即為Linux Kernel主線提供的檔案系統中,目前唯一同時提供Metadata及Data Checksum的檔案系統。

圖5為一個Btrfs檔案系統修復的範例,在每次讀檔或執行Btrfs Data Scrubbing時,除了讀取資料外,也會讀取相對應的Checksum來做比對。由於Btrfs本身即內建RAID管理多硬碟的能力,一旦比對發現資料與Checksum不一致,就會利用Btrfs RAID的Parity或Mirror,取得另一個版本的資料,並重新比對Checksum。只有當資料與Checksum比對一致,才會視為正確的資料版本,並在背景自動修復錯誤的地方。

 

▲圖5 Btrfs使用Checksum修復資料的流程。

另外,由於Checksum本身可以視為另一筆長度極短的資料,若不幸無聲資料損毀發生在Checksum本身(雖然機率極低),只要資料與Checksum比對不一致,一樣會觸發Btrfs RAID使用Parity或Mirror取得另一個版本的資料與Checksum,只有當資料和Checksum比對完全一致時才會真正做修復,不會有傳統RAID架構下,資料可能越修越壞的疑慮。而在Linux.com網站於2016年的一次訪談中,Btrfs的主要開發者Chris Mason也提到,Facebook確實曾成功利用Btrfs的Checksum能力找到其內部伺服器的硬體Bug。

Synology DSM與Btrfs Checksum的整合

接下來以Synology為例,說明如何運用Synology DSM整合Btrfs的Checksum能力來保護使用者免於無聲資料損毀的風險。以下分為幾個部分來介紹。

Btrfs與Linux RAID的整合

如前面所提及,Btrfs Checksum只提供偵錯和驗證的能力,實際修復資料時還是要仰賴Btrfs RAID的Parity或Mirror所提供的資料冗餘版本。但截至目前為止,Btrfs RAID的RAID 5/6部分,可靠度仍不足以使用在生產環境中。為此,Synology DSM並沒有使用Btrfs RAID,而是選擇成熟且廣泛使用的傳統Linux RAID(MD RAID),並將Btrfs Checksum與Linux RAID整合,使得Btrfs發現資料與Checksum不一致時,能夠利用Linux RAID的Parity或Mirror資料冗餘版本來嘗試修復。這部分的修改只有在Checksum驗證不一致時才會發揮作用,因此不會影響一般正常讀寫時的效能。

Synology Smart Data Scrubbing

雖然Btrfs在讀取時,能自動在背景偵測及修復損壞的資料,但這仰賴RAID的Parity或Mirror冗餘資料仍保留當初正確的版本。為了不讓錯誤惡化到無法修復,定期的Data Scrubbing掃描是必須的。如前面所提,在無聲損毀的情況下,由於單純的RAID架構無法分辨誰對誰錯,RAID Data Scrubbing僅能在假設資料為對的前提下,藉由重新寫入Parity將陣列中的硬碟修正到「一致」但不一定「正確」。假設使用者先執行了RAID Data Scrubbing且剛好有資料發生無聲損毀,RAID Data Scrubbing會將Parity修正到與資料一致,使得之後Btrfs驗證Checksum失敗時,沒有正確的Parity版本可供修復。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!