标签 Raid 下的文章

RAID 的意思是廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),但现在它被称为独立磁盘冗余阵列(Redundant Array of Independent Drives)。早先一个容量很小的磁盘都是非常昂贵的,但是现在我们可以很便宜的买到一个更大的磁盘。Raid 是一系列放在一起,成为一个逻辑卷的磁盘集合。

RAID in Linux

在 Linux 中理解 RAID 设置

RAID 包含一组或者一个集合甚至一个阵列。使用一组磁盘结合驱动器组成 RAID 阵列或 RAID 集。将至少两个磁盘连接到一个 RAID 控制器,而成为一个逻辑卷,也可以将多个驱动器放在一个组中。一组磁盘只能使用一个 RAID 级别。使用 RAID 可以提高服务器的性能。不同 RAID 的级别,性能会有所不同。它通过容错和高可用性来保存我们的数据。

这个系列被命名为“在 Linux 下使用 RAID”,分为9个部分,包括以下主题:

这是9篇系列教程的第1部分,在这里我们将介绍 RAID 的概念和 RAID 级别,这是在 Linux 中构建 RAID 需要理解的。

软件 RAID 和硬件 RAID

软件 RAID 的性能较低,因为其使用主机的资源。 需要加载 RAID 软件以从软件 RAID 卷中读取数据。在加载 RAID 软件前,操作系统需要引导起来才能加载 RAID 软件。在软件 RAID 中无需物理硬件。零成本投资。

硬件 RAID 的性能较高。他们采用 PCI Express 卡物理地提供有专用的 RAID 控制器。它不会使用主机资源。他们有 NVRAM 用于缓存的读取和写入。缓存用于 RAID 重建时,即使出现电源故障,它会使用后备的电池电源保持缓存。对于大规模使用是非常昂贵的投资。

硬件 RAID 卡如下所示:

Hardware RAID

硬件 RAID

重要的 RAID 概念

  • 校验方式用在 RAID 重建中从校验所保存的信息中重新生成丢失的内容。 RAID 5,RAID 6 基于校验。
  • 条带化是将切片数据随机存储到多个磁盘。它不会在单个磁盘中保存完整的数据。如果我们使用2个磁盘,则每个磁盘存储我们的一半数据。
  • 镜像被用于 RAID 1 和 RAID 10。镜像会自动备份数据。在 RAID 1 中,它会保存相同的内容到其他盘上。
  • 热备份只是我们的服务器上的一个备用驱动器,它可以自动更换发生故障的驱动器。在我们的阵列中,如果任何一个驱动器损坏,热备份驱动器会自动用于重建 RAID。
  • 是 RAID 控制器每次读写数据时的最小单位,最小 4KB。通过定义块大小,我们可以增加 I/O 性能。

RAID有不同的级别。在这里,我们仅列出在真实环境下的使用最多的 RAID 级别。

  • RAID0 = 条带化
  • RAID1 = 镜像
  • RAID5 = 单磁盘分布式奇偶校验
  • RAID6 = 双磁盘分布式奇偶校验
  • RAID10 = 镜像 + 条带。(嵌套RAID)

RAID 在大多数 Linux 发行版上使用名为 mdadm 的软件包进行管理。让我们先对每个 RAID 级别认识一下。

RAID 0 / 条带化

条带化有很好的性能。在 RAID 0(条带化)中数据将使用切片的方式被写入到磁盘。一半的内容放在一个磁盘上,另一半内容将被写入到另一个磁盘。

假设我们有2个磁盘驱动器,例如,如果我们将数据“TECMINT”写到逻辑卷中,“T”将被保存在第一盘中,“E”将保存在第二盘,'C'将被保存在第一盘,“M”将保存在第二盘,它会一直继续此循环过程。(LCTT 译注:实际上不可能按字节切片,是按数据块切片的。)

