单机箱。十六万亿字节。
最近我需要大量的磁盘空间,我决定用现成的零部件自己构建一台 16TB 服务器。结果证明这是一个有益的项目,因为它涉及许多有趣的主题,包括硬件 RAID、XFS、SATA 以及与大型文件系统相关的系统管理问题。
我想要整合我用于磁盘到磁盘备份的几台 Linux 文件服务器。这些服务器都在 3-4TB 范围内,并且经常耗尽空间,这迫使我要么调整哪些系统备份到哪个服务器,要么减少我可以保留在手边的先前备份数量。 我这个项目的总体目标是创建一个具有大量廉价、快速且可靠的磁盘空间的系统。该系统将成为来自 Solaris、Linux 和 Windows 服务器混合环境的多个每日磁盘到磁盘备份的目标位置。我熟悉 Linux 的软件 RAID 和 LVM2 功能,但我特别想要硬件 RAID,这样操作系统就可以“不知道” RAID 控制器的存在。这些功能当然比基于软件的 RAID 系统成本更高,并且本文不是关于为给定数量的磁盘空间创建最便宜的可能解决方案。
硬件 RAID 控制器将使非 Linux 管理员尽可能简单地更换故障磁盘。RAID 控制器将发送一封电子邮件消息,警告有关磁盘故障,管理员通常会通过识别故障磁盘的位置并更换它来响应,所有这些操作都无需停机,也无需 Linux 管理技能。整个磁盘更换体验将仅限于 RAID 控制器卡的 Web 界面。
实际上,热备盘会自动更换任何故障磁盘,但仍需要使用 RAID Web 界面来将任何新插入的磁盘指定为替换热备盘。对于我的公司,我对 Linux 管理技能的可用性有特别的担忧,这证明了硬件 RAID 的费用是合理的。
对我来说,上述要求意味着使用热插拔 1TB SATA 驱动器,配备快速 RAID 控制器,安装在具有体面 CPU、足够内存和冗余电源的系统中。机箱必须是机架式安装且易于维护。噪音不是一个因素,因为该系统将位于一个专用的机房中,其中有一百多台其他服务器。
我决定围绕 3ware 9560 16 端口 RAID 控制器构建系统,这需要一个具有足够“通道”(在本例中为 8 个)的 PCI Express 插槽的主板。 除此之外,我不太关心 CPU 选择或集成主板功能(千兆以太网除外)。由于我已决定使用 16 个磁盘,因此这个选择几乎决定了采用 3U 或更大的机箱来安装前置热插拔磁盘。 这也意味着机箱内有足够的空间容纳一个全高 PCI 卡。
我构建了绝大多数机架式服务器(超过一百台),都使用了 Supermicro 硬件,所以我对其产品线非常熟悉。过去,我一直使用 Supermicro 的“准系统”单元,它们已经集成了主板、电源、风扇和机箱。
对于这个项目,我找不到具有我所需的确切功能集的预构建准系统型号。我正在寻找一个具有大量廉价磁盘容量的系统,但不需要大量的 CPU 功率和内存容量——大多数高端配置似乎都假定为四核 CPU、大量内存和 SAS 磁盘。Supermicro SC836TQ-R800B 机箱看起来很适合我,因为它在一个 3U 机箱中包含 16 个 SATA 驱动器,并具有冗余电源(后缀 B 表示黑色前面板)。
接下来,我选择了 X7DBE 主板。该型号允许我使用相对便宜的双核 Xeon CPU,并有八个内存插槽可用。 我可以使用廉价的 1GB 模块放入 8GB 的 RAM。我选择使用单个 1.6GHz Intel 双核 Xeon 作为处理器,因为我认为我无法证明为文件服务器角色支付多个 CPU 或顶级四核型号的成本是合理的。
我仔细检查了 Supermicro 机箱的描述,以确保机箱中包含 CPU 散热器。对于 SC836TQ-R800B,散热器必须单独订购。
我想要尽可能好的 RAID 性能,这意味着在 RAID 控制器中使用“回写”设置,而不是“直写”。回写缓存的优点是它应该通过首先写入 RAM,然后再写入磁盘来提高写入性能,但缺点是如果系统在数据实际写入磁盘之前崩溃,则可能会丢失数据。
3ware 9560 RAID 控制器的电池备份单元 (BBU) 选项通过跨重启保留缓存的数据来保护这些数据免受丢失。
我使用各种价格比较网站找到了所有硬件,但无法找到一家供应商拥有我需要的所有组件的库存。请注意,这些价格比较网站上的库存指示并不可靠。我通过电话跟进了大件商品,以确保它们在网上订购之前实际上有库存。表 1 显示了详细信息。
表 1. 零件清单
数量 | 描述 | 来源 | 单价 | 总价 |
---|---|---|---|---|
1 | Intel Xeon 5110 Woodcrest 1.6GHz | Newegg | $211 | $211 |
1 | Supermicro MB X7DBE-O | Newegg | $426 | $426 |
8 | ATP AP28K72S8BHE6S 1GB RAM 模块 | ATP | $65 | $520 |
1 | Supermicro 机箱 SC836TQ-R800B | Super Warehouse | $923 | $923 |
1 | 3ware 9650SE-16ML | Newegg | $919 | $919 |
1 | 3ware BBU-Module-04 | The Nerds | $109 | $109 |
1 | Supermicro 散热器 SNK-P0018 | Wired Zone | $30 | $30 |
16 | Seagate ST31000340AS | Newegg | $274 | $4,384 |
总计 | $7,311 |
如您从表 1 中所见,硬件 RAID 组件约占系统总成本的 1,000 美元。
机箱几乎是预组装好的。我必须插入一些额外的主板支架并安装机架安装导轨。我还掰掉了一些塑料冷却罩上的材料,以适应主板电源线。
组装主板、CPU、散热器、磁盘和内存的过程是传统的,因此我在此不赘述。
大多数 3ware 9650 控制器都使用“多通道”SATA 电缆,控制器上有一个单连接器,扇出成四根独立的 SATA 电缆。由于这是一个 16 端口控制器,因此四根多通道电缆连接到 SATA 背板。我首先卸下机箱冷却风扇,使连接 SATA 电缆的过程变得更加容易——它们非常容易弹出。我还必须卸下几个磁盘背板电源连接器才能访问最底部的 SATA 连接器。
务必将正确的 SATA 电缆连接到正确的 SATA 端口,因为这里的错误将是一场灾难。当需要更换磁盘时,您需要确定磁盘的物理位置,否则您将冒着破坏整个阵列的风险。在继续之前,请熟悉电缆和磁盘编号方案。例如,在我的控制器随附的四根多通道电缆组中,一根电缆的第一个端口标记为 0(并以 3 结尾),而其他三根电缆的第一个端口标记为 1(并以 4 结尾),而背板端口的编号从 0 开始(并以 15 结尾),编号最小的端口位于左下方(从正面看)。这似乎是一个特定于机箱的方案,因为其他 Supermicro 机箱型号的端口编号从左上角向下编号。SATA 端口在 3ware 管理界面中从 0 开始编号。3ware 管理工具有一个“闪烁”驱动器 LED 以定位特定驱动器的功能,但此功能在此特定 Supermicro 机箱中不受支持。
3ware BBU 通常安装在控制器卡上,但我发现除非电池上有充足的气流,否则控制器会开始抱怨电池温度过高。我购买了远程 BBU 选项,这是一个虚拟 PCI 卡,带有电池和一根从远程 BBU 延伸到主 RAID 控制器卡的延长线。我将电池安装在距 RAID 控制器几个 PCI 插槽的位置,以便尽可能凉爽。
我计划为操作系统创建一个传统的分区集,然后为系统备份文件(名为 backup)创建一个巨大的分区。
一些 RAID 供应商允许您从给定的物理磁盘阵列创建任意数量的虚拟磁盘。3ware 界面每个物理阵列仅允许两个虚拟磁盘(或卷)。当您创建物理阵列时,您通常最终会得到一个使用阵列全部容量的虚拟磁盘(例如,从两个 1TB 磁盘的 RAID 1 阵列创建虚拟磁盘会为您提供一个 1TB 的 /dev/sda 磁盘)。如果您想要两个虚拟磁盘,请为引导分区指定一个非零大小。第一个虚拟磁盘将在您为引导分区指定的大小中创建,第二个虚拟磁盘将是物理阵列容量减去引导分区的大小(例如,使用 1TB 磁盘,指定 150GB 引导分区会生成一个 150GB 的 /dev/sda 磁盘和一个 850GB 的 /dev/sdb 磁盘)。
您可以在操作系统启动之前(按 Alt-3)从 3ware 控制器 3dbm BIOS 界面执行整个 RAID 配置,或者在操作系统运行后使用 tw_cli 命令行或 3dm Web 界面(或这些的组合)。例如,您可以使用 BIOS 界面设置操作系统安装所需的最小阵列,然后在操作系统运行后使用 3dm Web 界面设置额外的阵列和热备用。
对于我的 16 驱动器系统,我决定在 RAID 5 阵列中使用 15 个驱动器。 剩下的第 16 个驱动器是热备盘。 使用此方案,在任何数据丢失之前,必须有三个磁盘发生故障(系统可以容忍一个阵列成员磁盘的丢失,然后可以容忍将替换它的热备盘的丢失)。我使用 3ware BIOS 界面创建了一个 100GB 的引导分区,这给了我一个虚拟 sda 磁盘和一个约 12.64TB 的虚拟 sdb 磁盘。
我发现系统在 RAID 阵列初始化期间非常慢。我没有记录时间,但 RAID 5 阵列的初始化似乎至少需要一天,甚至更长时间。我建议启动该过程并处理其他事情,直到它完成,否则您会对糟糕的交互性能感到沮丧。
我知道我必须为巨型数据分区使用 ext3 以外的东西,并且根据我在 Web 上找到的信息,XFS 看起来是最佳解决方案。我的大多数 Linux 经验都涉及 Red Hat 的 Linux Enterprise 发行版,但我很难找到有关添加 XFS 支持的信息。我特别想避免任何难以重现或复杂的事情。CentOS 似乎是最佳的操作系统选择,因为它利用了我的 Red Hat 经验,并且有一个添加 XFS 支持的简单过程。
对于项目系统,我使用 Kickstart 安装了操作系统。我创建了一个 Kickstart 文件,该文件使用传统的 msdos 磁盘标签和 ext3 文件系统在 /dev/sda 虚拟磁盘上自动创建了一个 6GB 的 /、150MB 的 /boot 和一个 64GB 的交换分区。(我通常会分配比这更少的交换空间,但根据经验,我发现 xfs_check 实用程序需要大约 26GB 的内存才能运行——任何更少的内存都会因“内存不足”错误而死机)。Kickstart 安装暂时忽略了 /dev/sdb 磁盘。 我本可以自动化所有磁盘分区和 XFS 配置通过 Kickstart,但我特别想手动玩转大分区的创建。一旦 Kickstart 操作系统安装完成,我手动添加了 XFS 支持,使用了以下 yum 命令
yum install kmod-xfs xfs-utils
此时,我从 3ware 网站下载并安装了 3ware tw_cli 命令行和 3dm Web 界面软件包。我使用 3dm Web 界面创建了热备盘。
接下来,我使用 parted 在 14TB 虚拟磁盘 /dev/sdb 上创建了一个带有单个 XFS 文件系统的 gpt 标记磁盘。使用 ext3 以外的东西的另一个论据是文件系统创建时间。例如,当我第一次在 ext3 和 XFS 下试验 3TB 测试分区时,mkfs 在 ext3 下花费了 3.5 小时,而在 XFS 下不到 15 秒。即使在 RAID 阵列初始化正在进行中,XFS mkfs 操作也非常快。
我使用以下命令来设置名为 /backup 的大分区,用于存储磁盘到磁盘备份
# parted /dev/sdb (parted) mklabel gpt (parted) mkpartfs primary xfs 0% 100% (parted) print Model: AMCC 9650SE-16M DISK (scsi) Disk /dev/sdb: 13.9TB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 17.4kB 13.9TB 13.9TB xfs primary (parted) quit # mkfs.xfs /dev/sdb1 # mount /dev/sdb1 /backup
接下来,我通过将其添加到 /etc/fstab 使挂载永久化。
我现在认为系统基本上可以正常工作了,剩下的配置工作专门与系统作为磁盘到磁盘备份服务器的角色相关。
我知道我可以使用带有 SAS 控制器的 SAS 驱动器来获得更好的性能,但 SAS 磁盘尚未在 SATA 提供的容量中提供,并且对于更少的磁盘空间而言,它们会贵得多。
对于这个项目,我选择了具有 16 端口 RAID 控制器的 16 驱动器系统。我确实找到了一个 Supermicro 24 驱动器机箱 (SC486) 和一个 3ware 24 端口 RAID 控制器 (9650SE-24M8),它们应该可以协同工作。看看如此大的系统是否存在任何性能缺点会很有趣,但这对于我目前的需求来说是过度的。
对于现有配置,仍然有很多选项和选择可能会产生比默认设置更好的性能。我没有追求所有这些,因为我需要尽快将这台特定的机器投入生产。我对将来探索性能改进很感兴趣,特别是如果该系统将由人交互使用(而不仅仅是在深夜进行自动备份)。
可能的性能调整领域包括以下内容
1) RAID 方案:我本可以使用不同的方案来获得更好的性能,但我认为 RAID 5 对于我的需求来说已经足够了。我认为 RAID 6 也可以工作,并且我最终会得到相同的磁盘空间量(假设有两个奇偶校验驱动器且没有热备盘),但我的理解是它会比 RAID 5 慢。
2) ext3/XFS 文件系统创建和挂载选项:我很难找到任何关于如何在给定情况下使 XFS 尽可能快的权威或明确的信息。就我而言,这是相对少量的大型(千兆字节)文件。我使用的挂载和 mkfs 选项来自我在各种讨论组中找到的示例,但我没有尝试验证它们的性能声明。例如,一些文章说 noatime、nodiratime 和 osyncisdsync 的挂载选项会提高性能。3ware 有一篇白皮书,内容涵盖使用较旧的 RAID 控制器型号优化 XFS 和 2.6 内核,但我尚未在我使用的控制器上尝试过这些建议。
3) 驱动器跳线:至少对我来说,一个惊喜是发现 Seagate 驱动器出厂时安装了 1.5Gbps 速率限制跳线。据我所知,驱动器文档没有说这是出厂默认设置,只是说“可以使用”。卸下此跳线使驱动器能够以 3.0Gbps 的速度与支持此速度的控制器(例如用于此项目的 3ware 9560)一起运行。我能够通过使用 3ware 3dm Web 界面(信息→驱动器)确认速度设置,但是当我尝试使用 tw_cli 查看相同信息时,它没有显示当前使用的速度
# tw_cli /c0/p0 show lspeed /c0/p0 Link Speed Supported = 1.5 Gbps and 3.0 Gbps /c0/p0 Link Speed = unknown
速率限制跳线很小,并且凹入驱动器背面。我最终在从插针上撬下跳线的过程中损坏或丢失了大部分跳线(在为此任务购买极长且尖头的尖嘴钳之前)。
4) RAID 卡设置:本机命令队列 (NCQ) 应该通过让驱动器电子设备重新排序命令以优化磁盘访问来提供更好的性能。我发现 NCQ 并非始终在 3ware 控制器上默认启用。可以使用 3dm 的“控制器设置”页面中的排队复选框或通过 tw_cli 手动启用它
# tw_cli /c0/u0 set qpolicy = on
当前设置可以在 3dm 中或通过使用 tw_cli 在每个驱动器的基础上进行验证
# tw_cli /c0/p5 show ncq /c0/p5 NCQ Supported = Yes /c0/p5 NCQ Enabled = Yes
5) Linux 内核设置:3ware 的知识库中有文章提到了一些内核设置,这些设置应该可以提高性能,但与默认设置相比,我还没有尝试过其中任何一个。
6) 操作问题:尽管所有 16 个磁盘都是相同的类型和固件版本,但其中一些磁盘未能正确显示其型号在各种 3ware 界面中。例如,大多数磁盘型号都正确显示——例如 ST31000340AS。但是,有几个在型号字段中显示“ST3 INVALID PFM”。您可以在 tw_cli 界面中看到这一点。例如,端口 4 正确显示型号,但端口 5 不显示
# tw_cli /c0/p4 show model /c0/p4 Model = ST31000340AS # tw_cli /c0/p5 show model /c0/p5 Model = ST3_INVALID_PFM
在混合驱动器类型的系统中,这种情况是无法容忍的,因为很难确定哪个驱动器类型插入了哪个端口。我能够确定问题出在驱动器固件版本上,并升级了所有表现出这种行为的驱动器。
由于系统在确定固件是问题所在之前已经在使用中,因此我需要一种在保持系统运行的同时升级每个驱动器的方法。我不能简单地在驱动器作为活动磁盘阵列的一部分时升级驱动器,因为 Seagate 声称升级可能会破坏数据。我使用 3ware 界面移除了问题驱动器,这迫使热备盘替换了它。RAID 控制器自动开始使用热备盘重建 RAID 5 阵列。然后,我从机箱中物理移除驱动器,并使用另一台计算机升级驱动器固件。升级后,我重新插入驱动器并将其指定为新的热备盘。阵列重建操作大约花费了六个小时才能完成,并且由于我一次只能移除和升级一个驱动器,因此我每天只能升级一个驱动器。
Eric Pearce 是 AmberPoint, Inc 的 IT 主管,该公司是一家位于加利福尼亚州奥克兰的 SOA 治理软件公司。他为 O'Reilly & Associates 撰写了几本关于 UNIX 和 Windows 系统管理的书籍。