FreeBSD 企业级 1 PB 存储

今天 FreeBSD 操作系统迎来了 26 周岁生日。6 月 19 日是 国际 FreeBSD 日。所以今天我准备了一些特别的内容 🙂。如何在真实硬件上使用 FreeBSD 构建企业级存储解决方案?这正是 FreeBSD 发挥其所有存储特性(包括 ZFS)优势的地方。

今天我将展示我如何基于 FreeBSD 系统构建所谓的企业级存储,同时提供逾 1 PB(拍字节)的原始存储容量。

我曾基于 FreeBSD 构建过各种存储相关系统:

这个项目有所不同。一台 4U 服务器最多能提供多少存储空间?事实证明,非常多!绝对大于 1 PB(1024 TB)的原始存储空间。

硬件

这些是 4U 服务器,带有 90-100 个 3.5 寸硬盘位,可以安装 1260-1400 TB 数据(使用 14 TB 硬盘)。此类系统示例有:

我会选择第一款 —— 简称 TYAN FA100。

logo-tyan.png

虽然之前的 GlusterFSMinio 集群是在虚拟硬件(甚至 FreeBSD Jail 容器)上搭建的,但这个项目使用了真实物理硬件。

该系统的规格如下:

整套系统价格约为 $65,000(含硬盘)。外观如下:

tyan-fa100-small.jpg

你需要长达 1200 mm 的机架机柜来放置这台巨兽 :🙂:

管理界面

所谓的 Lights Out 管理界面非常优秀。界面简洁、组织良好、响应迅速。可以创建多个独立用户账户,也可以连接外部用户服务,如 LDAP/AD/RADIUS。

n01.png

登录后,简洁的 Dashboard 在欢迎我们。

n02.png

可以获取各种 传感器 信息,包括系统组件温度。

n03

还可以查看 系统库存 信息,了解已安装硬件。

n04.png

有独立的 设置 菜单,用于各种配置选项。

n05.png

虽然是 2019 年,但只需 HTML5 的 远程控制(远程控制台),无需任何第三方插件如 Java/Silverlight/Flash 等,非常方便,也运行良好。

n06.png
n07.png

当然可以远程开关机或循环重启主机。

n08.png

维护 菜单用于 BIOS 更新。

n09.png

BIOS/UEFI

进入 BIOS/UEFI 后,可以选择从哪些硬盘启动。截图中显示为两块固态系统盘。

nas01.png

BIOS/UEFI 界面显示两个 Enclosures,实际上是两块 Broadcom SAS3008 控制器。一些硬盘连接到第一个 SAS 控制器,其余连接到第二个,他们称之为 Enclosures 而非控制器,原因不明。

nas05.png

FreeBSD 系统

我选择了最新的 FreeBSD 12.0-RELEASE 来进行安装。安装过程多“默认”,系统盘使用两块 SSD 做 ZFS 镜像,没有特别配置。

logo-freebsd.jpg

该安装当然支持 ZFS Boot Environments 功能,可实现安全升级和系统变更。

硬盘准备

在所有 90 块 12 TB 硬盘的可能方案中,我选择使用 RAID60 —— 当然这是 ZFS 的等效方案。每个 RAID6(raidz2)组使用 12 块硬盘,总共会有 7 个这样的组 —— 这样 ZFS 池将使用 84 块硬盘,剩下 6 块作为备用(SPARE)硬盘 —— 对我来说非常合适。硬盘分布大致如下。

下面是 FreeBSD 系统通过命令 camcontrol(8) 看到的这些硬盘情况。按连接的 SAS 控制器 —— scbus(4) 排序。

有人可能会问,当硬盘出现故障时如何识别是哪一块……这时 FreeBSD 的 <sesutil(8)> 命令就非常有用了。

第一条 sesutil(8) 命令关闭机箱中所有硬盘的位置指示灯。第二条命令则点亮了 da64 硬盘的识别灯。

我还会确保不会使用每块硬盘的全部容量。这个想法看似无意义,但设想以下情况:五块 12 TB 硬盘在三年后同时损坏,你无法获得相同型号的硬盘,只能用其他 12 TB 硬盘替代,甚至可能来自不同厂商。

单块 12 TB 硬盘共有 23437770752512 字节的扇区,总原始容量为 12000138625024 字节。

现在假设这些来自其他厂商的 12 TB 硬盘每块比原来的少 4 字节 —— ZFS 将不允许使用它们,因为容量不足。

因此我会将每块硬盘的容量设置为 11175 GB,大约比其总容量 11176 GB 少 1 GB。