在这种情况下,如果驱动器中的任何一个发生故障,我们就会丢失数据,因为一个盘中只有一半的数据,不能用于重建 RAID。不过,当比较写入速度和性能时,RAID 0 是非常好的。创建 RAID 0(条带化)至少需要2个磁盘。如果你的数据是非常宝贵的,那么不要使用此 RAID 级别。

  • 高性能。
  • RAID 0 中容量零损失。
  • 零容错。
  • 写和读有很高的性能。

RAID 1 / 镜像化

镜像也有不错的性能。镜像可以对我们的数据做一份相同的副本。假设我们有两个2TB的硬盘驱动器,我们总共有4TB,但在镜像中,但是放在 RAID 控制器后面的驱动器形成了一个逻辑驱动器,我们只能看到这个逻辑驱动器有2TB。

当我们保存数据时,它将同时写入这两个2TB驱动器中。创建 RAID 1(镜像化)最少需要两个驱动器。如果发生磁盘故障,我们可以通过更换一个新的磁盘恢复 RAID 。如果在 RAID 1 中任何一个磁盘发生故障,我们可以从另一个磁盘中获取相同的数据,因为另外的磁盘中也有相同的数据。所以是零数据丢失。

  • 良好的性能。
  • 总容量丢失一半可用空间。
  • 完全容错。
  • 重建会更快。
  • 写性能变慢。
  • 读性能变好。
  • 能用于操作系统和小规模的数据库。

RAID 5 / 分布式奇偶校验

RAID 5 多用于企业级。 RAID 5 的以分布式奇偶校验的方式工作。奇偶校验信息将被用于重建数据。它从剩下的正常驱动器上的信息来重建。在驱动器发生故障时,这可以保护我们的数据。

假设我们有4个驱动器,如果一个驱动器发生故障而后我们更换发生故障的驱动器后,我们可以从奇偶校验中重建数据到更换的驱动器上。奇偶校验信息存储在所有的4个驱动器上,如果我们有4个 1TB 的驱动器。奇偶校验信息将被存储在每个驱动器的256G中,而其它768GB是用户自己使用的。单个驱动器故障后,RAID 5 依旧正常工作,如果驱动器损坏个数超过1个会导致数据的丢失。

  • 性能卓越
  • 读速度将非常好。
  • 写速度处于平均水准,如果我们不使用硬件 RAID 控制器,写速度缓慢。
  • 从所有驱动器的奇偶校验信息中重建。
  • 完全容错。
  • 1个磁盘空间将用于奇偶校验。
  • 可以被用在文件服务器,Web服务器,非常重要的备份中。

RAID 6 双分布式奇偶校验磁盘

RAID 6 和 RAID 5 相似但它有两个分布式奇偶校验。大多用在大数量的阵列中。我们最少需要4个驱动器,即使有2个驱动器发生故障,我们依然可以更换新的驱动器后重建数据。

它比 RAID 5 慢,因为它将数据同时写到4个驱动器上。当我们使用硬件 RAID 控制器时速度就处于平均水准。如果我们有6个的1TB驱动器,4个驱动器将用于数据保存,2个驱动器将用于校验。

  • 性能不佳。
  • 读的性能很好。
  • 如果我们不使用硬件 RAID 控制器写的性能会很差。
  • 从两个奇偶校验驱动器上重建。
  • 完全容错。
  • 2个磁盘空间将用于奇偶校验。
  • 可用于大型阵列。
  • 用于备份和视频流中,用于大规模。

RAID 10 / 镜像+条带

RAID 10 可以被称为1 + 0或0 +1。它将做镜像+条带两个工作。在 RAID 10 中首先做镜像然后做条带。在 RAID 01 上首先做条带,然后做镜像。RAID 10 比 01 好。

假设,我们有4个驱动器。当我逻辑卷上写数据时,它会使用镜像和条带的方式将数据保存到4个驱动器上。

