使用 Linux 作为 SAN 提供商
存储区域网络 (SAN) 在行业中正变得越来越普遍。这项技术曾经仅限于大型数据中心和财富 100 强公司使用,但现在价格已经下降到小型初创公司也开始使用它们进行集中存储的程度。SAN 的严格定义是一组可通过网络在块级别访问的存储设备。这与网络附加存储 (NAS) 设备不同,NAS 运行自己的文件系统并将该卷呈现给网络;它不需要由客户端机器格式化。NAS 通常使用 NFS 或 CIFS 协议呈现,而运行在同一以太网上的 SAN 通常以 iSCSI 的形式呈现,尽管也存在其他技术。
iSCSI 是用于本地磁盘的相同 SCSI 协议,但封装在 IP 内部,使其能够像任何其他 IP 协议一样在网络上运行。因此,并且因为它被视为块设备,从客户端操作系统的角度来看,它通常与本地磁盘几乎没有区别,并且对应用程序完全透明。
iSCSI 协议在 RFC 3720 中定义,并通过 TCP 端口 860 和 3260 运行。除了 iSCSI 协议之外,许多 SAN 还实施光纤通道作为一种机制。这是对千兆以太网的改进,主要是因为它具有 4 或 8Gb/s 的速度,而不是 1Gb/s。同样,万兆以太网将比光纤通道更具优势。
光纤通道的缺点是成本高昂。光纤通道交换机的价格通常是典型以太网交换机的数倍,并且端口数量少得多。光纤通道还有其他优点,例如能够远距离运行,但这些通常不是购买 SAN 时的决定因素。
除了光纤通道和 iSCSI 之外,以太网上的 ATA (AoE) 也开始取得一些进展。正如 iSCSI 通过 IP 网络提供 SCSI 命令一样,AoE 通过以太网网络提供 ATA 命令。AoE 实际上是直接在以太网上运行,而不是像 iSCSI 那样在 IP 之上运行。因此,它的开销更少,并且在相同的环境中通常比 iSCSI 更快。缺点是它无法路由。AoE 也远不如 iSCSI 成熟,并且较少的大型网络公司正在寻求支持 AoE。AoE 的另一个缺点是它没有内置的安全措施,除了 MAC 过滤。由于伪造 MAC 地址相对容易,这意味着本地网络上的任何人都可以访问任何 AoE 卷。
迈向 SAN 的第一步是选择是否使用它。虽然 SAN 通常比 NAS 更快,但它的灵活性也较差。例如,NAS 的大小或文件系统通常可以在主机系统上更改,而无需客户端系统进行任何更改。对于 SAN,因为它被视为像本地磁盘一样的块设备,因此它受到与本地磁盘相同的许多规则的约束。因此,如果客户端在 iSCSI 设备上运行其 /usr 文件系统,则必须将其脱机并进行修改,不仅在服务器端,而且在客户端也需要修改。客户端将必须在设备之上扩展文件系统。
SAN 卷和本地磁盘之间存在一些显着差异。SAN 卷可以在计算机之间共享。通常,这会带来各种锁定问题,但是如果应用程序知道其卷已共享给多个系统,则这可能成为故障转移、负载平衡或通信的强大工具。存在许多旨在共享的文件系统。Red Hat 的 GFS 和 Oracle 的 OCFS(均为 GPL)是此类文件系统的绝佳示例。
网络是选择 SAN 时的另一个考虑因素。千兆以太网是运行现代网络存储的实际最低要求。虽然理论上 100 兆甚至 10 兆位的网络也可以工作,但实际结果会非常缓慢。如果您正在运行许多卷或需要对 SAN 进行大量读取和写入,请考虑运行专用的千兆网络。这将防止 SAN 数据与您的常规 IP 数据冲突,并且作为额外的奖励,可以提高存储的安全性。
安全也是一个需要关注的问题。由于主要的 SAN 协议都没有加密,因此网络嗅探器可能会暴露您的数据。理论上,iSCSI 可以通过 IPsec 或类似的协议运行,但是如果没有硬件加速,这样做将意味着性能的大幅下降。作为替代方案,至少需要将 SAN 数据保留在自己的 VLAN 上。
由于 iSCSI 是 Linux 可用的各种 SAN 协议中最受欢迎的,因此我在本文的示例中使用了 iSCSI。但是,如果您为系统选择了 AoE,这些概念应该很容易转移到 AoE。如果您选择了光纤通道,情况仍然相似,但没有那么相似。您将需要更多地依赖交换机进行大部分身份验证和路由。从积极的方面来看,大多数现代光纤通道交换机都为此提供了出色的设置工具。
到目前为止,我一直在使用术语客户端和服务器,但这对于 iSCSI 技术来说并不完全准确。在 iSCSI 世界中,人们将客户端称为发起者,将服务器或其他 iSCSI 存储设备称为目标。在这里,我使用 Open-iSCSI 项目来提供发起者,使用 iSCSI Enterprise Target (IET) 项目来提供目标。这些软件组件在大多数主要 Linux 发行版的默认存储库中都可用。请查阅您的发行版文档以获取要安装的软件包名称,或从 www.open-iscsi.org 和 iscsitarget.sourceforge.net 下载源代码。此外,您的内核中还需要 iSCSI over TCP/IP,可在低级 SCSI 驱动程序部分中选择。
在准备设置目标之前,您需要为其提供磁盘。这可以是物理磁盘,也可以创建磁盘映像。为了设置磁盘映像,请运行 dd 命令
dd if=/dev/zero of=/srv/iscsi.image.0 bs=1 seek=10M count=1
此命令创建一个大约 10MB 的文件,名为 /srv/iscsi.image.0,其中填充了零。这将代表第一个 iscsi 磁盘。要创建另一个,请执行以下操作
dd if=/dev/zero of=/srv/iscsi.image.1 bs=1 seek=10M count=1
IET 软件的配置位于 /etc/ietd.conf 中。虽然该文件中提供了许多调整选项,但重要的行实际上只是目标名称和 LUN。对于每个目标,导出的磁盘必须具有唯一的 LUN。目标名称采用特殊格式。此名称的正式术语是 iSCSI Qualified Name (IQN)。
格式是
iqn.yyyy-mm.(reversed domain name):label
其中 iqn 是必需的,yyyy 表示四位数的年份,后跟 mm(两位数的月份)和反向域名,例如 org.michaelnugent。标签是用户定义的字符串,以便更好地识别目标。
这是一个示例 ietd.conf 文件,使用上面创建的映像和一个物理磁盘 sdd
Target iqn.2009-05.org.michaelnugent:iscsi-target IncomingUser michael secretpasswd OutgoingUser michael secretpasswd Lun 0 Path=/srv/iscsi.images.0,Type=fileio Lun 1 Path=/srv/iscsi.images.1,Type=fileio Lun 2 Path=/dev/sdd,Type=blockio
IncomingUser 在发现期间用于验证 iSCSI 发起者。如果未指定,则允许任何发起者连接以打开会话。OutgoingUser 在发现期间用于验证目标到发起者。为了简单起见,我在本示例中使它们相同,但它们不必相同。请注意,RFC 要求这两者都为 12 个字符长。Microsoft 发起者严格执行此操作,但 Linux 发起者不执行。
使用以下命令启动服务器/etc/init.d/iscsitarget start(这可能会因您的发行版而异)。运行ps ax | grep ietd将显示服务器正在运行。
现在您可以继续设置发起者以接收来自目标的数据。要设置发起者,请将其名称(以 IQN 格式)放在 /etc/iscsi/initiatorname.iscsi 文件(或可能是 /etc/initiatorname.iscsi)中。格式良好的文件示例如下
InitiatorName=iqn.2009-05.org.michaelnugent:iscsi-01
此外,您还需要修改 /etc/iscsi/iscsid.conf 文件,以匹配上面在 ietd.conf 文件中设置的用户名和密码
node.session.auth.authmethod = CHAP node.session.auth.username = michael node.session.auth.password = secretpasswd node.session.auth.username_in = michael node.session.auth.password_in = secretpasswd discovery.sendtargets.auth.authmethod = CHAP discovery.sendtargets.auth.username = michael discovery.sendtargets.auth.password = secretpasswd discovery.sendtargets.auth.username_in = michael discovery.sendtargets.auth.password_in = secretpasswd
完成此操作后,运行 iscsiadm 命令以发现目标。
iscsiadm -m discovery -t sendtargets -p 192.168.0.1 -P 1
这应输出以下内容
Target: iqn.2009-05.org.michaelnugent:iscsi-target Portal: 192.168.0.1:32360,1 IFace Name: default
现在,在任何时候,您都可以运行
iscsiadm -m node -P1
这将重新显示目标信息。
现在,运行/etc/init.d/iscsi restart。这样做将连接到新的块设备。运行dmesg和fdisk -l来查看它们。因为这些是原始块设备,所以它们看起来像 Linux 的物理磁盘。它们将显示为下一个 SCSI 设备,例如 /dev/sdb。它们仍然需要分区和格式化才能使用。完成此操作后,正常挂载它们即可使用。
这设置了平均 iSCSI 卷。但通常,您可能希望机器完全无盘运行。为此,您还需要在 iSCSI 上运行 root。这有点复杂。最简单但更昂贵的方法是使用内置 iSCSI 的网卡。这允许网卡挂载卷并呈现它,而无需进行任何额外的工作。缺点是,这些网卡比普通网卡贵得多。
要创建没有支持 iSCSI 的网卡的无盘系统,您需要使用 PXE 启动。这需要 DHCP 服务器可用,以便发起者接收地址。该 DHCP 服务器必须引用 TFTP 服务器,以便机器下载其内核和初始 ramdisk。该内核和 ramdisk 将包含 iSCSI 和发现信息。这使普通的支持 PXE 的网卡能够充当更昂贵的支持 iSCSI 的网卡。
与 iSCSI 一起运行的另一个功能是多路径。这允许 Linux 同时使用多个网络来访问 iSCSI 目标。它通常在单独的物理网络上运行,因此,如果一个网络发生故障,另一个网络仍然可以使用,并且发起者不会遇到卷丢失或系统崩溃的情况。多路径可以通过两种方式设置,即主动/被动或主动/主动。主动/主动通常是首选方式,因为它可以设置为不仅用于冗余,还用于负载平衡。与光纤通道一样,多路径为设备分配全球通用标识符 (WWID)。这些标识符保证是唯一的且不变的。当其中一条路径被移除时,另一条路径继续运行。发起者可能会遇到较慢的响应时间,但它将继续运行。重新集成第二条路径使系统能够恢复到正常状态。
在使用本地磁盘时,人们通常会转向 Linux 的软件 RAID 或 LVM 系统,以提供冗余、扩展和快照。由于 SAN 卷显示为块设备,因此也可以在它们上使用这些工具。但是,请谨慎使用它们。跨三个 iSCSI 卷设置 RAID 5 会导致大量的网络流量,并且几乎永远不会给您带来您期望的结果。但是,如果您有足够的可用带宽并且您不进行太多写入,则跨多个 iSCSI 卷设置 RAID 1 可能并非完全不可能。如果其中一个卷掉线,则重建可能是一个昂贵的过程。如果您处于生产环境中,请注意为重建阵列分配多少带宽。请注意,这可以与多路径同时使用,以增加您的带宽。
要在 iSCSI 上设置 RAID 1,首先加载 RAID 1 模块
modprobe raid1
在对您的第一个磁盘 /dev/sdb 进行分区后,将分区表复制到您的第二个磁盘 /dev/sdc。请记住将分区类型设置为 Linux RAID 自动检测
sfdisk -d /dev/sdb | sfdisk /dev/sdc
假设您只设置了一个分区,请使用 mdadm 命令创建 RAID 组
mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/sdb1 /dev/sdc1
之后,cat/etc/mdstat 文件以监视 iSCSI 卷同步的状态。这也是衡量您的网络吞吐量以查看其是否能在生产条件下运行的良好时机。
Michael Nugent 花费了大量时间来设计适合微薄预算的大规模解决方案,利用 Linux 来履行通常由大型商业设备承担的角色。最近,Michael 一直致力于为金融行业的 SaaS 环境设计大型私有云。在不构建系统时,他喜欢帆船运动、水肺潜水和与他的猫 MIDI 一起玩。可以通过 michael@michaelnugent.org 联系到 Michael。