内核 Korner - 以太网上的 ATA:将硬盘驱动器放在局域网上

作者:Ed L. Cashin

每个人都会在某个时候用完磁盘空间。幸运的是,硬盘驱动器变得越来越大且越来越便宜。即便如此,磁盘空间越多,我们使用的就越多,很快我们又会用完。

某些类型的数据本质上是巨大的。例如,视频总是占用大量空间。企业通常需要存储视频数据,尤其是在数字监控变得越来越普遍的情况下。即使在家里,我们也喜欢在电脑上观看和制作电影。

备份和数据冗余对于任何使用计算机的企业都至关重要。似乎无论存储容量有多大,总是希望有更多。即使是电子邮件也可能超过我们放入的任何容器,正如互联网服务提供商非常清楚的那样。

当磁盘从盒子里出来,将存储与使用它的计算机分离时,无限存储成为可能。解耦相关组件以实现更大灵活性的原则出现在许多领域,而不仅仅是数据存储。模块化源代码可以更灵活地用于满足不可预见的需求,并且由组件组成的立体声系统可以比一体式立体声盒实现更有趣的配置。

最常见的开箱即用存储示例可能是存储区域网络 (SAN)。我记得 SAN 开始引起轰动的时候;很难超越炒作,找出它们到底是什么。当我最终做到时,我有点失望地发现 SAN 复杂、专有且昂贵。

但在支持这些 SAN 的过程中,Linux 社区对内核进行了有益的更改。2.4 内核版本的企业版为 2.6 内核的新功能开发提供了信息,而今天的稳定内核具有许多我们几年前还缺乏的能力。它可以使用巨大的块设备,远远超过旧的 2TB 限制。它可以支持更多同时连接的磁盘。还有对复杂存储卷管理的支持。此外,文件系统现在可以增长到巨大的大小,即使在挂载和使用时也是如此。

本文介绍了一种利用这些新内核功能的新方法,将磁盘从计算机中取出,并克服以前对存储使用和容量的限制。您可以将以太网上的 ATA (AoE) 视为一种用以太网网络替换 IDE 电缆的方式。由于存储与计算机分离,并且两者之间具有以太网的灵活性,因此可能性仅受您的想象力和学习新事物的意愿的限制。

什么是 AoE?

以太网上的 ATA 是一种网络协议,在 IEEE 中注册为以太网协议 0x88a2。AoE 是低级的,比 TCP/IP 甚至 IP 简单得多。TCP/IP 和 IP 对于通过互联网可靠地传输数据是必要的,但计算机必须更加努力地处理它们引入的复杂性。

iSCSI 的用户已经注意到 TCP/IP 的这个问题。iSCSI 是一种通过 TCP/IP 发送 I/O 的方式,以便可以使用廉价的以太网设备代替光纤通道设备。许多 iSCSI 用户已经开始购买 TCP 卸载引擎 (TOE)。这些 TOE 卡很昂贵,但它们减轻了使用 iSCSI 的机器执行 TCP/IP 的负担。

一个有趣的观察是,大多数时候,iSCSI 实际上并没有通过互联网使用。如果数据包只需要到达隔壁机架中的机器,那么重量级的 TCP/IP 协议似乎有些杀鸡用牛刀了。

因此,与其卸载 TCP/IP,为什么不完全放弃它呢?以太网上的 ATA 协议正是这样做的,它利用了当今智能以太网交换机的优势。现代交换机具有流量控制,可最大限度地提高吞吐量并限制数据包冲突。在局域网 (LAN) 上,数据包顺序得到保留,并且每个数据包都由网络硬件进行校验和以确保完整性。

每个 AoE 数据包都携带一个 ATA 驱动器的命令或来自 ATA 驱动器的响应。AoE Linux 内核驱动程序执行 AoE,并将远程磁盘作为正常的块设备提供,例如 /dev/etherd/e0.0,就像 IDE 驱动程序使 IDE 电缆末端的本地驱动器作为 /dev/hda 提供一样。驱动程序在必要时重新传输数据包,因此对于内核的其余部分而言,AoE 设备看起来像任何其他磁盘。