如果我在 RAID 10 上写入数据“TECMINT”,数据将使用如下方式保存。首先将“T”同时写入两个磁盘,“E”也将同时写入另外两个磁盘,所有数据都写入两块磁盘。这样可以将每个数据复制到另外的磁盘。

同时它将使用 RAID 0 方式写入数据,遵循将“T”写入第一组盘,“E”写入第二组盘。再次将“C”写入第一组盘,“M”到第二组盘。

  • 良好的读写性能。
  • 总容量丢失一半的可用空间。
  • 容错。
  • 从副本数据中快速重建。
  • 由于其高性能和高可用性,常被用于数据库的存储中。

结论

在这篇文章中,我们已经了解了什么是 RAID 和在实际环境大多采用哪个级别的 RAID。希望你已经学会了上面所写的。对于 RAID 的构建必须了解有关 RAID 的基本知识。以上内容可以基本满足你对 RAID 的了解。

在接下来的文章中,我将介绍如何设置和使用各种级别创建 RAID,增加 RAID 组(阵列)和驱动器故障排除等。


via: http://www.tecmint.com/understanding-raid-setup-in-linux/

作者:Babin Lonston 译者:strugglingyouth 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

磁盘冗余阵列(RAID)是将多个物理磁盘结合成一个逻辑磁盘的技术,该技术可以提高磁盘容错性能,提高磁盘的读写速度。根据数据存储的排列(如:条带存储,镜像存储,奇偶或者他们的组合),定义了几个不同级别的RAID(RAID-0,RAID-1,RAID-5 等等)。磁盘阵列可以使用软件或者硬件方式实现。现代Linux操作系统中,基本的软件RAID功能是默认安装的。

本文中,我们将介绍软件方式构建RAID-1阵列(镜像阵列),RAID-1将相同的数据写到不同的设备中。虽然可以使用同一个磁盘的两个分区实现RAID-1,但是如果磁盘坏了的话数据就都丢了,所以没什么意义。实际上,这也是为什么大多数RAID级别都使用多个物理磁盘提供冗余。当单盘失效后不影响整个阵列的运行,并且可以在线更换磁盘,最重要的是数据不会丢失。尽管如此,阵列不能取代外部存储的定期备份。

由于RAID-1阵列的大小是阵列中最小磁盘的大小,一般来说应该使用两个大小相同的磁盘来组建RAID-1。

安装mdadm

我们将使用mdadm(简称多盘管理)工具创建、组装、管理和监控软件RAID-1。在诸如Fedora、CentOS、RHEL或者Arch Linux 的发行版中,mdadm是默认安装的。在基于Debian的发行版中,可以使用aptitude 或者 apt-get 安装mdadm。

Fedora, CentOS 或 RHEL

由于adadm是预装的,所以我们只需要开启RAID守护服务,并将其配置成开机启动即可:

# systemctl start mdmonitor
# systemctl enable mdmonitor 

对于CentOS/RHEL 6系统,使用以下命令:

# service mdmonitor start
# chkconfig mdmonitor on 

Debian, Ubuntu 或 Linux Mint

在Debian或类Debian系统中,mdadm可以使用 aptitude 或者 apt-get 安装:

# aptitude install mdadm 

Ubuntu系统中,会要求配置Postfix MTA 以发送电子邮件通知。你可以跳过去。

Debian系统中,安装程序会显示以下解释信息,用来帮助我们去判断是否将根目录安装到RAID阵列中。下面的所有操作都有赖于这一步,所以应该仔细阅读他。

我们不在根目录使用RAID-1,所以留空。

提示是否开机启动阵列的时候,选择“是”。注意,这里需要往/etc/fstab 文件中添加一个条目使得系统启动的时候正确挂载阵列。

硬盘分区

现在开始准备建立阵列需要的硬盘。这里插入两个8GB的usb磁盘,使用dmesg命令设备显示设备 /dev/sdb 和 /dev/sdc

