![如何使用 mdadm 加速从 Raid 5 迁移到 Raid 6?](https://linux22.com/image/40415/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20mdadm%20%E5%8A%A0%E9%80%9F%E4%BB%8E%20Raid%205%20%E8%BF%81%E7%A7%BB%E5%88%B0%20Raid%206%EF%BC%9F.png)
今天,我通过添加新磁盘(从 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 是 SSD。 dmX 是 LVM 上的分区。
答案1
根据尼尔·布朗的这篇博文(这的创造者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 监视重塑,设置其随时可以进行的上限,并确保允许重新排列的区域已禁用写入并已备份。
这意味着所有数据都会复制两次,一次复制到备份,一次复制到阵列上的新布局。这显然意味着这样的重塑将会非常缓慢。但这就是我们为了安全而必须付出的代价。这就像保险一样。你可能讨厌必须付钱,但如果你不付钱并且发现你需要它,你会更讨厌它。
答案2
在我看来,这与 mdadm 从 raid 5 迁移到 raid 6 有关。我刚刚向阵列添加了一个新磁盘,并且增长速度对于我的硬件来说是完全合理的(40000K/s)。