除了 ATA 命令之外,AoE 还具有一个简单的工具,可以使用查询配置数据包来识别可用的 AoE 设备。这就是全部:ATA 命令数据包和查询配置数据包。

任何使用过或了解过 SAN 的人都可能在此时想知道,“如果所有磁盘都在局域网上,那么我如何限制对磁盘的访问?” 也就是说,我如何确保如果机器 A 被入侵,机器 B 的磁盘仍然安全?

答案是 AoE 不可路由。您可以通过设置临时以太网网络轻松确定哪些计算机可以看到哪些磁盘。由于 AoE 设备没有 IP 地址,因此创建隔离的以太网网络非常简单。只需启动一个交换机并开始插入东西即可。此外,现在许多交换机都具有基于端口的 VLAN 功能,该功能允许将交换机有效地划分为单独的隔离广播域。

AoE 协议非常轻量级,即使是廉价的硬件也可以使用它。目前,Coraid 是 AoE 硬件的唯一供应商,但其他硬件和软件开发人员应该很高兴地发现 AoE 规范只有八页长。这种简单性与 iSCSI 形成鲜明对比,iSCSI 在数百页中指定,包括加密功能、路由、基于用户的访问等等的规范。复杂性是有代价的,现在我们可以选择是否需要复杂性,或者是否更愿意避免其成本。

简单的原语可以是强大的工具。Linux 用户学习到即使使用简单的 AoE,一旦存储可以驻留在网络上,也会出现一系列令人眼花缭乱的可能性,这可能不会令人感到意外。让我们从一个具体的例子开始,然后讨论一些可能性。

斯坦,档案管理员

以下示例基于真实故事。斯坦是一位为州政府工作的虚构系统管理员。新的州法律要求所有官方文件永久存档。任何州居民都可以随时要求查看任何官方文件。因此,斯坦需要巨大的存储容量,并且可以无限增长。但是,存储的性能不需要比本地 ATA 磁盘更好。他希望所有数据都可以轻松且立即检索。

斯坦对以太网网络和 Linux 系统管理很熟悉,因此他决定尝试以太网上的 ATA。他购买了一些设备,为以下所有设备支付了略低于 6,500 美元的价格

  • 一块双端口千兆以太网卡,用于替换服务器中旧的 100Mb 卡。

  • 一台具有两个千兆端口的 26 端口网络交换机。

  • 一个 Coraid EtherDrive 机架和十个 EtherDrive 刀片。

  • 十个 400GB ATA 驱动器。

十个刀片的机架占用三个机架单元。每个 EtherDrive 刀片都是一台小型计算机,它执行 AoE 协议以有效地将一个 ATA 磁盘放在局域网上。在机架中的十个刀片上条带化数据产生的吞吐量与本地 ATA 驱动器大致相同,因此千兆链路有助于有效地利用吞吐量。尽管他可以将 EtherDrive 刀片放在与其他人相同的网络上,但他已决定将存储放在其自己的网络上,连接到服务器的第二个网络接口 eth1,以提高安全性和性能。

斯坦阅读了 Linux 软件 RAID HOWTO(请参阅在线资源),并决定使用 RAID 10(跨镜像对条带化)配置。尽管此配置不会产生像 RAID 5 配置那样多的可用容量,但 RAID 10 最大限度地提高了可靠性,最大限度地降低了执行 RAID 的 CPU 成本,并且如果一个磁盘发生故障,则阵列重新初始化时间更短。

在阅读 LVM HOWTO(请参阅资源)之后,斯坦提出了一个避免永远用完磁盘空间的计划。JFS 是一种可以动态增长到很大尺寸的文件系统,因此他打算将 JFS 文件系统放在逻辑卷上。逻辑卷现在仅驻留在一个物理卷上。该物理卷是 RAID 10 块设备。RAID 10 是使用 Linux 软件 RAID 从 Coraid 机架中的 EtherDrive 存储刀片创建的。稍后,他可以购买另一个完整的机架,创建另一个 RAID 10,将其制成物理卷,并使用新的物理卷来扩展 JFS 所在的逻辑卷。