# dmesg | less 

[ 60.014863] sd 3:0:0:0: [sdb] 15826944 512-byte logical blocks: (8.10 GB/7.54 GiB) [ 75.066466] sd 4:0:0:0: [sdc] 15826944 512-byte logical blocks: (8.10 GB/7.54 GiB)

我们使用fdisk为每个磁盘建立一个大小为8G的主分区。以下步骤是如何在/dev/sdb上建立分区,假设次磁盘从未被分区(如果有其他分区的话,可以删掉):

# fdisk /dev/sdb 

按p键输出现在的分区表:

(如果有分区的话,可以使用 d 选项删除,w 选项应用更改)。

磁盘上没有分区,所以我们使用命令 ['n'] 创建一个主分区['p'], 分配分区号为['1'] 并且指定大小。你可以按回车使用默认值,或者输入一个你想设置的值。如下图:

用同样的方法为/dev/sdc 分区。

如果我们有两个不同容量的硬盘,比如 750GB 和 1TB的话,我们需要在每个磁盘上分出一个750GB的主分区,大盘剩下的空间可以用作他用,不加入磁盘阵列。

创建 RAID-1 阵列

磁盘分区完成后,我们可以使用以下命令创建 RAID-1 阵列:

# mdadm -Cv /dev/md0 -l1 -n2 /dev/sdb1 /dev/sdc1 

说明:

  • -Cv: 创建一个阵列并打印出详细信息。
  • /dev/md0: 阵列名称。
  • -l1 (l as in "level"): 指定阵列类型为 RAID-1 。
  • -n2: 指定我们将两个分区加入到阵列中去,分别为/dev/sdb1 和 /dev/sdc1

以上命令和下面的等价:

 # mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 

如果你想在在磁盘失效时添加另外一个磁盘到阵列中,可以指定 '--spare-devices=1 /dev/sdd1' 到以上命令。

输入 “y” 继续创建阵列,回车:

可以使用以下命令查看进度:

 # cat /proc/mdstat 

另外一个获取阵列信息的方法是:

# mdadm --query /dev/md0
# mdadm --detail /dev/md0 (或 mdadm -D /dev/md0) 

'mdadm -D'命令提供的信息中,最重要就是阵列状态类。激活状态说明阵列正在进行读写操作。其他几个状态分别为:完成(读写完成)、降级(有一块磁盘失效或丢失)或者恢复中(一张新盘已插入,系统正在写入数据)。这几个状态涵盖了大多数情况。

格式化或加载磁盘阵列

下一步就是格式化阵列了,本例中使用ext4格式:

 # mkfs.ext4 /dev/md0 

现在可以加载阵列并验证其正常加载:

# mount /dev/md0 /mnt
# mount 

监控磁盘阵列

mdadm工具内置有磁盘阵列监控功能。当mdadm作为守护程序运行的时候(就像我们上文那样),会周期性的检测阵列运行状态,将检测到的信息通过电子邮件或者系统日志报告上来。当然,也可以配置其在发生致命性错误的时候调用紧急命令。

mdadm默认会记录所有已知分区和阵列的事件,并将他们记录到 /var/log/syslog中。或者你可以在配置文件中(debian系统:/etc/mdadm/mdadm.conf ,红帽子系统:/etc/mdadm.conf )用以下格式指定监控设备或者阵列。如果mdadm.conf文件不存在,你可以创建一个。

DEVICE /dev/sd[bcde]1 /dev/sd[ab]1

ARRAY /dev/md0 devices=/dev/sdb1,/dev/sdc1
ARRAY /dev/md1 devices=/dev/sdd1,/dev/sde1
.....

# optional email address to notify events
MAILADDR [email protected]

编辑完毕mdadm配置文件后,重启mdadm服务:

Debian系统,Ubuntu或者Linux Mint:

# service mdadm restart

Fedora, CentOS 或 RHEL 7:

