了解ZFS存储和性能

2020-05-11 13:14:32

随着我们都进入冠状病毒大流行的第三个月,并寻找新的项目来保持我们的参与度(阅读:理智),我们是否有兴趣让您学习计算机存储的基础知识?今年春天,我们已经悄悄地复习了一些必要的基础知识,比如如何测试磁盘的速度,以及什么是该死的RAID。在这些故事的第二部分,我们甚至承诺了后续研究各种多磁盘拓扑在ZFS中的性能,ZFS是您听说过的下一代文件系统,因为它出现在从Apple到Ubuntu的所有地方。

好了,今天是探索ZFS的好奇心的读者们的日子。首先要知道,用OpenZFS开发人员马特·阿伦斯(Matt Ahrens)的轻描淡写的话来说,这真的很复杂。

但是在我们得出数字之前--我保证,它们会来的!--对于你可以用各种方式塑造8个ZFS磁盘,我们首先需要讨论一下ZFS是如何将数据存储在磁盘上的。

要真正理解ZFS,您需要真正关注它的实际结构。ZFS合并了传统的卷管理层和文件系统层,并且它使用了写入时拷贝事务机制-这两者都意味着系统在结构上与传统的文件系统和RAID阵列有很大的不同。要了解的第一组主要构造块是zpool、vdevs和其他设备。

zpool是最常见的ZFS结构。Zpool包含一个或多个VDEV,每个VDEV又包含一个或多个设备。zpool是独立的单元-一台物理计算机上可以有两个或多个单独的zpool,但每个都完全独立于任何其他zpool。Zpool不能相互共享vdevs。

ZFS冗余位于vdev级别,而不是zpool级别。zpool级别绝对没有冗余-如果丢失任何存储vdev或特殊vdev,整个zpool也会随之丢失。

现代zpool可以在失去高速缓存或日志vdev的情况下幸存下来-尽管如果它们在停电或系统崩溃期间丢失了日志vdev,它们可能会丢失少量的脏数据。

认为ZFS条带在池中写入是一种常见的误解-但这是不准确的。zpool不是一个看起来滑稽的RAID0-它是一个看起来滑稽的JBOD,其复杂的分发机制可能会发生变化。

在大多数情况下,写入根据可用可用空间跨可用VDEV分布,因此理论上所有VDEV都将同时变满。在较新版本的ZFS中,也可以考虑vdev利用率-如果一个vdev比另一个vdev繁忙得多(例如,由于读取负载),则即使具有最高的可用空间比率,也可以临时跳过写入。

现代ZFS写入分发方法中内置的利用率感知机制可以在异常高负载期间减少延迟并提高吞吐量-但不应将其误认为全权在同一池中随意混合慢锈磁盘和快速SSD。这种不匹配的池通常仍会运行,就好像它完全由当前最慢的设备组成一样。

每个zpool都由一个或多个vdevs(虚拟设备的缩写)组成。每个vdev又由一个或多个真实设备组成。大多数vdev用于普通存储,但也存在几个vdev的特殊支持类-包括缓存、日志和特殊vdev。这些vdev类型中的每一种都可以提供五种拓扑之一-Single-Device、RAIDz1、RAIDz2、RAIDz3或Mirror。

RAIDz1、RAIDz2和RAIDz3是存储灰人所称的对角奇偶校验RAID的特殊变体。";1、2和3指的是分配给每个数据条带的奇偶校验块的数量。RAIDz vdevs不是让整个磁盘专门用于奇偶校验,而是将奇偶校验半均匀地分布在磁盘上。一个RAIDz阵列可以丢失与其奇偶校验块一样多的磁盘;如果它丢失另一个磁盘,则它将失败,并将zpool一起关闭。

镜像vdevs就是它们听起来的样子-在镜像vdev中,每个块都存储在vdev中的每个设备上。虽然两宽镜像是最常见的,但镜像vdev可以包含任意数量的设备-三路在较大的设置中很常见,以获得更高的读取性能和容错能力。镜像vdev可以经受住任何故障,只要vdev中至少有一个设备保持健康即可。

单设备vdevs也就是它们听起来的样子--而且它们本身就是危险的。单设备vdev无法在任何故障中幸存下来-如果它被用作存储或特殊vdev,它的故障将使整个zpool崩溃。在这里要非常非常小心。

可以使用上述任何拓扑创建缓存、日志和特殊vdev-但请记住,丢失特殊vdev意味着丢失池,因此强烈建议使用冗余拓扑。