BTRFS- Multiple Device Support(多重設備支持)

Linux 有設備映射(DMs)子系統去管理存儲設備。舉個例子,LVM和mdadm,這些時軟件模型,主要功能是管理raw disks,合併他們到虛擬的連續的塊地址空間,並且將其抽象話到更高級別的內核層。他們支持鏡像,剝離和RAID5/6。無論如何,checksums是不支持的,這樣會導致BTRFS有一個問題。舉個例子,考慮一種情況,數據存儲在磁盤上是RAID-1的格式,每個4KB塊有一個額外的拷貝。 如果文件系統在一個拷貝上檢測到一個checksum的錯誤,它需要從其他拷貝恢復。DMs隱藏了虛擬地址空間抽象化背後的信息,並且返回其中一份拷貝。爲了規避這個問題,BTRFS做了自己的設備管理。它計算checksums,將他們存儲在一個單獨的樹中,然後更好的確定當媒介錯誤發生的時候合適恢復數據。

一臺機器可以被附加到多個存儲設備上;BTRFS分離每個設備到large chunks,經驗法則是chunk大約是一個設備尺寸的1%。

在寫的時刻, 1GB chunks 被用於數據, 256Mchunks用於元數據。

一個chunk tree 包含一個從邏輯chunks到物理chunks的映射。 一個device tree包含反向映射,文件系統剩餘部分可以看到有邏輯的chunks,所有的extent references 地址邏輯chunks。這個允許移動物理的chunks under the covers無需回溯和引用修復。 chunk/device trees 是很小的,並且典型的可以在內存中緩存。這個減少增加間接層的性能開銷。 

物理的chunks根據邏輯chunk的需要的RAID級別被分成組。對於鏡像,chunks被分成對。表1呈現了一個三個硬盤,兩個組的例子。舉個例子,邏輯chunk L1由C11 和 C21組成。 表2展示了一個硬盤比另外兩個大的情況。

表 1: 爲了支持RAID1邏輯chunks,物理chunks被分爲對。 三個磁盤,每個有兩個物理chunks,提供三個邏輯chunks. 邏輯chunk L1由物理chunks C11和C21組建。

表2: 一個大的磁盤,兩個小的磁盤,在一個RAID1配置。

對於條帶化,n chunks 的組被使用, 每個物理chunk在不同的磁盤上。舉個例子,表3展示了條帶寬度位4(n=4),四個磁盤,三個邏輯chunks的情況。

表3: n=4 每個邏輯chunks 由四個物理chunks組成。

 

在寫的時候,RAID 級別0,1和10是支持的。 額外的,有一些實驗的代碼來自於Intel支持RAID5/6。更高級的RAID的核心思想是去使用Reed-Solomon parity relationship的chunks group。舉個例子,表4展示了一個RAID6配置,邏輯chunks L1,2,3由雙重物理chunks組建。舉個例子,L1由{C11,C21,C31,C41},Chunks{C11,C12}保持數據清晰, C31=C21+C11,C41=Q(C21,C11),函數Q通過Reed-Solomon代碼定義這樣任何雙重的chunk失敗組合將可以被恢復。

表4: 一個RAID6的例子, 有四個磁盤{D1,D2,P,1}。每個邏輯chunk在每個硬盤上有一個物理chunk。舉個例子,L1的原始數據被條帶化在磁盤D1和D2中。C31是C11和C21的奇偶校驗。C41是C11和C12chunks的Q計算。

複製數據和存儲奇偶校驗數據對存儲系統來說是很消耗成本的。無論如何,它允許從許多媒介錯誤場景中恢復。最簡單的情況是RAID1, 每個塊都有一個鏡像的拷貝。當文件系統嘗試去讀取一個拷貝時,發現IO或者checksum錯誤,他會嘗試第二份拷貝。 如果第二份拷貝是有效的,然後他會返回給調用者。 額外的,第一份拷貝可以被有效的數據重寫。一個主動的方法,一個低強度的擦洗操作被持續性的運行在數據中,也是支持的。

邏輯chunks的RAID 配置是靈活的。一個單個的BTRFS存儲池可以有多種邏輯chunks在不同的RAID 級別中。這個會從低級別的可以來的和條帶化的機制中解耦高級的邏輯結構。這些對下面的操作很有用:

  1. 在飛速的,增長或者減少可靠性中改變RAID 級別

  2. 改變條帶寬度:更寬帶來更好的帶寬

  3. 給不同的子卷不同的RAID級別。也許一些子卷需要更高的可靠性,而其他在更小少可靠性的開銷下需要更多的性能

默認的行爲時使用RAID1給元數據,即使只有一個磁盤。這個給文件系統一個更好的機會在介質失敗的時候恢復。

在文件系統的週期中普通的操作發生是設備的添加和移除。 這個是支持的,通過一個常規的平衡算法嘗試去傳播分配均衡的在所有的磁盤上,即使當設備總體改變的時候。

舉個例子,表5(a) 系統有兩個磁盤在RAID1配置;每個磁盤有1/2的原始數據。然後一個新磁盤添加進來,看錶5(b),均衡代碼的目標是達到在表5(c)中的狀態,數據均衡的分佈在所有硬盤上,每個硬盤擁有1/3的數據。

表5:設備添加。 初始(a) 有兩塊盤。 狀態(b),另一個磁盤被添加,初始化位空。狀態c展示了目標:數據均衡分佈在所有磁盤上。物理chunks C12和C23被移動到硬盤3。

當一個設備被移除時,情況是相反的。從一個1/3比例(表5的c),系統移動回到1/2.如果有未使用的chunks在剩餘磁盤,然後再次平衡可以自動完成這個任務。無論如何,我們不會總是這麼幸運。如果數據在所有chunks之間傳播,然後嘗試去驅逐一個chunk需要遍歷整個文件系統,移動extents,修復references。這個域碎片整理是類似的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章