# systemctl restart mdmonitor

CentOS或者RHEL 6:

# service mdmonitor restart 

自动加载阵列

现在我们在/etc/fstab中加入条目使得系统启动的时候将阵列挂载到/mnt目录下:

# echo "/dev/md0 /mnt ext4 defaults 0 2" << /etc/fstab 

为了验证挂载脚本工作正常,我们首先卸载阵列,重启mdadm,然后重新加载。可以看到/dev/md0已经安装我们添加到/etc/fstab中的条目加载了:

# umount /mnt
# service mdadm restart (on Debian, Ubuntu or Linux Mint)
or systemctl restart mdmonitor (on Fedora, CentOS/RHEL7)
or service mdmonitor restart (on CentOS/RHEL6)
# mount -a 

现在我们的阵列已经可以访问了,拷贝文件/etc/passwd到/mnt中测试一下:

Debian系统中,需要在/etc/default/mdadm 设置 AUTOSTART 变量为 true 才能使mdadm守护程序在开机时自动加载阵列:

AUTOSTART=true

模拟磁盘丢失故障

我们将使用以下命令卸载磁盘来模拟磁盘故障。注意,在实际应用中,磁盘如果已经是故障状态了,不需要卸载。

首先,卸载阵列:

# umount /mnt 

现在注意每次执行命令后 'mdadm -D /dev/md0' 的输出。

# mdadm /dev/md0 --fail /dev/sdb1 # 标记 /dev/sdb1 为失效
# mdadm --remove /dev/md0 /dev/sdb1 # 从阵列中移走 /dev/sdb1 

然后,如果你有个备用盘的话,重新添加一下:

 # mdadm /dev/md0 --add /dev/sdb1 

数据会被自动添加到备用盘 /dev/sdb1 上:

注意以上所述步骤只适合支持磁盘热拔插的系统,在不支持热拔插的系统中,还是得停止阵列并关机后更换备用盘:

# mdadm --stop /dev/md0
# shutdown -h now 

最后将新驱动器重新添加到阵列中:

# mdadm /dev/md0 --add /dev/sdb1
# mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 

希望本文对你有所帮助。


via: http://xmodulo.com/2014/09/create-software-raid1-array-mdadm-linux.html

作者:Gabriel Cánepa 译者:shipsw 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

RAID 10阵列(又名RAID 1+0 或先镜像后分区)通过结合RAID 0 (读写操作在多个磁盘上同时并行执行)和RAID 1(数据被完全相同地写入到两个或更多的磁盘)两者的特点实现高性能和高容错性的磁盘I/O。

这篇文章会指导你如何使用五块相同的8GB磁盘来组成一个软件RAID 10阵列。因为组成一个RAID 10阵列至少需要4块磁盘(比如,两个镜像各有一对分区组合),而且需要添加一块额外的备用磁盘以防某块主要的磁盘出错。本文也会分享一些工具,在稍后用来分析RAID阵列的性能。

注意RAID 10的优缺点和其它分区方法(在不同大小的磁盘和文件系统上)的内容不在本文讨论范围内。

Raid 10 阵列如何工作?

如果你需要实现一种支持I/O密集操作(比如数据库、电子邮件或web服务器)的存储解决方案,RAID 10就是你需要的。来看看为什么这么说,请看下图。

上图中的文件由A、B、C、D、E和F六种块组成,每一个RAID 1镜像对(如镜像1和2)在两个磁盘上复制相同的块。在这样的配置下,写操作性能会因为每个块需要写入两次而下降,每个磁盘各一次;而读操作与从单块磁盘中读取相比并未发生改变。不过这种配置的好处是除非一个镜像中有超过一块的磁盘故障,否则都能保持冗余以维持正常的磁盘I/O操作。

