MinIO,云存储的ZFS

MinIO,云存储的ZFS

ZFS以将物理存储设备的边界汇集在一起来抽象化物理存储设备的边界而闻名。ZFS完全消除了手动处理物理存储的需要,也无需担心它们的单个容量。ZFS也是检测数据损坏并在有数据冗余的情况下进行恢复的能力的先驱。

但是,正如我们已经讨论的那样,传统文件系统无法满足现代应用程序的需求。现在,应用程序需要以编程方式处理非结构化数据的方式,同时它们对数据丢失或安全失效的容忍度非常低。

显然,使用当前文件系统很难做到这一点。但是,如果ZFS演变为云存储系统呢?它会是什么样子?我很确定它看起来像今天的MinIO。是什么让我这样说呢?好吧,有很多事情。我将在这篇文章中介绍所有这些内容。

防止静默数据损坏(也称为位腐)

静默的数据损坏或位腐烂是磁盘驱动器面临的严重问题,其中存储在其中的数据可能会损坏,而用户甚至不知道它。发生这种情况的原因是,例如(但不限于)当前的峰值,磁盘固件中的错误,幻像写入,读/写错误定向,阵列与服务器内存之间的DMA奇偶校验错误,驱动程序错误以及意外覆盖。

ZFS可能是第一个提供针对这些数据损坏问题的保护的开源文件系统。ZFS在整个文件系统树中使用基于Fletcher的校验和或SHA-256哈希,将每个数据块进行校验和,并将值保存在指向该块的指针中,而不是实际块本身。此校验和一直持续到文件系统的数据层次结构一直到根节点。

现在,由于ZFS将每个块的校验和存储在其父块指针中,因此,当访问一个块时,无论是数据块还是元数据,整个池都会自验证。验证发生在计算校验和并将其与应该存储的校验和值进行比较时。

类似地,Min IO提供了针对数据损坏和位腐烂问题的全面保护,尽管它具有更快的哈希算法和基于擦除编码的广泛数据恢复机制。

为了防止位腐烂,MinIO通过计算数据块的哈希值并将其与最初计算出的哈希值(存储数据时)进行比较,来验证从磁盘读取的数据块的完整性。仅在两个散列都相同的情况下,才可以确保数据没有以任何方式被更改。如果哈希值之间存在任何差异,则该块本身将被丢弃,并且必须从其他数据和奇偶校验块中进行重建。我们将稍等一下重建,让我们首先了解MinIO中的哈希。

散列

MinIO使用Highway哈希算法的优化实现—  Highwayhash,完全用Go编写。它可以在Intel CPU的单个内核上实现超过10 GB /秒的哈希速度

可以想象,散列必须在几乎所有读取(验证)和写入数据(保存初始散列)的数据上运行,因此散列必须快速且准确。这就是为什么我们将时间和精力投入到highwayhash,非常适合此类用例的原因。您可以在此博客文章中了解更多信息

清除码

擦除码 是一种纠错码,它可以将k个符号的消息转换为n个符号的较长消息(代码字),从而可以从n个符号的子集中恢复原始消息

MinIO使用Reed-Solomon代码将对象剥离为n / 2个数据和n / 2个奇偶校验块。这意味着在12个驱动器设置中,将一个对象分片为6个数据和6个奇偶校验块。即使丢失了多达5个((n / 2)–1)驱动器,无论是奇偶校验还是数据,您仍然可以从其余驱动器可靠地重建数据。

与RAID相比如何?

与RAID或复制不同,擦除代码可保护数据免受多个驱动器故障的影响。例如,RAID 6可以防止2个驱动器发生故障,而使用MinIO擦除代码,您可能会丢失多达一半的驱动器,并且仍然可以恢复数据。

此外,MinIO的擦除代码处于对象级别,因为每个对象均以高奇偶校验数进行单独编码。因此,它可以一次治愈一个物体。而对于RAID,只能在卷级别执行修复,这将导致大量停机时间。

此外,MinIO的擦除编码后端旨在提高运营效率,并在可用时充分利用硬件加速。

可扩展性

ZFS的另一个关键方面是能够根据您的需求进行扩展。仅考虑软件方面,ZFS可能可扩展至Zettabytes的存储。另一方面,MinIO以多租户方式扩展,其中每个租户的数据存储在单独的MinIO实例上。这使规模与软件的物理极限脱钩。无论您有100个,1000个还是数百万个租户-只要有一个满足每个租户的MinIO实例,部署就很简单并且可以轻松扩展。

这样的设置不仅可以轻松实现可维护性(在给定的时间仅减少几个租户),还可以使部署简单,易于扩展和缩小。

但是,如果您喜欢大型部署,那么MinIO最近引入了大型存储桶支持,可让您从头开始启动PB级部署。在这里阅读更多


上一篇 下一篇