清单 1 显示了斯坦用于准备其服务器以执行以太网上的 ATA 的命令。他构建了 AOE_PARTITIONS=1 的 AoE 驱动程序,因为他正在使用运行 2.6 内核的 Debian sarge 系统。Sarge 尚不支持大型次设备号(请参阅次设备号侧边栏),因此他关闭了磁盘分区支持,以便能够使用更多磁盘。此外,由于 Debian 错误 292070,斯坦安装了最新的设备映射器和 LVM2 用户空间软件。

清单 1. 从多个 AoE 驱动器构建软件 RAID 设备的第一步是设置 AoE。

# setting up the host for AoE

# build and install the AoE driver
tar xvfz aoe-2.6-5.tar.gz
cd aoe-2.6-5
make AOE_PARTITIONS=1 install

# AoE needs no IP addresses!  :)
ifconfig eth1 up

# let the network interface come up
sleep 5

# load the ATA over Ethernet driver
modprobe aoe

# see what aoe disks are available
aoe-stat

次设备号

想要使用设备的程序通常通过打开与该设备对应的特殊文件来执行此操作。一个熟悉的例子是 /dev/hda 文件。一个ls -l命令显示 /dev/hda 的两个数字,3 和 0。主设备号是 3,次设备号是 0。/dev/hda1 文件的次设备号为 1,主设备号仍然为 3。

在内核 2.6 之前,次设备号的大小为 8 位,将可能的次设备号限制为 0 到 255。没有人有那么多设备,因此这种限制无关紧要。现在磁盘已与服务器分离,这很重要,内核 2.6 使用 20 位作为次设备号。

对于使用许多设备的系统来说,拥有 1,048,576 个次设备号的值有很大的帮助,但并非所有软件都赶上了。如果 glibc 或特定应用程序仍然认为次设备号的大小为 8 位,那么您在使用超过 255 的次设备号时会遇到麻烦。

为了帮助度过这个过渡时期,AoE 驱动程序可以在没有分区支持的情况下进行编译。这样,每个磁盘不是有 16 个次设备号,而是每个磁盘只有一个。因此,即使在尚未赶上 2.6 大型次设备号的系统上,您仍然可以使用多达 256 个 AoE 磁盘。

用于创建文件系统及其逻辑卷的命令如清单 2 所示。斯坦决定将卷组命名为 ben,将逻辑卷命名为 franklin。LVM2 现在需要对其配置进行一些调整。首先,它需要一行types = [ "aoe", 16 ]以便 LVM 识别 AoE 磁盘。接下来,它需要md_component_detection = 1,因此当整个 RAID 10 成为物理卷时,RAID 10 内部的磁盘将被忽略。

清单 2. 设置软件 RAID 和 LVM 卷组

# speed up RAID initialization
for f in `find /proc | grep speed`; do
        echo 100000 > $f
done

# create mirrors (mdadm will manage hot spares)
mdadm -C /dev/md1 -l 1 -n 2 \
        /dev/etherd/e0.0 /dev/etherd/e0.1
mdadm -C /dev/md2 -l 1 -n 2 \
        /dev/etherd/e0.2 /dev/etherd/e0.3
mdadm -C /dev/md3 -l 1 -n 2 \
        /dev/etherd/e0.4 /dev/etherd/e0.5
mdadm -C /dev/md4 -l 1 -n 2 -x 2 \
        /dev/etherd/e0.6 /dev/etherd/e0.7 \
        /dev/etherd/e0.8 /dev/etherd/e0.9
sleep 1

# create the stripe over the mirrors
mdadm -C /dev/md0 -l 0 -n 4 \
        /dev/md1 /dev/md2 /dev/md3 /dev/md4