RAID 0的分区通过将数据划分到不同的块,然后执行同时将块A写入镜像1、将块B写入镜像2(以此类推)的并行操作以提高整体的读写性能。在另一方面,没有任何一个镜像包含构成主存的数据片的全部信息。这就意味着如果其中一个镜像故障,那么整个RAID 0组件将无法正常工作,数据将遭受不可恢复的损失。

建立RAID 10阵列

有两种建立RAID 10阵列的可行方案:复杂法(一步完成)和嵌套法(先创建两个或更多的RAID 1阵列,然后使用它们组成RAID 0)。本文会讲述复杂法创建RAID 10阵列的过程,因为这种方法能够使用偶数或奇数个磁盘去创建阵列,而且能以单个RAID设备的形式被管理,而嵌套法则恰恰相反(只允许偶数个磁盘,必须以嵌套设备的形式被管理,即分开管理RAID 1和RAID 0)。

假设你的机器已经安装mdadm,并运行着相应的守护进程,细节参见这篇文章。也假设每个磁盘上已经划分出一个主分区sd[bcdef]1 (LCTT 译注:共计五块磁盘,这里是从sdb - sdf)。使用命令:

ls -l /dev | grep sd[bcdef]

查看到的输出应该如下所示:

然后使用下面的命令创建一个RAID 10阵列(LCTT 译注:使用了四块磁盘 bcde 创建):

 # mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sd[bcde]1 --spare-devices=1 /dev/sdf1 

当阵列创建完毕后(最多花费几分钟),执行命令

# mdadm --detail /dev/md0

的输出应如下所示:

在更进一步之前需要注意以下事项。

  1. Used Dev Space表示阵列所使用的每一块磁盘的容量。
  2. Array Size表示阵列的整体大小。RAID 10阵列的大小通过(N*C)/M计算,其中N是活跃磁盘的数目,C是每个活跃磁盘的容量,M是每一个镜像中磁盘的数目。在本文的情形下,这个值等于(4*8GiB)/2 = 16GiB。
  3. Layout是整个数据布局的详细信息。可能的布局数值如下所示。

  • n(默认选项):代表就近(near)拷贝。一个数据块的多个拷贝在不同磁盘里有相同的偏移量。这种布局提供和RAID 0阵列相似的读写性能。

  • o代表偏移量(offset)拷贝。块并不是在条带里面复制的,而是整个条带一起复制,但是循环会打乱,所以同一个分区中复制的块会出现在不同的磁盘。因此,一个块的后续拷贝会出现在下一个磁盘中,一个块接着一个块。为了在RAID 10阵列中使用这种布局,在创建阵列的命令中添加--layout=o2选项。

  • f代表远端(far)拷贝(多个拷贝在不同的磁盘中具有不同的偏移量)。这种布局提供更好的读性能但带来更差的写性能。因此,对于读远远多于写的系统来说是最好的选择。为了在RAID 10阵列中使用这种布局,在创建阵列的命令中添加--layout=f2。

跟在布局选项nfo后面的数字代表所需的每一个数据块的副本数目。默认值是2,但可以是2到阵列中磁盘数目之间的某个值。提供足够的副本数目可以最小化单个磁盘上的I/O影响。

  1. Chunk Size,参考Linux RAID wiki的说明,是写入磁盘的最小数据单元。最佳的chunk大小取决于I/O操作的速率和相关的文件大小。对于大量的写操作,通过设置相对较大的chunk可以得到更低的开销,但对于主要存储小文件的阵列来说更小的chunk性能更好。为了给RAID 10指定一个chunk大小,在创建阵列的命令中添加--chunk=desiredchunksize

不幸的是,并没有设置一个大小就能适合全局的策略来提高性能,但可以参考下面的一些方案。

  • 文件系统:就整体而言,XFS据说是最好的,当然EXT4也是不错的选择。
  • 最佳布局:远端布局能提高读性能,但会降低写性能。
  • 副本数目:更多的副本能最小化I/O影响,但更多的磁盘需要更大的花费。
  • 硬件:在相同的环境下,SSD比传统(机械旋转)磁盘更能带来出性能提升

