在将linux软件raid设备创建为raid10设备时,我很困惑为什么必须对其进行初始化。同样的问题也适用于raid1 或raid0,真的。
最终,大多数人会在其上放置某种文件系统,并且该文件系统不应假定磁盘数据的任何状态。每次写入都会影响 raid10 或 raid1 设置中的两个磁盘,其中 N 个镜像被写入其中。最初初始化 raid10 应该没有任何理由,因为它会随着时间的推移而发生。
我可以理解为什么对于有奇偶校验要求的 raid5/6 设置,但即便如此,这似乎也可以懒惰地完成。
只是为了让人们感觉更好吗?
Raid 1 作为一个镜像,依赖于镜像中的所有磁盘都是彼此的精确副本。拿你的随机硬盘和另一个随机硬盘,你可能有不同的数据,因此违反了这个假设。这就是需要初始化的原因。它只是将第一个驱动器的内容复制给其他驱动器。请注意,在某些情况下,您可以不初始化驱动器而侥幸 - 通常新出厂的设备已经到处都是零,因此您可以简单地忽略这一点。该
mdadm
选项--assume-clean
会执行此操作,但会警告您:如果您不这样做,则驱动器之间存在差异,并且已读取,不知道驱动器将读取什么。使用文件系统应该很安全(但请注意下面),因为很可能您会在从该设备读取任何内容之前进行编写,然后您就清楚了。
请注意,至少 Linux
mdadm
会在后台初始化数组。您可以在第一秒愉快地在其上创建 FS。在初始化完成之前,性能会受到影响,但仅此而已。但:
a) 在做
mkfs
一些实用程序时,检查该驱动器上是否已经有东西。虽然这只涉及驱动器的几个知名区域,但它会在您写入任何内容之前读取,从而使您处于危险之中。b) 如果您对阵列进行定期重新同步,RAID 设备对您的 FS 一无所知。它只是从每个设备中读取每个块并进行比较。而且,如果您没有使用写时复制 FS(例如 ZFS 或 BTRFS)并且从不填满您的 FS,那么从 FS 的角度来看,块保持未初始化多年是完全合理的。
为什么要与 RAID1 设备重新同步?
出于同样的原因,您与 RAID5 设备或任何其他级别(RAID0 除外)重新同步。它读取所有数据并比较/验证 RAID 校验和(在 RAID 5 或 6 中)。如果有一点被以任何方式翻转(因为 HD 内存自发翻转,因为你和你的 5 个邻居的手机只是不小心干扰了这个特定的盘片区域,无论如何)它会检测到不一致,但不能帮你。如果,OTOH,其中一个硬盘驱动器将简单地报告“我无法读取该块”,这更有可能是驱动器故障,您只是早期检测到故障,并减少了您在降级模式下运行的时间(从驱动器故障,而不是从您注意到它时开始)。如果一个驱动器出现故障,Raid 将无济于事,一个月后,如果您不这样做,另一个驱动器将出现故障
RAID10
现在,对于 RAID10,上述所有条件都成立。毕竟 RAID10 只是一种巧妙的方式来告诉“我将我的两个 RAID1 设备放在一个 RAID0 对中”。
警告:
这都是未定义的行为。为什么我在 Linux 上进行了检查,使用
mdadm
其他软件 RAID 实现的行为可能会有所不同。我使用的其他版本的 Linux 内核和/或mdadm
工具也可能表现不同。请记住,RAID 1 是镜像,而 RAID 10 是镜像条带。
问题是,每个镜像中的哪个磁盘上的数据有效?在新创建的阵列中,这是未知的,因为磁盘可能有不同的数据。
还要记住 RAID 在非常低的级别上运行;它对文件系统或磁盘上可能存储的任何数据一无所知。甚至可能没有文件系统在使用。
因此,这些阵列中的初始化包括将每个镜像中一个磁盘的数据按原样复制到另一个磁盘。
这也意味着数组从创建的那一刻起就可以安全使用,并且可以在后台进行初始化;大多数 RAID 控制器(和 Linux mdraid)都有这个选项,或者自动执行。
需要初始同步,因为镜像之间的任何差异都会在定期检查期间显示为错误。
你应该定期检查。
简单地说,因为从一开始就不期望两个新磁盘成为彼此的完美镜像副本。
他们需要变成彼此的完美副本。
此外,初始化还包括使用有关阵列配置的信息来设置元数据超级块。
/proc/mdstat 文件应该告诉您设备已经启动,镜像正在重建,以及重建完成的 ETA。使用空闲 I/O 带宽完成重建。因此,您的系统应该仍然可以响应,尽管您的磁盘 LED 也会显示大量活动。
重建过程是透明的,因此即使镜像当前正在重建中,您也可以实际使用该设备。
如果您使用 Linux LVM 创建一个 RAID 1(或 10)文件系统,您将立即加载数据,以下是您可以避免许多不必要的初始化 I/O 的方法。
首先创建一个普通的线性(非 RAID)文件系统并用您的数据加载它。然后使用lvconvert将其转换为 RAID 文件系统。镜像设备将使用您已加载的文件系统数据进行初始化,因此唯一“不必要的”I/O 将是复制已加载文件系统中未分配的块时。这比首先将每个块从一个未初始化的设备复制到另一个设备然后将数据写入两个设备要好。通过序列化这两个操作(加载文件系统,然后创建镜像),您还将允许磁盘执行顺序 I/O,这比写入仍在初始化的 RAID 镜像对时发生的随机搜索要快得多。