# make the RAID 10 into an LVM physical volume
pvcreate /dev/md0

# create an extendible LVM volume group
vgcreate ben /dev/md0

# look at how many "physical extents" there are
vgdisplay ben | grep -i 'free.*PE'

# create a logical volume using all the space
lvcreate --extents 88349 --name franklin ben

modprobe jfs
mkfs -t jfs /dev/ben/franklin
mkdir /bf
mount /dev/ben/franklin /bf

我在具有两个 2.1GHz Athlon MP 处理器和 1GB RAM 的 Debian sarge 系统上复制了斯坦的设置,使用了 Intel PRO/1000 MT 双端口 NIC 和微不足道的 40GB 驱动器。网络交换机是 Netgear FS526T。通过 Coraid 机架中八个 EtherDrive 刀片的 RAID 10,我看到了 23.58MB/s 的可持续读取吞吐量和 17.45MB/s 的写入吞吐量。每次测量都是在通过将 1GB 文件复制到 /dev/null 来刷新页面缓存后进行的,并且写入时间中包含了一个 sync 命令。

在本例中,RAID 10 有四个条带元素,每个元素都是一对镜像驱动器。一般来说,您可以通过考虑有多少条带元素来轻松估算 EtherDrive 刀片集合的吞吐量。对于 RAID 10,条带元素的数量是磁盘数量的一半,因为每个磁盘都镜像在另一个磁盘上。对于 RAID 5,实际上有一个磁盘专用于奇偶校验数据,其余磁盘用作条带元素。

预期的读取吞吐量是条带元素数量乘以 6MB/s。这意味着,如果斯坦最初购买了两个机架并构建了一个 18 刀片 RAID 10 而不是他的 8 刀片 RAID 10,他会期望获得略高于两倍的吞吐量。但是,斯坦不需要那么大的吞吐量,他希望从小规模开始,使用 1.6TB 文件系统。

清单 3 显示了斯坦在购买另一个机架时如何轻松扩展文件系统。清单未显示斯坦的 mdadm-aoe.conf 文件或他的启动和关闭脚本。mdadm 配置文件告诉以监视模式运行的 mdadm 进程如何管理热备件,以便它们随时可以替换任何镜像中的任何故障磁盘。请参阅 mdadm 手册页中的备用组。

清单 3. 要在不卸载文件系统的情况下扩展文件系统,请设置第二个 RAID 10 阵列,将其添加到卷组,然后增加文件系统。

# after setting up a RAID 10 for the second shelf
# as /dev/md5, add it to the volume group
vgextend ben /dev/md5
vgdisplay ben | grep -i 'free.*PE'

# grow the logical volume and then the jfs
lvextend --extents +88349 /dev/ben/franklin
mount -o remount,resize /bf

启动和关闭脚本很容易创建。启动脚本只需组装每个镜像对 RAID 1,组装每个 RAID 0 并启动 mdadm 监视进程。关闭脚本停止 mdadm 监视器,停止 RAID 0,最后停止镜像。

共享块存储

现在我们已经看到了以太网上的 ATA 在实际应用中的一个具体示例,读者可能想知道如果另一台主机可以访问存储网络会发生什么。第二台主机可以挂载 JFS 文件系统并访问相同的数据吗?简短的答案是,“不安全!” JFS 与 ext3 和大多数文件系统一样,旨在由单个主机使用。对于这些单主机文件系统,当多个主机挂载相同的块存储设备时,可能会导致文件系统损坏。原因是缓冲区缓存,它在 2.6 内核中与页面缓存统一。

Linux 会尽可能积极地将文件系统数据缓存在 RAM 中,以避免使用速度较慢的块存储,从而获得显着的性能提升。如果您曾经运行过find命令两次在同一目录上,您就会看到这种缓存正在发挥作用。

