为什么RAID 10设备需要初始化?


9

当创建一个Linux软件RAID设备作为raid10设备时,我很困惑为什么必须对其进行初始化。确实,同样的问题适用于raid1或raid0。

最终,大多数人会在其之上放置某种文件系统,并且该文件系统不应假定磁盘数据处于任何状态。每次写入都会影响在其中写入了N个镜像的raid10或raid1设置中的两个磁盘。最初没有任何理由可以初始化raid10,因为它会随着时间的流逝而发生。

我可以理解为什么要对raid5 / 6设置有奇偶校验的要求,但是即使如此,这似乎也可能是懒惰的。

只是让人们对此感到更好吗?


1
好问题。创建RAID时可以跳过同步,并且在一个或多个底层设备为SSD的情况下,我遇到了这样做的建议。我不知道是否存在需要同步才能进行正确操作的方案。
卡巴斯德(Kasperd)

Answers:


2

需要初始同步,因为镜像之间的任何差异都将在定期检查期间显示为错误。

而且您应该进行定期检查。


1
我可以看到为什么定期检查数据的可读性会很有用。但是,定期检查副本是否相同有什么好处?如果由对数据进行校验和的文件系统执行,则此类检查会很有用。但是,在没有文件系统知识的RAID层上,您无法知道两个不同副本中的哪个副本是好的,您首先不知道差异是如何发生的,也不知道哪个文件(如果有)受到影响。因此看来,有关此层不一致的警报几乎没有用,因为管理员无论如何都无法处理警报。
卡巴斯德(Kasperd)'16

由于您仍然需要读取数据,因此比较数据的成本很小,但是它可以显示出其中一个磁盘出现了其他无法检测到的问题(例如,驱动器自己的缓存中的RAM损坏)。然后,管理员将分解阵列,手动查看差异并选择要替换的驱动器。
西蒙·里希特

然后,您应该在答案中对此进行扩展。
卡巴斯德(Kasperd)'16

我知道已经有很多年了,但这是我能看到的唯一正当理由。如果数据不同步,我认为这并不重要,因为根据定义,该数据尚未写入,因此应用于RAID驱动器的文件系统将永远不会从这些块中读取数据。但是,要确保从一开始就通过定期检查,就必须这样做。谢谢!
迈克尔·格拉夫

7

RAID 1是镜像,它依赖于镜像中的所有磁盘是彼此的精确副本。拿起您的随机硬盘驱动器和另一个随机硬盘驱动器,您那里可能有不同的数据,因此违反了这一假设。这就是为什么需要初始化。它只是将第一个驱动器的内容复制到其他驱动器。请注意,在某些情况下,无需初始化驱动器就可以摆脱麻烦-通常,崭新的设备在各处都已经有零,因此您可以简单地忽略它。该mdadm选项会--assume-clean执行此操作,但会警告您:

   --assume-clean

告诉mdadm该数组已存在并且已知是干净的。当您尝试从主要故障中恢复时,它很有用,因为可以确保除非实际写入阵列,否则不会影响任何数据。如果要避免初始重新同步,也可以在创建RAID1或RAID10时使用它,但是不建议这种做法(通常是安全的)。仅当您真正知道自己在做什么时才使用此功能。

如果不这样做,则驱动器之间会存在差异,并且读取驱动器时,将不知道驱动器将读取什么内容。您应该对文件系统非常安全(但请注意以下内容),因为很可能您会在从该设备读取任何内容之前先进行写操作,然后您就可以了。

请注意,至少Linux mdadm会在后台初始化数组。您可以在第一秒钟的基础上愉快地创建FS。在初始化完成之前,性能将受到影响,但这就是全部。

但:

a)在执行mkfs一些实用程序时,检查该驱动器上是否已经有东西。虽然它仅接触驱动器的几个著名区域,但在您写任何东西之前它都会先读取,从而使您处于危险之中。

b)如果您定期对阵列进行重新同步,则RAID设备对您的FS一无所知。它只是从每个设备读取每个块并进行比较。而且,如果您不使用写时复制FS(例如ZFS或BTRFS)并且从不填充FS,那么从FS角度来看,多年不进行初始化仍是完全合理的。

为什么要与RAID1设备重新同步?

