对象存储擦除编码与块存储 RAID
无论它是什么、在哪里,都必须保护有价值的数据免于丢失和损坏。保护越来越多的数据对于企业存储管理员来说并非易事。数据保护不是一个复选框 - 保护技术及其实施方式之间存在重要差异。了解差异如何影响您的数据和使用它的系统至关重要。
这篇博文比较了两种数据保护技术,块级 RAID 和对象存储擦除编码,它们有一些相似之处,但实际上却大不相同。出于本次讨论的目的,我使用 RAID 表示控制器硬件或软件或操作系统驱动程序的标准块级实现,而不是 ZFS 或某些专有 SAN 解决方案。同样,通过擦除编码,我指的是 MinIO 擦除编码,它在驱动器和节点之间对数据和奇偶校验进行条带化。
RAID(独立磁盘冗余阵列)是一种广泛实施的技术,用于在块级别保护数据免受损坏和丢失。目标是提高性能和保护数据,同时虚拟组合驱动器以增加容量。性能改进来自将数据放置在多个磁盘上,然后并行运行 I/O 操作。数据保护源于跨多个磁盘冗余存储数据,因此一个或多个磁盘可能会发生故障而不会丢失数据。有许多不同的 RAID 级别,但它们都镜像或条带化数据,有时在单个服务器或存储阵列上的多个驱动器之间进行奇偶校验。RAID 通常保护块级存储,并在存储阵列和文件系统之间的控制器上实现。RAID 控制器,可以是硬件或软件,
沿着性能与容量的连续统一体来考虑 RAID 级别会很有帮助。RAID 0 只是涉及跨磁盘条带化数据,允许使用 100% 的容量。RAID 1 在 2 个或更多磁盘之间镜像数据以优化读取性能,同时显着降低容量。RAID 5 对数据块进行条带化并在驱动器之间分配奇偶校验,以便能够从故障中恢复。RAID 6 对数据块进行条带化并在驱动器之间分配双奇偶校验,以便能够为两个出现故障的驱动器提供容错能力。RAID 10(或 RAID 1+0)创建一组条带化的镜像驱动器。
虽然普遍实施,但 RAID 有几个缺点,这些缺点成为大规模对象存储实施中的重要问题。我个人经历过的一个问题是漫长的重建期。在 RAID 6 等配置中,当驱动器出现故障时,它会物理停止服务,更换为新驱动器,然后 RAID 控制器将现有的块级数据重建到新驱动器上。今天的驱动器容量超过 10 TB,比 1987 年引入 RAID 时的容量要大得多,而且它们可能需要数小时甚至数天才能重建。由于冗余减少,阵列中的所有驱动器都面临风险,直到更换故障驱动器。对于 RAID 控制器和阵列中的所有驱动器,重建驱动器是 I/O 密集型的,导致可用性能下降,并增加仍在使用的驱动器的硬件故障风险。这可能会导致严重的并发症,例如在尝试重建 RAID 阵列时发生的新驱动器故障或新的静默数据损坏。坐在控制台前看着驱动器出现故障,同时听用户抱怨停机,这不是一种好感觉。
RAID 是一种块层技术,专为单服务器环境而设计。我们并不生活在单个服务器或单个设备甚至级联设备对象存储世界中。我们运行分布式对象存储,以高性能和全面保护的方式增加容量。RAID 没有对象的上下文。RAID 无法修复分布在多个节点的驱动器上保存的对象——事实上,它根本不修复对象,它修复块,因此如果对象损坏,您必须修复整个驱动器。
存储管理员通常将 RAID 控制器配置为定期扫描驱动器以查找损坏的块,可能每两周或每月一次。在此扫描期间,整个阵列的性能会下降。还有其他性能下降是由 RAID 架构引起的。即使阵列中有许多磁盘,这也提高了单个读取流的性能,但并发读取会导致随机 I/O 性能不佳。当操作系统认为它正在读取和写入单个驱动器时,他们怎么可能。JBOD 能够独立读取和写入,而不是 RAID。
RAID 根本不是为大规模对象存储部署而构建的。
更好的途径:MinIO 擦除编码
MinIO以分布式方式在对象级别实现擦除编码,并且可以在硬件故障的情况下重建对象,而不会牺牲性能或导致停机。纠删码比 RAID 更适合对象存储,因为对象是不可变的 blob,可以写入一次并读取多次。MinIO 利用 Intel AVX512 指令充分利用跨多个节点的主机 CPU 资源进行快速擦除编码。标准 CPU、快速 NVMe 驱动器和 100 Gbps 网络支持以接近线速写入纠删码对象。
与 RAID 5(奇偶校验 1)和 RAID 6(奇偶校验 2)一样,MinIO 依靠纠删码(2 和 8 之间的可配置奇偶校验)来保护数据免于丢失和损坏。擦除编码将对象分为数据块和奇偶校验块,其中奇偶校验块支持丢失或损坏的数据块的重建。MinIO 在一个擦除集中的节点和驱动器之间分布数据和奇偶校验块。使用 MinIO 最高级别的保护(8 奇偶校验或 EC:8),您可能会丢失多达一半的驱动器,但仍然可以恢复数据。MinIO 将多个擦除集组合到一个命名空间中,以增加容量并保持隔离。

