如何使用 mdadm 加快從 Raid 5 到 Raid 6 的遷移?
今天,我通過添加一個新磁碟(從 7 個磁碟到 8 個磁碟,全部為 3TB)開始將我的 Raid 5 遷移到 Raid 6。現在重塑正在進行中:
Personalities : [raid6] [raid5] [raid4] md0 : active raid6 sdi[9] sdh[8] sdf[7] sdc[6] sdd[4] sda[0] sde[5] sdb[1] 17581590528 blocks super 1.2 level 6, 512k chunk, algorithm 18 [8/7] [UUUUUUU_] [>....................] reshape = 2.3% (69393920/2930265088) finish=6697.7min speed=7118K/sec unused devices: <none>
但它慢得要命。距離完成還有將近 5 天。我用大約 1 天的時間來重塑陣列,但在這裡太可怕了。速度非常低。備份文件位於 SSD 上。
我確實更改了條帶大小以及最小和最大速度限制,但並沒有改變任何事情。
有什麼辦法可以加快過程到合理的時間,或者我必須等待 5 天才能完成?
更新:iostat -kx 10
avg-cpu: %user %nice %system %iowait %steal %idle 0.05 0.00 1.68 22.07 0.00 76.20 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 1675.90 1723.00 27.60 23.90 13875.20 6970.00 809.52 0.55 10.79 8.59 13.33 7.97 41.02 sdb 1675.90 1723.10 27.20 23.80 13670.40 6970.00 809.43 0.55 10.80 8.96 12.90 8.12 41.43 sdc 1675.90 1723.60 27.50 23.30 13824.00 6970.00 818.66 0.65 12.85 10.48 15.65 9.83 49.94 sdd 1675.90 1723.10 27.60 23.80 13875.20 6970.00 811.10 0.55 10.80 8.93 12.98 8.16 41.95 sde 1675.90 1723.10 27.20 23.80 13670.40 6970.00 809.43 0.60 11.79 9.17 14.79 9.19 46.87 sdf 1675.90 1723.80 27.70 23.10 13926.40 6970.00 822.69 0.72 14.28 11.65 17.43 10.12 51.40 sdg 0.00 4.10 0.00 93.20 0.00 39391.20 845.30 6.07 65.14 0.00 65.14 2.71 25.29 dm-0 0.00 0.00 0.00 4.30 0.00 18.40 8.56 0.00 0.07 0.00 0.07 0.02 0.01 dm-1 0.00 0.00 0.00 89.60 0.00 39372.80 878.86 6.07 67.78 0.00 67.78 2.82 25.28 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdh 1583.50 1631.70 216.50 115.90 13824.00 6970.00 125.11 1.56 4.73 5.36 3.55 0.43 14.41 sdi 0.00 1631.70 0.00 115.90 0.00 6970.00 120.28 0.21 1.77 0.00 1.77 0.28 3.25 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdi 是我最後添加的磁碟。sdg 是固態硬碟。dmX 是 LVM 上的分區。
在我看來,這與從 raid 5 到 raid 6 的 mdadm 遷移有關。我剛剛向陣列添加了一個新磁碟,並且對於我的硬體而言,增長速度是完全合理的(40000K/s)。
根據Neil Brown (的創建者)的這篇部落格文章,您可以通過以下方式避免由於的塊範圍備份過程而導致的速度損失:
mdadm
mdadm
- 增加 RAID 設備的數量(例如:從 4 磁碟 RAID5 重塑為 5 磁碟 RAID6)
mdadm --grow /dev/md0 --level=6 --raid-disk=5
- 不指定選項
--backup-file
他在部落格文章中詳細說明的原因是,當添加了另一個驅動器時,備份文件是不必要的。這是由於過程略有不同,因為在這種情況下,新舊佈局之間通常存在間隙,可用於備份在重塑期間正在操作的舊佈局數據。
他的文章摘錄更詳細地解釋了這一點:
級別更改的工作原理
如果我們認為“RAID5”比標准定義更通用一點,並允許它是跨多個設備條帶化數據和 1 個奇偶校驗塊的任何佈局,那麼我們可以將 RAID4 視為 RAID5 的一個特例. 然後我們可以想像從 RAID0 到 RAID5 的轉換需要兩個步驟。第一個使用 RAID4 佈局轉換為 RAID5,奇偶校驗磁碟作為最後一個磁碟。這顯然不需要重新定位任何數據,因此可以立即進行更改。它在 RAID4 佈局中創建了一個降級的 RAID5,因此它並不完整,但它顯然是朝著正確方向邁出的一步。我相信你可以看到接下來會發生什麼。在將 RAID0 轉換為具有不尋常佈局的降級 RAID5 後,我們將使用新的更改佈局功能轉換為真正的 RAID5。
這是一個非常相似的過程,現在可用於將 RAID5 轉換為 RAID6。我們首先將 RAID5 更改為具有非標準佈局的 RAID6,奇偶校驗塊正常分佈,但 Q 塊全部在最後一個設備(新設備)上。所以這是使用 RAID6 驅動程序的 RAID6,但具有非 RAID6 佈局。所以我們“簡單地”改變佈局,工作就完成了。
可以通過相反的過程將 RAID6 轉換為 RAID5。首先,我們將佈局更改為幾乎是 RAID5 但帶有額外 Q 磁碟的佈局。然後我們通過忘記 Q 磁碟轉換為真正的 RAID5。
重新分條數據的複雜性
在所有這些中,最混亂的部分是確保數據在崩潰或其他系統關閉時倖存下來。第一次重塑只允許增加設備數量,這很容易。在大多數情況下,設備在讀取舊佈局中的數據與寫入新佈局中的數據之間存在間隙。這個差距允許我們擁有該數據的兩個副本。如果我們在重構時禁用對一小部分的寫入,那麼在崩潰之後我們知道舊佈局仍然具有良好的數據,並且只需從我們記錄的地方重新佈局最後幾個條紋。
這不適用於前幾個條帶,因為它們需要在舊佈局上編寫新佈局。因此,在崩潰後,舊佈局可能已損壞,新佈局可能不完整。因此,mdadm 會注意對最初的幾個條帶進行備份,並且當它組裝仍處於重塑早期階段的陣列時,它首先從備份中恢復。
對於不改變設備數量的重塑,例如更改塊大小或佈局,每次寫入都將覆蓋相同數據的舊佈局,因此在崩潰後肯定會有一系列我們不知道是否它們處於舊佈局或新佈局或兩者兼而有之。因此,我們需要始終備份目前正在重塑的塊範圍。
這是 mdadm 3.1 中新功能中最複雜的部分(尚未發布,但可以在 git://neil.brown.name/mdadm 的 devel-3.1 分支中找到)。mdadm 監視重塑,設置它可以隨時進行多遠的上限,並確保允許重新排列的區域已禁用寫入並已備份。
這意味著所有數據都被複製兩次,一次復製到備份,一次復製到陣列上的新佈局。這顯然意味著這樣的重塑將非常緩慢。但這是我們必須為安全付出的代價。這就像保險一樣。您可能討厭必須支付它,但如果您不這樣做並且發現您需要它,您會更討厭它。