使用DD进行RAID性能测试

下面的基准测试用于检测RAID 10阵列(/dev/md0)的性能。

1. 写操作

往磁盘中写入大小为256MB的单个文件:

# dd if=/dev/zero of=/dev/md0 bs=256M count=1 oflag=dsync 

写入1000次512字节:

# dd if=/dev/zero of=/dev/md0 bs=512 count=1000 oflag=dsync 

使用dsync标记,dd可以绕过文件系统缓存,在RAID阵列上执行同步写。这个选项用于减少RAID性能测试中缓存的影响。

2. 读操作

从阵列中拷贝256KiB*15000(3.9 GB)大小内容到/dev/null:

 # dd if=/dev/md0 of=/dev/null bs=256K count=15000 

使用Iozone进行RAID性能测试

Iozone是一款文件系统基准测试工具,用来测试各种磁盘I/O操作,包括随机读写、顺序读写和重读重写。它支持将结果导出为微软的Excel或LibreOffice的Calc文件。

在CentOS/RHEL 7上安装Iozone

先保证Repoforge可用,然后输入:

# yum install iozone 

在Debian 7上安装Iozone

# aptitude install iozone3 

下面的iozone命令会在RAID-10阵列中执行所有测试:

# iozone -Ra /dev/md0 -b /tmp/md0.xls 
  • -R:往标准输出生成兼容Excel的报告
  • -a:以全自动模式运行所有的测试,并测试各种记录/文件大小。记录大小范围:4K-16M,文件大小范围:64K-512M。
  • -b /tmp/md0.xls: 把测试结果存储到一个指定的文件中

希望这篇文章对你有所帮助,如果想到任何想法或建议可能会提升RAID 10的性能,请讲出来。


via: http://xmodulo.com/setup-raid10-linux.html

作者:Gabriel Cánepa 译者:KayGuoWhu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

$1, Raid和Cache Memory

通常,出於二個目標:安全和性能,我們在生產環境的服務器上會設置Raid功能。最常見的場景是,我們會由於安全性的考慮將磁盤設置成Raid 1 或Raid 5、Raid6等模式保障在一塊或多塊硬盤故障時數據不丟失。或者是由於Dis IO性能上的考慮將硬盤設置成Raid 0或Raid 10來擴展有限的IO。

無論DELL/HP/IBM等服務器廠商,都會OEM一些Raid控制器在實現Raid功能,而為了保障和提升讀寫性能,Raid控制卡裏都會內置128MB 至 1GB不等的Cache Memory,而我們對磁盤的讀和寫操作都會通過事先在Cache Memory中Hit或緩存,這樣一來就可以大大提高了實際IO性能。

OS也認為只要讀或寫到Cache Memory以後即算操作成功,而Cache Memory中的數據如何Flush到物理磁盤中的Policy控制則由Raid控制器來解決。這種通過寫入Cache Memory的Policy我們稱為WriteBack,而如果不通過Cache Memory直接寫入磁盤的Policy我們稱為WriteThrough。

任何一條數據寫入Memory和寫入磁盤的性能差別之巨大,不用比較都可想像得到是天壤之別。特別是當我們遇到MySQL等數據庫或其他IO要求壓力非常大的環境,這是我們實際生產環境中不得不要考慮的因素。

$2, BBU,TBBU在實際應用中的問題和運維

什麼是BBU/TBBU呢?其實BBU就是Raid卡中的一個電池備用模塊,因為之前我們說到在Raid的環境下很多情況下數據都是通過Cache Memory和磁盤交換的,而Memory本身並無法保障數據持久性,萬一電源中斷,而數據沒來得及flush到物理磁盤上,就會造成數據丟失的悲劇。為此硬件廠商提供了BBU和TBBU,其中包含了一塊鋰電池來保障萬一電源中斷的情況下,Cache Memory中的數據不至於丟失,直至電源恢復。TBBU的不同區別是Cache Memory和電池是做成一個模塊,以防止Raid控制器如果硬件故障的時候,在更換Raid控制卡過程中可以不更換TBBU及其中的Cache Memory,防止這一過程中的數據不丟失。

