磁盘驱动器可以说是最容易发生故障的计算机组件。
RAID系统在驱动器之间分割数据以提高性能和/或可靠性。
磁盘驱动器可以说是最容易发生故障的计算机组件。如果你是一个不喜欢系统故障的怪人,你可能希望在磁盘中有某种冗余。实现这一点的通常方法是使用RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)。I 曾经的意思是便宜(Inexpensive),但你可以在磁盘上花很多钱。一个100 TB(terabyte)的RAID阵列的成本远低于一个1 PB(petabyte)的磁盘,但仍然相当昂贵。RAID系统在驱动器之间分割数据以提高性能和/或可靠性。
第九章:GEOM阵列硬件 vs 软件 RAIDRAID 硬件FreeBSD GEOM RAID 对比 ZFSGPT 对比 GEOM RAIDRAID 要素GEOM RAID 和磁盘大小新RAID和已有数据奇偶检验(parity)条带尺寸RAID 类型GEOM RAID 命令驱动器示例RAID-0: 条带化磁盘创建条带提供者修复条带geom销毁条带磁盘条带状态报告镜像磁盘创建镜像修复镜像三路镜像销毁镜像日常状态检查RAID-5创建 RAID-5修复 RAID-5销毁 RAID-5RAID-10创建 RAID-10Raid-10 状态修复RAID-10销毁RAID-10RAID 0+1其他RAID级别SATA RAID: graid(8)大纲介绍labeladddeleteinsertremovefailstop其余四项支持的元数据格式DDFIntelJMicronNVIDIAPromissSiI支持的RAID级别RAID级别迁移2TiB屏障sysctl变量退出状态
所有RAID都是在软件中完成的。
所谓“硬件RAID”是由RAID控制器内的软件管理的,而不是由操作系统管理的。
有些RAID控制器实际上运行的是具有特定于供应商的RAID代码的完整BSD操作系统。
硬件RAID更像是“由黑匣子软件完成的RAID”,而不是任何神奇的高级产品。
不同的硬件RAID控制器以不同的格式在磁盘上存储数据。如果你的RAID控制器坏了,你不能用任何RAID控制器来替换它——新型号可能无法识别磁盘上的数据。
发生故障时,出色的备份远比相同或兼容的控制器、相同品牌和型号的备用控制器更可靠。
注意,许多RAID控制器不能充当哑磁盘控制器(dumb disk controller,应该是说直通控制器,或透明控制器)。当我们需要一个普通磁盘(JBOD——just a bunch of disks)时,它会将每个磁盘做成一个专有格式的单磁盘RAID阵列提供给我们。
操作系统管理软RAID。软RAID比硬RAID消耗更多的系统处理器时间和内存,但负载在现代硬件上无关紧要。将用于购买RAID卡的资金投入到更强的CPU或内存上,会更划算。而且可以避免由于RAID故障带来的风险(比如无法找到相同的替代品)。
硬RAID通常会有一个交互式界面或菜单驱动的BIOS界面来管理RAID。软RAID通常没有此类菜单,它需要你真正知道自己在做什么。
硬RAID通常会有免责条款以推脱责任。
FreeBSD有许多硬RAID卡的命令行管理程序,需要查看手册页或硬件支持列表确定是否支持你的阵列卡。
软RAID的一个弱点是,大多数硬件无法从比镜像更复杂的任何软件RAID分区启动。如果你想从RAID-5阵列启动,那你需要硬RAID。
FreeBSD软件RAID的另一个问题是,它与备份GPT分区表冲突。
大多数情况下,建议使用FreeBSD的软RAID。
所有RAID都是在软件中完成的。供应商所说的“硬件RAID”是由RAID控制器内的软件而不是操作系统管理的。其中一些RAID控制器实际上运行的是具有特定于供应商的RAID代码的完整BSD操作系统。硬件RAID更像是“由黑匣子软件完成的RAID”,而不是任何神奇的高级产品,而且只有控制器制造商提供的代码才好。
不同的硬件RAID控制器以不同的格式在磁盘上存储数据。如果你的RAID控制器坏了,你不能用任何RAID控制器来替换它——新型号可能无法识别磁盘上的数据。如果将关键数据存储在硬件RAID阵列上,则必须有一份支持协议,在发生故障时为您提供相同或兼容的控制器、相同品牌和型号的备用控制器和/或出色的备份。我推荐这三个。
请注意,许多RAID控制器不能充当哑磁盘控制器。我有几个 mfi(4) RAID卡。我想将它们用作FreeBSD管理的RAID阵列的普通SATA控制器。当我告诉其中一张卡给我一个普通磁盘(或JBOD,“just a bunch of disks,只是一堆磁盘”)的磁盘时,它会给我每个磁盘一个专有格式的单磁盘RAID“阵列”。
【那时,我翻唱平克·弗洛伊德的《小心那把斧头,尤金》,并考虑改我的名字。】——Point Me at the Sky/Careful with That Axe, Eugene,平克弗洛伊德的唱片,发表于1968年12月7日。
您的操作系统管理软件RAID。操作系统找出如何排列磁盘上的数据。软件RAID比硬件RAID消耗更多的系统处理器时间和内存,但负载在现代硬件上无关紧要。将您在RAID卡上花费的一小部分钱投资于稍强的处理器和更多的内存。当专有RAID控制器发生故障并且找不到相同的替代品时,您也不会有丢失阵列上数据的风险。
硬件RAID通常比软件RAID更易于管理。你会得到一本手册。你读了它。你按照指示去做。RAID控制器通常有一个菜单驱动的BIOS或点击式软件,可以让您管理虚拟磁盘并恢复损坏的磁盘。
软件RAID没有菜单。它要求你真正知道自己在做什么。
硬件RAID比软件RAID提供了更合理的否认能力。你找人起诉,但许可协议说你不会起诉。(你知道,许可协议?你打开控制器时扔掉的那张纸条?)
许多硬件RAID卡都有在FreeBSD上运行的命令行管理程序。要查看FreeBSD是否支持特定卡的软件,请查看手册页或邮件列表存档。
软件RAID的一个弱点是,大多数硬件无法从比镜像更复杂的任何软件RAID分区启动。如果你想从RAID-5阵列启动,你需要硬件RAID。
FreeBSD软件RAID的另一个问题是它与备份GPT分区表冲突。我将在本章稍后讨论这个问题。
最终,所有RAID都是软件RAID。我更喜欢使用可信的开源供应商的代码。在大多数情况下,我建议使用FreeBSD的软件RAID,尽管它有缺点。
尽量在RAID中使用不同品牌、不同型号、不同批次的硬盘,以避免同批次批量故障。
【但要注意,不同品牌的磁盘即使标称容量相同,而实际容量也可能会稍有不同。】
电源不足也会损坏磁盘,尽量使用多电源。
尽量广泛分离驱动器,让它们位于不同的控制器上。
如果您想要真正的高可用性,请从各种供应商那里购买磁盘,并使其具有各种型号。如果制造厂的某个人在运行一批4TB Blue Zeppelin驱动器(或他们称之为该型号的任何型号)时度过了糟糕的一天,你不希望从该批中获得几个磁盘。电源不足造成的磁盘损坏数量令人惊讶,因此多个电源是一个好主意。使用单独的控制器甚至不同的SCSI托架,尽可能广泛地分离驱动器。
FreeBSD通过GEOM支持许多常见的RAID类型,它还支持通过ZFS进行各种类型的raid。
严格来说,ZFS提供的容错并不是RAID。它是卷管理器和RAID的特定结合。
如果ZFS能满足需求,就用ZFS。
GEOM的全部意义在于你负责(you are in charge)。FreeBSD提供的是工具,而不是政策。
FreeBSD通过GEOM支持许多常见类型的RAID。它还支持通过ZFS进行各种类型的raid。为什么有这两种类型,你什么时候会使用哪一种?
严格来说,ZFS提供的RAID-Z、RAID-Z2和RAID-Z3不是RAID。它们是卷管理器和RAID的特定组合。如果他们满足你的需求,太好了!使用它们并微笑。但ZFS假设您将以符合ZFS期望的方式安排工作量。系统管理员并不总是拥有这种特权。我在第0章讨论了GEOM和卷管理器之间的区别。那里的一切都适用于ZFS。
GEOM的全部意义在于你负责。如果你需要RAID-10、RAID-Z3或RAID-33,那很好。FreeBSD提供的是工具,而不是政策(policy)。你有足够的外部力量对你施加政策,你不需要你的操作系统限制你如何安排你的存储。
如果直接RAID磁盘,会覆盖备份GPT表。如果主分区表和备份分区表不匹配,GPT会认为其分区表已损坏。
xxxxxxxxxx# gpart show da0=> 40 1953525088 da0 GPT (932G) [CORRUPT]40 1953525088 - free - (932G)分区表的现有分区副本实际上没有损坏。GPT只看到一个分区表。你必须决定如何处理这些冲突。
一种选择是接受警告并继续前进。你在磁盘前面有一个有效的分区表副本,RAID冗余应该处理任何错误。
另一种选择是将GPT分区作为软RAID geoms的提供者。这适用于许多情况,但如果这是一个镜像引导驱动器,则必须以某种方式在磁盘上安装引导加载程序,这需要一个分区。我们将在第11章介绍如何安装到启动镜像驱动器。)
磁盘大小、条带大小、奇偶检验。
使用GEOM RAID时,所有磁盘的大小必须相同,或者至少每个磁盘上的空间量必须相同。假设RAID阵列中有一组10个4TB的驱动器,其中一个驱动器出现故障。你能找到的最小的替换驱动器是6TB。你可以使用此驱动器,但只能使用4TB的替换驱动器,这会浪费额外的2TB。是的,你可以在2TB上放置一个分区,但每次有任何东西碰到它,你的整个阵列都会变慢。实际上,2TB的空间现在是多余的。
【不要试图在这2TB的空间上创建分区,对这个分区的任何操作都会拖慢整个阵列】
在每个磁盘上创建一个分区,用于FreeBSD RAID。看看每个分区的大小。即使标签上的磁盘大小相同,其大小也可能略有不同。不同制造商的驱动器可能大或小几兆字节。将RAID分区设置为最小驱动器上可以容纳的最大分区的大小。
在旧版本的FreeBSD中,可以将FreeBSD安装到单个磁盘上,然后创建镜像。在较新版本中,这很难实现。最好假设向RAID阵列添加磁盘会擦除该磁盘上的所有数据。
在对活动磁盘进行镜像之前,应备份数据。那为啥不直接备份,然后正确构建新阵列呢?
始终先创建RAID卷,然后再将数据放在磁盘上。
奇偶检验是一种非常简单的校验和,用于确保数据被正确复制。RAID设备使用奇偶检验进行错误检测,从而可以评估磁盘部分的状态。这使磁盘阵列能够提供冗余。RAID系统必须将磁盘空间专用于奇偶校验。它们透明地执行,这就是为什么在使用某些RAID时会丢失空间的原因。
条带大小是指在一次传输中写入单个驱动器上的文件块的大小。最常见的条带大小为128KB。例如一个512KB的文件会被分成4个条带,分散存储在磁盘上。
如果你研究条带尺寸,你会发现一些论文声称,由于各种原因,某些条带尺寸天生更好。对于特定的工作负载,这些论点甚至可能是正确的。在生产环境中更改条带大小之前,请在测试环境中尝试各种大小。如果你的条带大小不是磁盘扇区大小的偶数倍,你的性能就会直线下降。
每次我参与定制条带尺寸时,我要么后悔,要么给别人理由后悔。
这本书使用128KB的条带。这是一个很好的平均值,适用于大多数工作负载。
RAID有几种类型,用数字标识。常见的是RAID-0、RAID-1和RAID-5。FreeBSD也支持RAID-3,并且可以将这些RAID类型组合成RAID-10,以及RAID-50和RAID0+1等更奇特的RAID。
RAID-0或称条带(striping)。
没有冗余,实际上也不是RAID。
它至少需要两个磁盘。它将所有驱动器一起转储到一个存储池中,创建一个空间等于所有磁盘总和的分区。
任何一个磁盘的故障都会破坏整个阵列。如果你想再次看到它,你必须从备份中恢复数据。
如果您需要一个非常大的文件系统,RAID-0非常有用,但它没有提供可靠性优势,实际上是最容易受到攻击的数据存储方法之一。
FreeBSD使用 gstripe(8) 命令管理RAID-0。
RAID-1或称镜像(mirroring)。 一个磁盘上的内容立即复制到另一个磁盘上。
mirrors 是实现低成本可靠性的好方法。我镜像我的个人服务器。镜像甚至可以为台式机提供一定程度的数据保护,只要它有两个硬盘。
RAID-1阵列的大小是阵列中最小驱动器的大小。
FreeBSD对RAID-1使用 gmirror(8) 。
RAID-3或称带专用奇偶校验磁盘的条带化(striping with a dedicated parity disk)。
使用备用硬盘来存储整个阵列的奇偶校验和完整性数据。这意味着任何一个硬盘驱动器的故障都不会导致数据丢失。
必须有奇数个硬盘,且不少于三个。
RAID-3一次只能处理一个I/O请求。对于某些应用,使用专用奇偶校验驱动器可以产生更高的吞吐量。如果一次保存或加载一个大文件,可以认真考虑RAID-3。
RAID-3阵列的大小是除一个硬盘驱动器外的所有硬盘驱动器总和。
FreeBSD使用 graid3(8) 命令管理RAID-3。
RAID-5或称跨所有驱动器共享奇偶校验的条带化(striping with parity shared across all drives)。
RAID-5在技术上不如RAID-3,但赢得了人们的关注。
与RAID-3一样,RAID-5使用奇偶校验数据来提供数据冗余,因此单个驱动器的丢失不会破坏任何数据。
与RAID-3不同,奇偶校验空间在所有驱动器之间分配,因此它可以支持任意数量的3个或更多硬盘驱动器。
RAID-5阵列的性能一般,但可以同时处理多个I/O请求。
RAID-5阵列是除一个硬盘驱动器外的所有硬盘驱动器的组合大小。
sysutils/graid5 port用于管理RAID-5。
RAID-10是一个镜像磁盘条带。
需要2的倍数个磁盘,最少4个。以及(为了完全冗余)两个单独的磁盘控制器。
磁盘在镜像中配对,然后数据在镜像中条带化。
系统不计算奇偶校验,因此这是可以获得的性能最快的高可用性磁盘系统。
阵列的大小是硬盘总空间的一半。
FreeBSD使用 gstripe(8) 和 gmirror(8) 管理RAID-10。
FreeBSD GEOM RAID工具支持常用的GEOM命令,如 gmirror show ,但也有用于RAID特定任务的命令。
load 命令加载内核模块。例如,graid3 load 加载 geom_raid3.ko 模块到内核中。同理,unload 命令可以将该模块从内核中移除。
label 命令创建RAID geom。记住,GEOM探测磁盘该如何配置。RAID标签是一段磁盘上的元数据,上面写着“此磁盘是geom honketeyblatt 的一部分”。
status 命令列出该类型RAID设备的状态,例如:
xxxxxxxxxx# gmirror statusName Status Componentsmirror/gm0 COMPLETE da1p1 (ACTIVE)da2p1 (ACTIVE)输出格式因各种RAID命令而异,但一般来说COMPLETE意味着阵列状态良好。
list 命令现实特定GEOM类型的各种提供者和使用者。
stop 命令关闭GEOM类。
某些类还会有 destroy 命令,表示删除所有成员的元数据。
本章中的所有GEOM RAID示例都使用1TB驱动器。每个驱动器使用GPT分区方案,并具有单个磁盘分区。除非另有说明,一般都是这样创建的:
xxxxxxxxxx# gpart create –s gpt da0# gpart add –t freebsd-ufs –a 4k da0这些磁盘的型号不同,来自不同的供应商,使用 gpart show 命令验证分区大小是否相同。
建议对每个驱动器附加一个GPT标签,并使用该标签而不是原始的设备名称。我这样做不是因为我想要简短、易读的例子。
条带化磁盘允许您将多个硬盘驱动器组合成一个大型虚拟硬盘驱动器。条带在所有驱动器之间共享事务,理论上可以提高性能和吞吐量。性能很少达到两个驱动器的总和,但它应该很容易超过一个单独驱动器的性能。使用 gstready(8) 配置和管理磁盘条带化。
首先,使用 kldload(8)或 gstripe-load 加载 geom_stripe.ko 内核模块。如果您希望RAID-0在启动时可用,请在 /boot/loader.conf 中加载该模块。
使用 gstripe label 命令创建条带提供者并告诉驱动器它们在其中。下面我们创建一个名为 Stripe1 的条带驱动器。此条带包含所有四个示例驱动器。使用 -s 选项指定条带大小。如果你想让 gstripe 更详细,可以添加 -v 。
xxxxxxxxxx# gstripe label -s 128kb Stripe1 da0p1 da1p1 da2p1我现在有一个条带提供者 /dev/stripe/Stripe1 。这个虚拟磁盘不需要分区,但如果你想的话,你可以这样做。如果目标是创建一个大分区,请在设备上放置一个文件系统。不要忘记使用 –j 表示软更新日志(soft updates journaling)。
xxxxxxxxxx# newfs –j /dev/stripe/Stripe1如果你仔细观察 newfs(8) 的输出,你会发现它找到了气缸组,这意味着它找到了汽缸和气缸盖。底层磁盘不需要大小相同,更不用说具有共同的几何图形(geometry)。这可以消除对老式硬盘几何结构的任何疑虑。
如果要分区,可将GPT分区表添加到条带化设备中:
xxxxxxxxxx# gpart create -s gpt /dev/stripe/Stripe1stripe/Stripe1 created现在可以向条带磁盘中添加分区了。
条带geom无法修复。
更换坏掉的磁盘,重建阵列,然后从备份中恢复。
你没读过RAID-0的描述吗?如果条带化提供者中的任何磁盘发生故障,则无法恢复该磁盘。提供者丢失所有数据。更换磁盘,销毁并重建设备,重新创建文件系统,然后从备份中恢复。
如果要删除条带化分区并在其他地方重复使用磁盘,请卸载条带化设备。在每个成员设备上运行 gstripe clear 命令:
xxxxxxxxxx# gstripe clear da0p1 da1p1 da2p1现在可以卸载内核模块了。
FreeBSD可以在其日志状态电子邮件中包含条带设备的状态。向 /etc/periodic.conf 文件中添加 daily_status_gstripe_enable=YES 启用报告。
镜像磁盘在多个物理设备上维护多个数据副本。如果您的一台物理设备发生故障,另一台设备上的数据仍然可用。虽然镜像传统上包括两个磁盘,但您可以将任意数量的磁盘放入镜像中。最好的镜像在物理上尽可能分开:多个磁盘,在不同的磁盘控制器上,甚至可能在不同的机柜中。
镜像磁盘会在每个磁盘的末尾写入元数据,覆盖其中已经存在的任何内容。我建议您在首次创建驱动器时对其进行镜像,这样就不会覆盖实际数据。虽然可以镜像一个已经使用了一段时间的磁盘,但长期使用的磁盘往往会分散数据。
首先,使用 kldload(8) 或 gmirror load 加载 geom_mirror.ko 内核模块。如果希望镜像在启动时可用,请激活 /boot/loader.conf 中的模块。
创建和使用镜像与创建和使用条带化提供程序非常相似:标识要镜像的磁盘,并使用 gmerror 标记磁盘。在这个例子中,我用两个磁盘分区创建了一个镜像。如果要镜像启动驱动器,请参阅第11章。
首先使用 gmirror label 创建有一个提供者的镜像,然后使用 gmirror insert 命令添加一个镜像成员:
xxxxxxxxxx# gmirror label Mirror1 da4p1# gmirror insert Mirror1 da3p1现在我们有了一个名称为Mirror1的镜像,包含两个驱动器分区。使用 gmirror status 命令查看镜像状态:
xxxxxxxxxx# gmirror statusName Status Componentsmirror/Mirror1 DEGRADED da4p1 (ACTIVE)da3p1 (SYNCHRONIZING, 1%)镜像驱动器尚未镜像。geom必须将所有内容从原始磁盘复制到新镜像。这可能需要几分钟到几个小时,具体取决于驱动器和系统速度。复制速度是相当成比例的,所以你可以假设,如果同步在十分钟内完成了10%,整个同步过程将在大约一小时四十分钟内完成。
一旦驱动器同步,它们将看起来像这样。
xxxxxxxxxx# gmirror statusName Status Componentsmirror/Mirror1 COMPLETE da4p1 (ACTIVE)da3p1 (ACTIVE)从此,所有写入和删除都会在两个磁盘上进行。
GEOM镜像允许在不丢失数据的情况下更换发生故障的硬盘驱动器。
然而,在维修中的灵活性完全取决于硬件。如果有热插拔的驱动器,可以在系统运行时操作。如果是一个桌面式的塔式机箱,所有驱动器都安装在内部,则必须要关机以更换损坏的驱动器。
检查镜像状态以找到镜像中失败的成员:
那么,这种备受赞誉的冗余呢?是的,GEOM镜像允许您在不丢失数据的情况下更换发生故障的硬盘驱动器——哇!然而,您在维修中的灵活性完全取决于您的硬件。如果你有热插拔驱动器,你可以(也应该)在系统运行时这样做。如果您有一个桌面式的塔式机箱,其中所有驱动器都安装在内部,则必须关闭电源以更换损坏的驱动器。一旦你有了良好的驱动器,就开始进行GEOM部分的维修。
你怎么知道镜像中是否有失败的成员?检查其状态。
xxxxxxxxxx# gmirror statusName Status Componentsmirror/Mirror1 DEGRADED da3p1 (ACTIVE)DEGRADED (降级)一词在状态字段中以不友好的大写字母出现,而第二个镜像成员没有出现。这就像是有人拔出了驱动器的电源线,引发了错误或其他什么。
首先,使用 gmirror forget 命令从镜像集中删除损坏的驱动器。这不会删除整个镜像配置,而是告诉gmirror忘记镜像中丢失的任何磁盘。然后立即检查镜像的状况,以验证其是否完整:
xxxxxxxxxx# gmirror forget Mirror1# gmirror statusName Status Componentsmirror/Mirror1 COMPLETE da3p1 (ACTIVE)一个只有一个成员的镜像并不是真正的镜像,但它包含了所有数据。使用 insert 命令添加一个新成员:
xxxxxxxxxx# gmirror insert Mirror1 da2p1# gmirror statusName Status Componentsmirror/Mirror1 DEGRADED da3p1 (ACTIVE)da2p1 (SYNCHRONIZING, 23%)磁盘同步完成后,镜像就恢复了。
镜像中可以有任意数量的成员。虽然两个驱动器是传统的,但在镜像中使用三个驱动器可以大大减少冷数据库备份所需的时间,而不会影响冗余。
当您想运行冷备份时,请关闭数据库。(这是无法避免的:冷备份——cold backup——的定义就是从“关闭数据库”开始。)从三向镜像中删除一个驱动器。重新启动数据库。
您的数据库现在正在双向镜像上运行,可以正常更新。分离的驱动器具有冷数据库的副本。将该驱动器装载到临时装载点上,并备份数据副本。备份完成后,将第三个驱动器重新添加到镜像中。镜像会重新同步此磁盘,您就可以进行下一次冷备份了。
如果想删除镜像,请卸载其上的任何文件系统。无法销毁已挂载的geom。然后停下来,清理镜像。
xxxxxxxxxx# gmirror stop Mirror1# gmirror clear da2p1 da3p1现在可以将这些磁盘用于其他GEOM RAIDs。
FreeBSD可以检查您的镜像状态,并在每日状态邮件中向您发送结果。在 /etc/periodic.conf 中添加行 daily_status_gmirror_enable=YES 。
(FreeBSD14好像是使用graid来管理raid,包括RAID5)
RAID-5是行业标准,它使用奇偶校验来检查数据完整性,并将奇偶校验放在阵列中的所有驱动器上。使用RAID-5至少需要三个磁盘。与其他RAID方案一样,使磁盘在物理上尽可能分开。
FreeBSD的RAID-5支持没有包含在基本系统中,原因我完全无法理解。相反,您必须从 sysutils/graid5 port安装它。没有软件包,因为必须编译该模块以匹配您正在运行的确切内核。每次升级系统时,您还必须重建graid5模块。您无法从GEOM RAID-5启动。
以 graid5 load 激活RAID-5内核模块。如果您希望RAID-5模块在系统启动时可用,请将其列在 /boot/loder.conf 中。您绝对无法从RAID-5设备启动。你可以有一个镜像或独立 /boot 分区,并将根分区放在RAID-5 geom上,但这相当复杂。有关加密文件系统的类似示例,请参阅第11章。
在阅读了RAID-0和RAID-1之后,RAID-5的过程不应该令人感到意外。确定要参与RAID-5的磁盘。使用 graid5(8) 将这些磁盘标记为属于您的阵列。在这里,我创建了一个名为 Data0 的四驱动器RAID-5 geom。
xxxxxxxxxx# graid5 label -s128kb Data0 da4p1 da3p1 da2p1 da1p1Wasting 522240 bytes (>=0GiB).-s 标志表示条纹大小。128KB是适用于几乎所有环境的通用条带大小。如果它不适合您的环境,请更改它。RAID-5 geom在所有磁盘上浪费了少量的磁盘空间,通常不到一个完整的条带。
当您第一次创建RAID-5 geom时,它必须构建其奇偶校验数据。
xxxxxxxxxx# graid5 statusName Status Componentsraid5/Data0 REBUILDING CALM da4p1da3p1da2p1da1p1 (211025920 / 19% (p:0))它说它正在重建(rebuilding),但实际上它是第一次建造(building)自己。底部给出的百分比涵盖了整个重建过程,而不仅仅是您可能猜测的最后一个磁盘,因此它不会像您担心的那样需要那么长时间。对于大型磁盘,这种初始化可能需要几个小时,就像初始化硬件RAID-5阵列一样,奇怪的很。
一旦状态显示为 COMPLETE ,您就可以创建一个文件系统并挂载新分区。
“你这里的磁盘阵列真不错。如果它出了什么事,真丢脸”——砰——“真丢脸。”
x# graid5 statusName Status Componentsraid5/Data0 DEGRADED CALM da3p1da2p1da1p1geom降级了,但并不十分繁忙。让我们在任何人注意到之前修复它。我正在用da0p1替换缺失的da4p1。
xxxxxxxxxx# graid5 insert Data0 da0p1如果此命令悄无声息地返回,则graid5已接受新磁盘。让我们看看进展如何。
xxxxxxxxxx# graid5 statusName Status Componentsraid5/Data0 REBUILDING CALM da3p1da2p1da1p1da0p1 (473038848 / 44% (p:0))等待阵列完成重建,它将显示为 COMPLETE 。在重建过程中,您可以继续使用geom,尽管它的运行速度会稍慢。
当然,我本可以更换驱动器da4,并在其上为RAID-5创建一个新分区,而不是使用新驱动器。做任何对你的环境有效的事情。在GEOM,你话事(you are in charge)。
要销毁不需要的RAID-5 geom,请卸载其上的任何分区。然后使用 destroy 命令从所有提供程序中删除geom以及任何元数据。
xxxxxxxxxx# graid5 destroy Data0或者,使用graid5的 stop 命令停止geom,然后使用 clear 命令从每个单独的提供者中删除元数据。
跨镜像磁盘的条带,即RAID-10,可能是提供大量高性能存储的最佳方式。磁盘被分组到镜像中,然后数据在镜像间条带化。geom不需要计算奇偶性;镜像提供冗余,条带提供性能。虽然RAID-10使用大量磁盘,但它是高吞吐量性能的有力竞争者。
从技术上讲,RAID-10是一种嵌套(nested)RAID。它是在多个RAID-1之上运行的RAID-0。您首先创建镜像,然后将数据条带化到镜像上。GEOM允许您轻松构建这些层。
在真正的高可用性RAID-10中,镜像磁盘尽可能广泛地分开非常重要。将它们放在不同的控制器、不同的SCSI机架、不同的电源和不同的机架上。这使得RAID-10的成本太高,无法用于客户网页(普通的旧镜像就足够了),但它对金融和制造应用程序很有好处,在这些应用程序中,您必须拥有所能获得的所有速度和正常运行时间。
在开始创建RAID-10之前,拿张纸,写下各种磁盘以及打算把它们放在哪里。我将硬盘驱动器da1和da2配对为 mirror1 。驱动器da3和da4组成 mirror2 。偶数磁盘位于一个控制器上,奇数磁盘位于另一个控制器上。这样,一个控制器的故障不会损坏我的数据。
使用 gmirror(8) 配置镜像:
xxxxxxxxxx# gmirror label mirror0 da1p1 da2p1# gmirror label mirror1 da3p1 da4p1检查镜像状态,以验证它们都分配了正确的磁盘。即使镜像没有完全同步,可以继续操作,但请在投入生产之前给镜像一些时间来完成。
接下来,创建一个包含两个镜像设备的 gstripe(8) 设备。我们将使用128KB的条带大小,并将条带设备称为 raid10 ,创建后,检查其状态以验证是否添加了正确的设备:
xxxxxxxxxx# gstripe label -s 128KB raid10 mirror/mirror0 mirror/mirror1完成了。
不,真的。搞掂了。/dev/stripe 中有一个 raid10 设备。在上面创建一个文件系统,挂载它,就可以开始了。。
RAID-10作为一个整体不会失败,但单个镜像可能会失败。使用 gmerror status 检查各个驱动器。您还可以查看条带设备的状态——我从未见过条带出现任何问题,但我想它可能会失败。
修复发生故障的镜像,就像修复其他GEOM镜像一样,如本章前面所示。
要从系统中销毁RAID-10,应先销毁条带geom,然后再销毁各个镜像。
有些人认为你应该创建条带设备,然后镜像它们。我不推荐这个,因为恢复需要对磁盘进行更多的写入。但是,如果要执行此RAID 0+1,请按照RAID-10说明反向操作。创建条带设备,然后镜像它们。
【对于0+1,如果有个一硬盘坏了,会造成包含该磁盘的整个条带失效,更换这个磁盘,同步数据需要对整个条带的所有磁盘进行操作。如果两个条带中各有一个磁盘同时坏掉,整个阵列会崩溃。
对于1+0,如果一个磁盘坏了,只影响一个镜像,更换这个磁盘,同步数据仅发生在该镜像组中。如果同一个镜像中的两个磁盘同时坏掉,整个阵列会崩溃。
无论是1+0,还是0+1,同时坏两块硬盘的情况下,都有概率失去整个阵列。】
以RAID-10和RAID-0+1为例,你可能认为你可以结合FreeBSD的软件RAID功能来创建任何你想要的东西。这是真的。您可以通过在RAID-5阵列上构建的镜像提供程序之间创建RAID-5来创建RAID-505。这些设置大多是对磁盘的浪费,没有任何真正的收益,其中许多都在积极威胁您的数据。
嵌套RAID会产生各种微妙的错误情况,比你我聪明得多的人已经克服了这些错误。那些不如你我聪明的人亲身经历过这些错误。
从别人的RAID错误中吸取教训——你没有时间独自犯下所有这些错误。
graid(8)FreeBSD包括一个用于管理SATA RAID设备的工具 graid(8) 。尽管名字带 g ,但它并不是GEOM RAID工具,而是硬件RAID软件的接口。BIOS RAID阵列会在 /dev/raid 目录中列出。
大多数SATA RAID实施最好从BIOS进行管理。graid(8) 手册页建议新用户从BIOS创建RAID阵列,并使用 graid 命令查看配置。我也推荐这个。不同的供应商有不同的接口、不同的磁盘格式以及不同的怪癖和烦恼。graid list 查看找到的BIOS RAID设备,但仅此而已。
FreeBSD有很多方法可以使磁盘冗余。冗余在驱动器发生故障时非常有用,但在磁盘即将发生故障时收到警告不是更好吗?接下来我们将介绍这一点。
似乎新版FreeBSD在用graid管理GEOM RAID,所以才取消了graid5?
以下是 graid(8) 手册页内容:
graid —— 软件RAID设备控制套件。
xxxxxxxxxxgraid label [-f] [-o fmtopt] [-S size] [-s strip] format label level prov ...graid add [-f] [-S size] [-s strip] name label levelgraid delete [-f] name [label | num]graid insert name prov ...graid remove name prov ...graid fail name prov ...graid stop [-fv] name ...graid listgraid statusgraid loadgraid unloadgraid实用程序用于管理GEOM RAID类支持的软RAID配置。
GEOM RAID类使用磁盘上的元数据来提供对不同RAID BIOS定义的软件RAID卷的访问。
根据RAID BIOS类型及其元数据格式,支持不同的配置和功能子集。
为了允许从RAID卷启动,元数据格式应与RAID BIOS类型及其功能相匹配。
为了保证这些匹配,建议通过RAID BIOS接口创建卷,而有经验的用户可以使用此实用程序自由创建卷。
graid的第一参数(子命令)表示要执行的操作:
使用单独卷创建一个阵列。
format参数指定用于阵列的磁盘上的元数据格式,比如“Intel”。
label参数指定创建的卷的标签。
level参数指定创建的卷的RAID级别,比如RAID0、RAID1等等。
后续列表枚举用作阵列组件的提供者。特殊名称“NONE”可用于为缺失的磁盘保留空间。组件的顺序可能很重要,这取决于特定的RAID级别和源数据格式。
可用选项如下:
在已存在的阵列中创建卷。
name参数指定阵列的名称,阵列名称有label子命令创建。
level参数与label子命令中的相同。
从现有阵列中删除卷。
当删除最后一个卷后,阵列也会被删除,其元数据也会被擦除。
name参数指定要处理的阵列名称。
label或num参数指定要删除的卷。
向指定的阵列中插入指定的提供者以取代第一个丢失或失效的组件。
如果没有此类组件,则插入的磁盘会被作为热备盘。
从指定的阵列中移除指定的提供者,并销毁元数据。
如果此时有热备盘,则移出的磁盘会被热备盘取代。
将指定的磁盘标识为失效,除非由于冗余耗尽而绝对必要,否则将从活动中删除。
如果此时存在热备盘,则将用其中一个替换失效的磁盘。
停止指定的阵列。元数据将被清除。
list status load unload
参见geom命令。
GEOM RAID类遵循模块化设计,允许使用不同的元数据格式。目前支持以下格式:
SNIA通用RAID磁盘数据格式(Disk Data Format)v2.0规范定义的格式。用于一些Adaptec RAID BIOS和一些硬件RAID控制器。
由于格式灵活性高,不同的实现支持不同的功能集,并具有不同的磁盘上元数据布局。
为了提供兼容性,GEOM RAID类模拟了第一个检测到的DDF阵列的功能。考虑到这一点,它可能支持每个卷、每个阵列、每个磁盘分区等不同数量的磁盘。
支持以下配置:
RAID0(2+个磁盘),RAID1(2+个硬盘),RAID1E(3+个磁盘)、RAID3(3+个硬盘)、RAID4(3+个光盘)、RAID5(3+个磁带)、RAID5E(4+个磁盘)、RAID5EE(4+个硬盘)。
格式支持两个选项“BE”(big-endian)和“LE”(little-endian),这意味着由规范定义的大端字节序(默认)和某些Adaptec控制器使用的小端字节序。
Intel RAID BIOS使用的格式。
每个阵列最多支持两个卷。
支持配置:
RAID0(2+个磁盘)、RAID1(2个磁盘)、RAID5(3+个磁盘”)、RAID10(4个磁盘)。
Intel RAID BIOS不支持的配置,但可自行执行,风险自负:RAID1(3+个磁盘)、RAID1E(3+个硬盘)、RAID10(6+个磁盘)。
JMicron RAID BIOS使用的格式。
支持每个阵列一个卷。支持以下配置:
RAID0(2+个磁盘)、RAID1(2个磁盘)、RAID 10(4个磁盘)、CONCAT(2+个磁盘)。
JMicron RAID BIOS不支持配置,但可自行执行,风险自负:RAID1(3+个磁盘)、RAID1E(3+个硬盘)、RAID10(6+个磁盘)和RAID5(3+个盘)。
NVIDIA MediaShield RAID BIOS使用的格式。
支持每个阵列一个卷。支持以下配置:
RAID0(2+个磁盘)、RAID1(2个磁盘)、RAID5(3+个磁盘)、RAID10(4+个磁盘)、SINGLE(1个磁盘)、CONCAT(2个+磁盘)。
NVIDIA MediaShield RAID BIOS不支持配置,但可自行执行风险:RAID1(3+个磁盘)。
Promise和AMD/ATI RAID BIOS使用的格式。
每个阵列支持多个卷。每个磁盘可以拆分为最多两个任意卷使用。支持配置:
RAID0(2+个磁盘)、RAID1(2个磁盘),RAID5(3+个磁盘)、RAID10(4个磁盘)。
RAID BIOS不支持配置,但可自行执行,风险自负:RAID1(3+个磁盘)、RAID10(6+个磁盘)。
SiliconImage RAID BIOS使用的格式。
支持每个阵列一个卷。支持以下配置:
RAID0(2+个磁盘)、RAID1(2个磁盘)、RAID5(3+个磁盘)、RAID10(4个磁盘)、SINGLE(1个磁盘)、CONCAT(2+个磁盘)。
SiliconImage RAID BIOS不支持配置,但可自行执行,风险自负:RAID1(3+个磁盘)、RAID10(6+个磁盘)。
GEOM RAID类遵循模块设计,允许使用不同的RAID级别。目前已实现以下RAID级别的完全支持:
RAID0、RAID1、RAID1E、RAID10、SINGLE、CONCAT。
对于处于最佳状态(不使用冗余)的卷,以下RAID级别支持为只读:
RAID4、RAID5、RAID5E、RAID5EE、RAID5R、RAID6、RAIDMDF。
GEOM RAID类不支持某些元数据格式允许的RAID级别迁移。
如果您是使用BIOS或其他方式开始迁移的,请确保在那里完成迁移。在可能出现数据损坏的情况下,不要在迁移卷上运行GEOM RAID类!
NVIDIA元数据格式不支持2TiB以上的卷。
以下sysctl(8)变量可用于控制RAID GEOM类的行为。
运行成功返回0,其他非0返回值都意味着命令运行失败了。