下面是可以对所有 90 块硬盘执行此操作的命令。

配置 ZFS 池

接下来,我们需要创建 ZFS 池,这可能是我执行过的最长的 zpool 命令了 :🙂:

由于东芝 12 TB 硬盘使用 4k 扇区,我们需要将 vfs.zfs.min_auto_ashift 设置为 12 来强制使用该扇区大小。

ZFS 设置

由于该存储的主要用途是存放文件,我将使用 recordsize 的最大值之一 —— 1 MB —— 以获得更好的压缩比。

…但它也将作为 iSCSI 目标使用,在 iSCSI 中我们会使用原生的 4k 块,因此 iSCSI 设置为 4096 字节。

另外说明一下参数 redundant_metadata ,因为它不是很直观。引用 zfs(8) 手册中的说明。

从上面的文字可以看出,它主要在单设备池中有用,因为当我们基于 RAIDZ2(RAID6 等价)提供冗余时,就不需要保留额外的元数据副本。

这样做能提升写入性能。

为了记录——iSCSI 的 ZFS zvol 是通过如下命令创建的——作为稀疏文件,也称为 薄配置(Thin Provisioning) 模式。

由于我们有备用(SPARE)磁盘,我们还需要通过在 /etc/rc.conf 文件中添加 zfsd_enable=YES 来启用 zfsd(8) 守护进程。

我们还需要为池启用 autoreplace 属性,因为默认情况下它是 off

其他 ZFS 设置位于 /boot/loader.conf 文件中。由于该系统有 128 GB 内存,我们将允许 ZFS 使用其中的 50% 到 75% 作为 ARC。

配置网络

这正是我非常喜欢 FreeBSD 的地方。要设置 LACP 链路聚合,你只需在 /etc/rc.conf 文件中写 5 行。在 RHEL 上,你可能需要多个文件,每个文件还要写很多行。

Intel X710 DA-2 10GE 网卡在 FreeBSD 下由 ixl(4) 驱动完美支持。

intel-x710-da-2.jpg

配置 Cisco Nexus

这是启用 LACP 聚合所需的 Cisco Nexus 配置。

首先是端口设置。

… 现在进行聚合配置。

… 在第二台 Cisco Nexus NEXUS-2 交换机上也进行相同/类似配置。

FreeBSD 配置

这些是在 FreeBSD 系统上最重要的三个配置文件。

现在我将发布我在这台存储系统上使用的所有设置。

/etc/rc.conf 文件。

/boot/loader.conf 文件。

/etc/sysctl.conf 文件

目的

为什么要构建这种设备?因为它比购买“品牌”设备便宜得多。以 Dell EMC Data Domain 为例——而且不是“普通”的 Data Domain,而是几乎最高端的型号——至少是 Data Domain DD9300。它的价格至少要高十倍……容量更小,而且占用机架空间不是 4U,而是接近 14U,需要三个 DS60 扩展器。

但你实际上可以让这个 FreeBSD 企业存储 的行为类似于 Dell EMC Data Domain……或者比如他们的 Dell EMC Elastic Cloud Storage

Dell EMC CloudBoost 可以部署在你的 VMware 环境中,以提供 DDBoost 去重功能。然后你还需要 OpenStack Swift,因为它是支持的后端设备之一。

emc-cloudboost-swift-cover.png
emc-cloudboost-swift-support.png

FreeBSD 上的 OpenStack Swift 包大约落后现实 4-5 年(版本 2.2.2)(译注:目前版本已经更新了),所以这里你需要使用 Bhyve。

在这台 FreeBSD 企业存储 上可以创建 Bhyve 虚拟机,例如安装 CentOS 7.6 系统,然后在其中设置 Swift,这样完全可行。利用 20 个物理核心和 128 GB 内存,你几乎感觉不到虚拟机的存在。

这样,你可以使用 Dell EMC Networker,而存储成本却降低到了原来的十分之一还多。

以前我也写过关于 IBM Spectrum Protect (TSM) 的文章,这种 FreeBSD 企业存储对它也非常有利。我实际上也将这个基于 FreeBSD 的存储用作 IBM Spectrum Protect (TSM) 容器池目录的空间。通过 iSCSI 导出效果非常好。

你还可以将这个 FreeBSD 企业存储 与其他存储设备进行比较,比如 iXsystems TrueNASEXAGRID

性能

你肯定想知道这个 FreeBSD 企业存储 的性能水平 :🙂:

我会分享我收集到的所有性能数据。