就是這麼樣的一個模塊,如圖:

正是由於使用電池做為持續Memory是數據的可靠性,而存在一個尷尬的隱患。以目前的技術水平,電池是不可以長期不充放電的,否則會造成電池損壞而無法起到保護數據的特性。所以Raid卡廠商在設計BBU/TBBU中加入了一個自動充放電的維護過程,每過一段時間(通常是數個月左右)會自動對電池放電,然後再自動充電,以保證電池的可用性。

而在電池放電的時候,出於數據安全性的考慮,Cache Policy默認從WriteBack改成WriteThrough。這段時間會持續數小時或更久,IO性能會因此大幅下降,如果正好這個時間你有數據庫或其他大量IO壓力的服務,性能會急劇下降,如果系統沒有足夠的Capacity的話,嚴重的話會導致服務可用性的賁潰。

為了防止出現這種情況,通常業內大家會使用各種想法:

a) 給系統留出足夠的Capacity,即使WriteThrough的時候也可以保障服務的性能是可接受的

b) 自動或半自動的地設定在系統負載最低的時候提前去觸發電池的充放電過程

c) 將Cache Policy設置為CachedBadBBU,也就是即使在充放電過程中,還是使用寫入Cache的WriteBack,而不是默認的WriteThrough,這存在的風險是這一過程中的服務器電源中斷會造成數據丟失,這不是一個最安全的選擇,但如果業務上可以接受這個風險,如果Data Center的供電足夠安全,如果服務器有冗餘的電源的話,未必不是一個好的選擇。

d) 當A服務器發生這一情況時能自動或半自動地切換到Backup的節點上,必竟二臺服務器同時發生這一自動維護過程是不太可能的,但同一批次的服務器是有可能的,並且這可以從時間和過程中去人工調節。

e) 從軟件、業務程序上來保障對數據持久性或一致性的取捨。

目前國內大家常用的DELL和HP服務器多數都已經集成了LSI公司的Raid控制器,以上的這些狀態和Policy的調整在Linux中都可以通過其MegaCLI工具包操作:

$3, ZMCP,CacheCade技術的原理和應用

單從硬件運維角度來看,BBU和TBBU帶來的Cache Policy問題如果在幾百臺或上千臺服務器環境下維護將會是一個非常繁瑣的過程,除非從軟件上來對安全性和數據一致性的取捨。

所以新的一代的Raid控制器出現了另一種選擇。其中Adaptec公司提供了ZMCP模塊,而LSI公司提供了CacheCade的軟件支持。

ZMCP就是Zero-Maintenance Cache Protection的意思,在支持ZMCP的Raid控制器上加裝一個ZMCP模塊將不再依賴電池對Cache Memory的保護,而是通過SLC的Flash NAND和電容來保證在電力中斷時數據的可靠性:

而LSI的CacheCade是一個軟件的License,可以支持通過SSD來持久化Cache Memory,而不是通過不能持久化的Memory。優點是可以讓Cache Memory更大,並缺點也顯而易見。

從性能上的測試來看明顯ZMCP會占有優勢,但同時也是成本上的劣勢。而且無論是哪種新的技術都暫時性地會帶來相對BBU/TBBU技術的成本增加,出於成本上的考慮,所以目前大部分DELL/HP服務器依舊會OEM原有的方案。

但是從更專業的業務環境下去定制的服務器上,在軟件、性能、硬件等方面做更合適自己的取舎將是給每個人更自由的選擇範圍。在此希望我在實踐和看到的information希望能給到大家有益的幫助。

$4, 引用和參考資料