如果我构建了一个 RAID 5 阵列(特别是 Linux 上的 MD RAID),然后其中一个驱动器由于某种原因断开连接,如果出现以下情况,是否需要从头重建该驱动器:
- 尚未将数据写入阵列。
- 一些数据已写入数组。
我所说的“删除”是指重建完整数据,而不是重建自驱动器上次上线以来的差异数据。
答案1
那要看情况。
当您将驱动器从 RAID 5 阵列断开时,一旦将驱动器重新置于在线状态,就需要重建完整的阵列。系统无法知道该驱动器是否仍具有与离线前相同的数据。
我的意思是,当驱动器离线时,其数据可能会被其他方式修改。而当驱动器重新在线时“信任”它可能会对数据一致性造成灾难。
您可以启用写意图位图或日志模式的数据一致性。有关此内容,请参阅 mdadm 的 --bitmap 和 --consistency-policy 选项。但我猜想,这绝不保证在实际移除并重新连接驱动器后不会进行完全重建。例如,如果您将热备用添加到阵列,它将在您移除驱动器后立即开始将阵列重建为热备用。
答案2
这正是写入意图位图解决的问题。创建数组时,--bitmap=internal
在命令行上指定。位图记录数组的某个区域是否已被写入。根据数组的大小,例如,一个位可能是 1 GiB。
在正常操作期间,内核在写入区域之前将位设置为 1。然后,一旦它知道所有写入都已刷新到某个区域,它就会将该位清零。如果阵列中的某个驱动器发生故障,导致阵列降级,则位只会开始累积 1。它们不会被清除。
当您将驱动器重新添加到阵列中时,md 仅根据位图同步已写入的区域。
您可以使用 将位图添加到现有数组--grow --bitmap=internal
。