某些文件系统旨在供多个主机使用。集群文件系统,顾名思义,具有某种方式来确保所有主机上的缓存与底层文件系统保持同步。GFS 是一个很棒的开源示例。GFS 使用集群管理软件来跟踪谁在访问文件系统的主机组中。它使用锁定来确保不同的主机在访问文件系统时进行协作。

通过使用集群文件系统(如 GFS),以太网网络上的多个主机可以使用以太网上的 ATA 访问相同的块存储。无需像 NFS 服务器之类的任何东西,因为每个主机都直接访问存储,从而很好地分配了 I/O。但是有一个障碍。任何时候您使用大量磁盘,您都会增加其中一个磁盘发生故障的可能性。通常,您使用 RAID 通过引入一些冗余来解决此问题。不幸的是,Linux 软件 RAID 不支持集群。这意味着网络上的每台主机都不能使用 mdadm 执行 RAID 10,并且事情只是简单地解决。

Linux 的集群软件正在飞速发展。我相信我们将在一年或两年内看到良好的集群感知 RAID。在此之前,对于使用 AoE 进行共享块存储的集群,有一些选择。基本思想是集中 RAID 功能。您可以购买一个或两个 Coraid RAIDblade,并让集群节点访问它们导出的存储。RAIDblade 可以管理它们后面的所有 EtherDrive 刀片。或者,如果您感到冒险,您也可以自己动手,使用 Linux 主机来执行软件 RAID,并通过以太网上的 ATA 导出由此产生的防磁盘故障的块存储本身。查看 vblade 程序(请参阅资源),以了解如何使用以太网上的 ATA 导出任何存储的软件示例。

备份

由于以太网上的 ATA 将廉价硬盘驱动器放在以太网网络上,因此一些系统管理员可能对在备份计划中使用 AoE 感兴趣。通常,备份策略涉及二级存储,即速度不如在线存储快,但也不像磁带那样难以访问的存储。以太网上的 ATA 使使用廉价 ATA 驱动器作为二级存储变得容易。

但是,由于硬盘驱动器如此便宜,并且看到我们有稳定的软件 RAID,为什么不将硬盘驱动器用作备份介质呢?与磁带不同,这种备份介质支持即时访问任何存档文件。

几种新的备份软件产品正在利用文件系统功能进行备份。通过使用硬链接,他们可以执行多个完整备份,其效率与增量备份相同。有关更多信息,请查看在线资源中的 Backup PC 和 rsync 备份链接。

结论

将廉价磁盘放在本地网络上是那些让您思考“为什么以前没有人这样做过?”的想法之一。但是,只有使用简单的网络协议,才能在没有昂贵硬件的情况下实际将存储与服务器分离,并且只有在本地以太网网络上,简单的网络协议才能工作。在单个以太网上,我们不需要像 TCP/IP 这样的成熟互联网协议的复杂性和开销。

如果您在本地网络上使用存储,并且如果通过创建以太网网络来配置访问就足够了,那么以太网上的 ATA 就是您所需要的全部。如果您在存储协议中需要加密、路由和基于用户的访问等功能,那么 iSCSI 也可能引起您的兴趣。

借助以太网上的 ATA,我们有了一个简单的替代方案,该方案直到现在才在 Linux 存储选项中明显缺席。简单性带来了可能性。AoE 可以是任何存储解决方案中的构建块,因此让您的想象力飞扬,并向我发送您的成功故事。

致谢

我非常感谢 Peter Anderson、Brantley Coile 和 Al Dixon 提供的有益反馈。另外还要感谢 Brantley 和 Sam Hopkins 开发出如此出色的存储协议。

本文的资源: /article/8201

Ed L. Cashin 自 1997 年以来一直在多个学术和专业 Linux 角色中漫游,包括 Web 应用程序开发人员、系统管理员和内核黑客。他现在在 Coraid 工作,以太网上的 ATA 在那里设计,可以通过 ecashin@coraid.com 与他联系。他喜欢音乐,并且喜欢在去武术课的路上听有声读物。

加载 Disqus 评论