MinIO 使用 Reed-Solomon 算法根据擦除集的大小将对象拆分为数据块和奇偶校验块,然后将数据和奇偶校验块随机均匀地分布在一组驱动器中,使每个驱动器包含不超过一个块每个对象。虽然一个驱动器可能包含多个对象的数据块和奇偶校验块,但只要系统中有足够数量的驱动器,单个对象每个驱动器的块就不会超过一个。对于版本化对象,MinIO 为数据和奇偶校验存储选择相同的驱动器,同时在任何一个驱动器上保持零重叠。
我们使用 EC:N 表示法来表示擦除集中奇偶校验块 (N) 的数量。奇偶校验块的数量控制着数据冗余的程度。更高级别的奇偶校验允许以总可用存储为代价的更大容错。虽然您可以控制 EC 条带大小,但 16 个驱动器的默认值是 EC:4,这导致每个对象有 12 个数据块和 4 个奇偶校验块。如果您有大量的小对象(想想 KB),那么较小的条带大小可以提供更好的性能。我们选择了默认的条带大小来平衡保护和性能。奇偶校验块在部署中占用存储空间,减少了可用于数据块的存储量,但这是值得的,因为如果数据块丢失或损坏,它们可以重建对象,从而降低丢失对象的可能性。

MinIO 擦除编码不仅可以在多个驱动器和节点发生故障时保护对象免受数据丢失,而且 MinIO 还可以在对象级别进行保护和修复。一次修复一个对象的能力比在卷级别修复的系统(如 RAID)具有显着优势。损坏的对象可以在 MinIO 中在几秒钟内恢复,而在 RAID 中则需要几小时。如果驱动器出现故障并被更换,MinIO 会识别新驱动器,将其添加到擦除集,然后验证所有驱动器中的对象。更重要的是,读取和写入不会相互影响以实现大规模性能。有 MinIO 部署,在 PB 级存储中包含数千亿个对象。
MinIO 可防止BitRot或静默数据损坏,这可能有许多不同的原因,例如电源电流尖峰、磁盘固件中的错误,甚至只是驱动器老化。MinIO 使用 HighwayHash 算法在读取时计算哈希值,并在从应用程序、网络和存储介质写入时验证它。这个过程非常高效——它可以在 Intel CPU 的单核上实现超过 10 GB/秒的散列速度——并且对整个擦除集的正常读/写操作的影响最小。
了解有关 MinIO 擦除编码的更多信息
了解有关 MinIO 纠删码的更多信息的最简单方法是使用我们的纠删码计算器。您可以为服务器数量、每台服务器的驱动器数量和驱动器容量以及纠删码条带大小和纠删码奇偶校验输入不同的值,以确定可用容量和容错能力。