网络性能

首先是网络性能。

我使用 iperf3 作为基准测试工具。

我在 FreeBSD 端启动服务器:

然后在 Windows Server 2016 机器上启动客户端:

这是在 MTU 1500 下的结果——不使用 Jumbo 帧 :😦:

不幸的是,这套系统只有一个物理 10GE 接口,但我也做了其他测试。使用两台单 10GE 接口的服务器,可以很好地饱和 FreeBSD 端的双 10GE LACP。

我还将 NFS 和 iSCSI 导出到 RHEL 系统。单个 10GE 接口下网络性能约为 500-600 MB/s。在 LACP 聚合下可以达到 1000-1200 MB/s。

磁盘子系统性能

现在是磁盘子系统。

先用一些简单的测试,使用 FreeBSD 自带工具 diskinfo(8)

现在我们已经知道单块磁盘的速度了。

接下来,让我们在 ZFS zvol 设备上重复同样的测试。

接近 3 GB/s —— 不错。

接下来进行更传统的测试 —— 不朽的 dd(8) 命令。

这是在 compression=off 设置下进行的测试。

单进程运行。

四个并发进程运行。

八个并发进程运行。

总结这些数据。

所以磁盘子系统在顺序写入时能够达到约 3.5 GB/s 的持续速度。这意味着如果想要完全饱和网络,需要再添加两个 10GE 接口。

磁盘的压力测试仅达到约 55%,这可以通过 FreeBSD 的另一个实用工具 gstat(8) 命令看到。

n10.png

接下来进行更“智能”的测试——blogbench 测试。

首先禁用压缩进行测试。

接下来设置压缩为 LZ4 进行第二轮测试。

压缩效果不大,但确实有一定帮助。

为了对比,我们将在系统 ZFS 池上运行相同的测试——两个 Intel SSD DC S3500 240 GB 镜像驱动,其性能如下:

Intel SSD DC S3500 240 GB 驱动特性:

  • 顺序读取(最大)500 MB/s

  • 顺序写入(最大)260 MB/s

  • 随机读取(100% 范围)75000 IOPS

  • 随机写入(100% 范围)7500 IOPS

现在进行 randomio 测试。这是一个多线程磁盘 I/O 微基准测试。

使用方法如下:

使用 4k 块 进行的 随机 I/O 测试。

… 使用 512 字节扇区 进行测试。

两个 随机 I/O 测试都是在启用 LZ4 压缩的情况下运行的。

接下来是 bonnie++ 基准测试。同样是在启用 LZ4 压缩的情况下运行的。

最后但同样重要的是 fio 基准测试。同样启用了 LZ4 压缩。

不知道你怎么看,我对性能是非常满意的 :🙂:

FreeNAS

最初我确实想在这些服务器上使用 FreeNAS,甚至还安装了 FreeNAS。它运行得不错,但…… FreeNAS 的安全部分并不是最佳。

这是 pkg audit 命令的输出,非常吓人。

我甚至试图了解为什么 FreeNAS 在其最新版本中会包含如此过时且不安全的包——FreeNAS 11.2-U3 Vulnerabilities——这是我在他们论坛上发起的讨论贴。

不幸的是,这反映了他们的政策,可以总结为“只要能用,就不要动/更改版本”——至少我得出了这个印象。

因为这些安全漏洞,我无法推荐使用 FreeNAS,于是我转向了原生的 FreeBSD 系统。

另一个有趣的情况是,在我安装 FreeBSD 后,我想导入 FreeNAS 创建的 ZFS pool。这是我执行 zpool import 命令后的结果。

看起来 FreeNAS 对 ZFS 的处理方式略有不同,他们为每个 RAIDZ2 目标创建了单独的 pool,并配置了专用的备用盘。有趣……

更新 1 – BSD Now 305

FreeBSD Enterprise 1 PB Storage 文章出现在 BSD Now 305 – Changing Face of Unix 节目中。

感谢提及!

更新 2 – 数据中心实景照片

有些读者希望看到这台“怪兽”的实景照片。下面是数据中心拍摄的几张图片。

机箱正面及布线。

tyan-real-01.jpg

机箱正面另一角度。

tyan-real-09.jpg

机箱背面及布线。

tyan-real-02.jpg

带硬盘的顶部视角。

tyan-real-03

顶部另一视角。

tyan-real-07.jpg

硬盘位特写。

tyan-real-08.jpg

固态硬盘与机械硬盘。

tyan-real-06.jpg

最后更新于

这有帮助吗?