出于相同的原因,您与RAID5设备或任何其他级别(RAID0除外)重新同步。它读取所有数据并比较/验证RAID校验和(在RAID 5或6中)。如果以任何方式翻转一点(因为HD内存自发翻转,因为您和您的5个邻居的手机只是偶然干扰了这个特定的盘子区域,无论如何),它将检测到不一致,但是将无法检测到帮你。如果OTOH,其中一个硬盘驱动器仅报告“我无法读取该块”,而驱动器发生故障的可能性更大,则您只是较早地检测到故障,并减少了在降级模式下运行的时间(从驱动器故障,而不是从您注意到时开始)。如果一个驱动器出现故障,RAID将无法为您提供帮助;一个月后,如果您没有,RAID将无法为您提供帮助

RAID10

现在,对于RAID10,以上所有条件均成立。毕竟,RAID10只是告诉“我将两个RAID1设备放入一个RAID0对中”的聪明方法。

警告:

这都是不确定的行为。为什么我在Linux上使用进行过检查mdadm,其他软件RAID的实现可能会有所不同。mdadm我正在使用的其他版本的Linux内核和/或工具的行为也可能有所不同。


1
请提供的引用If you don't do it, there is a discrepancy between the drives and it's read, the RAID device will report failure of a drive。我认为那句话是不正确的。至少提供错误消息的示例,以便可以咨询源以验证在什么情况下会产生错误消息。
卡巴斯德(Kasperd)'16

1
这样更好 您是否验证了有关写零的声明?我认为它不会写零,而是将其中一个磁盘复制到其他磁盘。
卡巴斯德(Kasperd)'16

1
While this only touches a few well-known regions of drive, it reads before you write anything, thus putting you in danger.有什么危险?我意识到读取可能会导致任何结果,但是如果(a)所读取的信息未在任何地方使用并且(b)即将发生写操作,那会对用户造成某种危险?
Vegard

1
@kasperd,您是对的,它将第一台设备复制到第二台设备。在urandomlinux mdadm 上的初始化设备上进行的测试显示,前80k保持不变,最后48k保持不变。后者可能是由于RAID大小四舍五入到块大小。我没有用不同的设备大小进行测试,但是80 + 48恰好是RAID设备和基础块设备之间的大小差异。
Torinthiel '16

1
要考虑的一件事是,通常在初始化期间,raid系统将始终读取磁盘A并将其复制到磁盘B。为什么?由于可以在磁盘初始化时使用它,因此可能已在块100,000写入了数据。一旦突袭初始化到达该块,A和B就已经相同,因此什么也没有发生。如果它是归零块,它将擦除良好的数据。因此,我再次看到确保块相同的两个原因:“总是完成”和“以便以后可以运行检查” –我也质疑检查的用处。读书不错,比较吗?不确定。
Michael Graff

5

请记住,RAID 1是一个镜像,RAID 10是一个镜像条带。

问题是,每个镜像在哪个磁盘上有效?在新创建的阵列中,这是未知的,因为磁盘可能具有不同的数据。

还请记住,RAID的运行级别非常低。它不知道文件系统或磁盘上可能存储的任何数据。有可能甚至在使用一个文件系统。

因此,这些阵列中的初始化由来自每个镜像中一个磁盘的数据按原样复制到另一磁盘组成。

这也意味着从创建开始就可以安全使用数组,并且可以在后台对其进行初始化。大多数RAID控制器(和Linux mdraid)都有为此选择的选项,也可以自动选择。


评论不作进一步讨论;此对话已转移至聊天
迈克尔·汉普顿

1

简而言之,因为从一开始就不希望两个新磁盘成为彼此的镜像完美副本。

它们需要变成彼此的完美副本。

另外,初始化还包括使用有关阵列配置的信息来设置元数据超级块。

/ proc / mdstat文件应告诉您设备已启动,正在重建镜像以及完成重建的ETA。使用空闲的I / O带宽进行重建。因此,尽管您的磁盘LED也将显示很多活动,但是您的系统仍应具有响应能力。

重建过程是透明的,因此即使当前正在重建镜像,您也可以实际使用该设备。


2
但是为什么它们需要彼此完美复制?在文件系统从未使用过的扇区中,这两个不一致会导致什么破裂?
kasperd '16

@kasperd RAID的实施级别低于任何文件系统。因此,问题就变成了您所指的“文件系统”是什么。
Taemyr '16

@Taemyr我不是在指任何特定的文件系统。选择您喜欢的任何一个,并说明在初始化文件系统之前在副本未同步的RAID-1上使用它会破坏什么。
卡巴斯德(Kasperd),2016年

@kasperd在RAID操作级别没有文件系统可以中断。
Taemyr

1
就我而言,作为原始发布者,我不在乎什么文件系统。我知道没有文件系统可以读取从未写入的扇区,因此这些未写入扇区的任何不确定状态都无关紧要。
Michael Graff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.