精通以太网ATA (ATA over Ethernet)
在过去,当您想要将外部块存储设备连接到服务器时,您会将其作为逻辑单元 (LU) 映射到存储区域网络 (SAN) 上。早期,您会通过光纤通道 (FC) 协议执行此操作。最近,iSCSI (基于 IP 的 SCSI) 在大多数数据中心已经取代了 FC。虽然这些协议稳定、功能丰富且功能齐全,但它们构建在多个层之上,并且极其复杂。真正掌握这些技术需要一定程度的专业知识。因此,Brantley Coile 公司编写了以太网ATA (AoE) 规范。该标准发布至今已超过十年。正是 Brantley Coile 本人将这项技术用作他当时的新创业公司 Coraid(后来更名为 Brantley Coile 公司)的基础框架。从那时起,该框架已在通用公共许可证第 2 版 (GPLv2) 下开源,并向公众开放。
AoE 吸引人的地方主要是它的简洁性。它被编写为在网络 OSI 模型的数据链路层(第 2 层)中运行。这意味着它不受任何互联网协议 (IP) 开销(即网络层或第 3 层)的影响。换句话说:通过 AoE 导出的块设备无法通过 IP 访问。由于没有额外的开销,因此在访问导出的块设备时,网络性能确实有所提高。这种不可路由性也增加了技术的安全性。为了访问卷,您需要物理连接到托管它们的以太网交换机。
至于数据如何在线路上传输,AoE 将传统的 ATA 命令封装在以太网帧中,并通过以太网网络发送它们,而不是 SATA 或 40 针带状电缆。
对于以下示例,您需要至少有两个运行任何 Linux 发行版的计算节点。其中一个节点将导出块设备。此节点将称为 Target(目标)。第二个节点将导入块设备,并将称为 Initiator(发起者)。
配置 Target(目标)大多数现代 Linux 发行版将在其本地仓库中提供整个 AoE 套件的二进制软件包,但如果您喜欢从源代码安装,您可以访问 OpenAoE 项目在 GitHub 上的新家。
要配置 Target(目标),您必须安装 AoE 服务器守护程序:vblade。在像 Debian 或 Ubuntu 这样的发行版上,运行以下命令
$ sudo aptitude install vblade
下一步是确定要导出的块设备和要通过其导出的以太网端口。vblade 应用程序服务非常灵活,可以与传统的块设备(如 sdb、sdc 等)、环回设备(loop0、loop1 等),甚至传统文件系统之上的文件一起使用,后者对 Initiator(发起者)来说看起来像任何其他块设备。
例如,如果您想通过以太网端口 enps0s3 导出 /dev/sdb,您将运行以下命令
$ sudo vblade 1 1 enps0s3 /dev/sdb
注意:vblade 执行二进制文件后面的数字值定义了块设备的主设备号和次设备号。这有点像 SCSI 逻辑单元号 (LUN) 的等效项。每个设备都需要具有唯一的主/次设备号组合才能在 Initiator(发起者)上正常运行。
现在,创建一个通用的空文件并导出它
$ dd if=/dev/zero of=aoe.block0 bs=1M count=128
$ sudo vblade 1 2 enps0s3 aoe.block0
注意:vblade 二进制文件不会作为后台守护程序运行。它在前台运行。如果您中断其执行,它将停止导出块设备。为了避免这种情况,您可以将服务置于后台(使用传统的 & 符号)或仅运行二进制文件的守护程序版本(使用相同的参数):vbladed。
配置 Initiator(发起者)安装 AoE 发起者实用程序。在 Debian/Ubuntu 上运行以下命令
$ sudo aptitude install aoetools
加载内核模块
$ sudo /sbin/modprobe aoe
此模块的功能与网络块设备 (NBD) 内核模块非常相似,因为它为客户端提供了一个可访问的块设备,但对该块设备的所有请求都通过网络传输。花一些时间研究内核模块选项也可能是有益的。请参考下面的 modinfo 摘录
$ modinfo aoe
filename: /lib/modules/4.4.0-72-generic/kernel/drivers/block/aoe/aoe.ko
version: 85
description: AoE block/char driver for 2.6.2 and newer 2.6 kernels
author: Sam Hopkins
license: GPL
srcversion: 668418429AE7969D1660B64
depends:
intree: Y
vermagic: 4.4.0-72-generic SMP mod_unload modversions
parm: aoe_iflist:aoe_iflist=dev1[,dev2...] (string)
parm: aoe_dyndevs:Use dynamic minor numbers for devices. (int)
parm: aoe_deadsecs:After aoe_deadsecs seconds, give up and fail dev. (int)
parm: aoe_maxout:Only aoe_maxout outstanding packets for every MAC on eX.Y.
(int)
parm: aoe_maxsectors:When nonzero, set the maximum number of sectors per I/O
request (int)
例如,如果 Target(目标)服务器上的守护程序中断或退出,则对 Initiator(发起者)的 AoE 块设备的挂起请求将无限期地挂起——至少在守护程序重新启动之前是这样。为了避免这种情况,您可以轻松地设置超时值。在以下示例中,我将此超时值设置为 10 秒
$ sudo /sbin/modprobe aoe aoe_deadsecs=10
一旦这 10 秒过去,就会为任何挂起的操作发出 I/O 错误,并向上返回到调用应用程序的软件堆栈。
因此,您有一个 Target(目标)服务器导出 AoE 目标卷。使用 AoE 用户空间管理实用程序,定义要从中扫描/导入这些卷的所需接口
$ sudo aoe-interfaces enp0s3
您可以通过在每次重新启动时更新 /etc/default/aoetools 配置文件的 INTERFACES
字段并将单词 “none” 替换为该接口来轻松避免这种情况。在我的例子中,这是 enp0s3
$ sudo sed -i "s/INTERFACES=.*/INTERFACES='enp0s3'/" /etc/default/aoetools
为了使其生效,启动服务
$ sudo service aoetools start
使此服务在每次重新启动时启动在不同的 Linux 平台之间会有所不同。在传统的 init 和 systemd init 服务之间也会有所不同。我建议您参考您的发行版文档以获取这些说明。
无论如何,现在是时候扫描网络中任何 AoE 卷并导入它们了
$ sudo aoe-discover
要列出已发现的内容,请在命令行中键入以下命令
$ sudo aoe-stat
e1.1 0.134GB enp0s3 1024 up
e1.2 0.134GB enp0s3 1024 up
默认情况下,这些块设备通过 /dev/etherd 目录路径访问(请注意主设备号/次设备号)
$ ls /dev/etherd/e1*
/dev/etherd/e1.1 /dev/etherd1.2
并且,它将像任何其他块设备一样工作
$ sudo mkfs.ext4 /dev/etherd/e1.1
$ sudo mount /dev/etherd/e1.1 /mnt
很简单,对吧?难怪许多存储和数据中心管理员选择这项技术而不是更复杂的 SAN。