对象存储擦除编码与块存储 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 控制器将现有的块级数据重建到新驱动器上。如今的驱动器容量远大于 1987 年 RAID 推出时的驱动器,容量达到 10 TB 以上,重建可能需要数小时甚至数天。由于冗余性降低,阵列中的所有驱动器在更换故障驱动器之前都存在风险。驱动器重建对于 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 擦除编码不仅可以防止在多个驱动器和节点发生故障时数据丢失,还可以保护和修复对象级数据。能够一次修复一个对象是一个巨大的优势,优于像 RAID 那样在卷级修复的系统。在 MinIO 中,损坏的对象可以在几秒钟内恢复,而在 RAID 中则需要数小时。如果驱动器出现故障并被替换,MinIO 会识别新驱动器,将其添加到擦除集中,然后验证所有驱动器上的对象。更重要的是,读取和写入不会相互影响,从而实现大规模性能。有一些 MinIO 部署拥有数千亿个对象,跨越 PB 级存储。
MinIO 可以防止BitRot,或静默数据损坏,这可能由许多不同的原因导致,例如电源电流尖峰、磁盘固件中的错误,甚至只是驱动器老化。MinIO 使用 HighwayHash 算法计算读取时的哈希值,并从应用程序、网络和存储介质中写入时验证该哈希值。此过程非常高效 - 它可以在 Intel CPU 的单个核心上实现超过 10 GB/秒的哈希速度 - 并且对跨擦除集的正常读写操作的影响最小。
了解更多关于 MinIO 擦除编码的信息
了解 MinIO 擦除编码的最简单方法是使用我们的擦除代码计算器进行尝试。您可以输入服务器数量、每个服务器的驱动器数量和驱动器容量以及擦除代码条带大小和擦除代码奇偶校验的不同值,以确定可用容量和容错能力。