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