Beehive:用于修复分布式存储系统中多个故障的纠删码

Beehive:用于修复分布式存储系统中多个故障的纠删码

摘要:分布式存储系统越来越多地部署纠删码(例如 Reed-Solomon 码)以实现容错。尽管 Reed-Solomon 代码需要的存储空间比复制少得多,但在通过重建修复不可用数据时,将强加大量的网络传输和磁盘 I/O。传统上,预计不可用的数据是单独固定的。然而,由于观察到数据中心的故障是相互关联的,修复多个故障的不可用数据是不可避免的,甚至是常见的。在本文中,我们表明,与单独修复它们相比,批量重建多个故障的数据所花费的网络传输和磁盘 I/O 成本要低得多。我们提出了 Beehive,一种新的纠删码设计,它可以批量修复多个故障的不可用数据,同时以接近最优的存储开销消耗最优的网络传输。评估结果表明,Beehive 代码在重建期间可以节省高达 69.4% 的网络传输和 75% 的磁盘 I/O。

1 引言

大规模的分布式存储系统,尤其是数据中心的分布式存储系统,存储着海量的数据,而且数据还在快速增长。这些存储系统在商品硬件上运行,预计可以保持数据可用,以防止每天出现导致数据不可用的软件和硬件故障 [12]。传统上,分布式存储系统使用复制数据来保持数据可用。例如,三个副本默认存储在 Hadoop 分布式文件系统 (HDFS) [2] 中。

然而,存储原始数据的多个副本给存储系统带来了昂贵的开销。例如,三份意味着只有总存储空间的33%可以被有效利用。因此,分布式存储系统(例如 [6])一直在用纠删码代替复制,尤其是冷存储或归档存储。通过从复制迁移到纠删码,分布式存储系统可以享受更好的容忍不可用数据的能力,同时节省存储开销。在纠删码中,里德-所罗门 (RS) 码成为最受欢迎的选择,因为 RS 码在提供相同级别的容错能力的同时优化了存储空间的使用。

为了使用 RS 代码实现容错,我们需要假设数据存储在固定大小的块中,这是大多数分布式存储系统的常见做法。对于 k 个数据块,RS 代码计算 r 个奇偶校验块,这样总共 k + r 个块中的任何 k 个都可以恢复所有数据块。数据块及其对应的校验块属于同一个条带。因此,这样的 RS 代码在同一条带内最多可以容忍 r 个故障。例如,k = 4 和 r = 2 的 RS 代码可以容忍任何两个丢失的块,存储开销为 1:5 倍,而三路复制,实现相同级别的容错,需要 3 倍的存储开销。

一旦一个块变得不可用,丢失的数据应该通过重建操作来修复并保存在其他服务器上。在 RS 码下,重建操作需要下载 k 个现有块,然后解码丢失的块,在复制下施加 k 次网络传输。据 Facebook 的集群报道,在 RS 代码下重建不可用数据可以在一天内增加超过 100 TB 的数据传输 [10]。此外,同样数量的磁盘 I/O 也会被施加到存储下载块的服务器上。

为了在重建期间节省网络传输,人们对构建一类称为最小存储再生 (MSR) 码的纠删码产生了相当大的兴趣(例如,[11])。与 RS 码一样,MSR 码也优化了存储空间的使用。但是,MSR 代码可以显着节省重建期间的网络传输。如图 1a 所示,我们假设每个块的大小为 128 MB,并且对于此处的 RS 代码和 MSR 代码,让 k = 3 和 r = 3。 RS 代码需要下载三个块来重建一个丢失的块,而 MSR 代码只需要下载每个块的一小部分。在这个例子中,虽然 MSR 代码需要从一个多块下载数据,但总的网络传输仍然节省了 33:3%,因为每个块只施加了一半的网络传输。尽管如此,即使重建只需要一个块的一小部分,一般来说它必须从整个块进行编码。 因此,MSR 代码不会减轻但会进一步增加磁盘 I/O 的开销,因为重建需要从比 RS 代码更多的块下载数据。

image-20230609173825648

传统上,假设当存在不可用的块时,分布式存储系统将单独重建它们。但是,在数据中心内部,数据不可用事件可能相互关联。例如,许多磁盘在相似的年龄发生故障 [8]。当一个磁盘发生故障时,它表明其他一些磁盘很可能同时发生故障。不仅限于磁盘故障,相关数据故障也可能由于各种原因 [5] 而发生,例如开关故障、断电、维护操作或软件故障。利用相关故障,我们研究了允许我们批量重建多个丢失块的纠删码的构造,以在重建期间节省网络传输和磁盘 I/O。

在本文中,我们提出了一个新的纠删码家族,称为 Beehive,它可以同时重建多个块。这带来的一个直接好处是每个块将只被读取一次以重建多个块。如图 1b 所示,当我们同时重建两个块时,磁盘读取总量节省了 50%,同时我们甚至可以进一步节省网络传输。事实上,Beehive 代码在重建操作中实现了每个块的最佳网络传输。 Beehive 代码的构造是建立在 MSR 代码之上的。

我们在C++ 中实现 Beehive 代码并评估 Beehive 在 Amazon EC2 上的性能。实验结果表明,与 MSR 代码相比,Beehive 代码可以节省高达 42:9% 的网络流量(在 RS 代码下节省更多)和在重建期间高达 75% 的磁盘 I/O。尽管 Beehive 代码存储的实际数据少于具有相同存储空间的 RS 或 MSR 代码,但我们表明这种开销是微不足道的。

image-20230609205931073

2 背景

假设给定 k 个数据块,我们将在一些纠删码下有 r 个奇偶校验块。如果所有 k + r 块中的任何 k 可以解码原始数据,则此类纠删码可以优化存储空间的使用,例如 RS 码。一个块包含一定数量的符号。通常,符号只是一个字节。纠删码的编码、解码和重构操作是通过所谓的有限域算法对这些符号执行的。然而,在本文中,我们不依赖于有限域的任何直接知识,读者可以简单地将其算法视为通常的算法。

给定原始数据,我们可以将它们分成几代,这样每一代都包含 k 个大小相同的块 (fi , i = 1,……,k)。为简单起见,我们在本文中只考虑一代,因为所有代都将以相同的方式编码。根据纠删码,一个块可能由一个或多个段组成,其中每个段是一个包含 w 个符号的行向量。为了简单起见,我们假设在本文中一个符号是一个字节。换句话说,每个段包含 α \alpha α 个字节。假设每个块包含w段,每个块有 α \alpha αw个字节,我们把 f i f_i fi看成一个 α × w \alpha ×w α×w的矩阵。让 n = k + r。给定 k 个原始块,纠删码使用 n α × k α n\alpha \times k\alpha nα×kα 生成矩阵 G 来计算条带中的所有块,即 G [ f 1 T … … f k T ] T G[f_1^T …… f_k^T]^T G[f1T……fkT]T,其中 f 1 T f_1^T f1T 表示 fi 的转置。我们可以将 G 分成 n 个大小为 α × k α \alpha \times k \alpha α×kα的子矩阵,使得 G = [ g 1 T … … g k T ] T G =[g_1^T …… g_k^T]^T G=[g1T……gkT]T。因此,由 G 生成的 n 个块可以表示为 g i F g_iF giF(或块 i i i,为简单起见), i = 1 , … … , n i =1,……,n i=1,……,n,其中 F = [ f 1 T … … f k T ] T F=[f_1^T …… f_k^T]^T F=[f1T……fkT]T。从同一代计算的 n 个块属于同一条带。我们简要说明了上面图 2 中描述的符号。

如果 G 的前 k α k\alpha kα行形成单位矩阵, g i F g_iF giF与 fi 相同, i = 1 , … … , n i =1,……,n i=1,……,n,这样,我们可以将 g 1 F , … … , g k F g_1F,……,g_kF g1F,……,gkF称为数据块,其余称为奇偶校验块。本文描述的纠删码是系统码。通常,RS码下每个块只有一段,即 α = 1 \alpha=1 α=1。我们可以通过让G的其余部分为柯西矩阵来构造RS码。给定同一条带中的任意 k 个块,我们可以得到它们对应的生成矩阵的子矩阵,然后通过将这个子矩阵的逆乘以这 k 个块来解码原始数据。

另一方面,在MSR码下,一个区块包含d -k +1段(即a = d -k +1),其中d是重建一个缺失区块所需的可用区块数量,d > k。在重建过程中,我们把这d个区块称为帮助者,被重建的区块称为新人。为了重建任何一个新来者,我们不需要像在RS码下那样对其进行解码,而是用同一条纹中的d个帮助者的零头来重建它。例如,为了重建giF,我们将从块gjF中计算一个段 v i T g j F v_i^Tg_jF viTgjF,其中vi是一个大小为 α \alpha α符号的列向量。有了从帮助者那里得到的d段,我们可以通过将a×d矩阵与这d段相乘来重建giF。

已经有几种 MSR 代码的构造(例如,[11])。在本文中,我们将基于 Rashmi 等人 [11] 提出的一种特定乘积矩阵构造来构造我们的蜂巢代码,因为 1) 构造的 MSR 代码是系统的; 2) 与其他对 d 或 k 的特定值施加约束的构造不同,[11] 中提出的构造更通用,只需要image-20230611155858680

在这里插入图片描述

满足以下等式:image-20230611155551412

其中 image-20230611155720268是一个大小为 α \alpha α 的向量,它与具有不同 i 值和相同 j 值的此类向量中的任何其他 α − 1 \alpha -1 α1线性无关。

3 蜂巢代码

3.1 编码构造

在 Beehive 下,我们假设同时重建 t 个新来者,t > 1。与传统的纠删码(如 RS 或 MSR 码)不同,我们将原始数据的一代分为两部分,分别包含 k 和 k-1 个块。在第一部分中,每个块包含 d-k+1 个片段,在第二部分中每个块包含 t-1 个片段。我们将第一部分中的 k 个块表示为 image-20230611160034448,将第二部分中的 k−1 个块表示为image-20230611160057615。我们在图 3 中说明了这个过程。

image-20230611160109922

如第二节所述。 给定k;r;d,其中d≥2k −2,我们可以构造一个乘积矩阵MSR码的生成矩阵G。然后我们用这样的 G 对第一部分 F 进行编码,得到 image-20230611161547276。随着乘积矩阵MSR码,我们还可以得到对应的矩阵A,,我们也可以得到对应的矩阵A,然后我们将第二部分的数据编码为image-20230611161637288

Beehive 根据原始数据计算出 n 个块。每个块包含来自 giF 的 d − k+1 个片段和来自 image-20230611161813431 的 t − 1 个片段。因此,在前 k − 1 个块中我们可以直接找到 C,因为 A 的前 k −1 行是标准碱基。由于我们在第一部分中使用的 MSR 代码是系统的,我们也可以直接从前 k 个块中找到 F。因此,蜂巢代码是系统的。

另一方面,在蜂巢码下每个块中有 d-k+t 段。如果每个段包含 w 个符号,则原始数据应分组为 [k(d−k+t)−(t −1)]w 个符号的代。在块大小相同的情况下,与理论最优值 [15] 相比,这将导致蜂巢代码下每一代中的 (t -1)w 个符号减少(由于页数限制,我们省略了证明)。考虑到一代的数据总量,这种存储效率的损失是微不足道的。

3.2 解码与重建

要解码条带中任意 k 个块的原始数据,必须解码 F 和 C。显然 F 可以通过 MSR 码从任意 k 个块中解码出来。另一方面,给定 k 个块,我们有 ci 的 k 个线性组合,i = 1,……,k−1。由于 A 中的任何 k-1 行都是线性独立的,因此可以从任何 k -1 个块中恢复 ci。

现在我们考虑重构操作。不失一般性,我们只给出 t = 2 的情况。令 N 为新人集,H 为帮助者集,其中image-20230611162223566

对于任何image-20230611162258046,助手 i 计算 image-20230611162327817image-20230611162319545并将其发送到新人 j ,其中 uj 是大小为 t −1 个符号的向量。image-20230611162349436 中的任何 t −1 个向量必须是线性无关的。

在新人这边,我们将他们的操作分为两个阶段。以新来者j为例,其中j≥k(由于页数限制,我们也省略了j < k的证明),在第一阶段,它将从H中的助手那里接收d个段。通过(1),每个段可以写成

image-20230611162449943

这样,image-20230611162527985的秩为image-20230611162556478, 和image-20230611162611614的秩为image-20230611162623697

因此,我们可以使用从 d 个助手接收到的 d 个片段来求解image-20230611162642743,同时,image-20230611162712987image-20230611162722899 也可以求解,image-20230611162657830

第二阶段,新人j将发送

image-20230611162750144

给另一个新人 image-20230611162814598 ,它也会从其他新人那里收到 t −1 个片段。然后新人 image-20230611162814598可以抵消image-20230611162841146 因为它已经解决了image-20230611162907044。然后我们可以得到image-20230611162920520, 也可以很好的解出image-20230611163042179, 从其他新来者那里得到的t-1段。因此,建议由image-20230611163125739组成的矩阵包含一个身份子矩阵,这样就可以简化这一操作。这样,我们可以同时重建image-20230611163144433。在重建过程中,每个新人将收到d +t -1段,实现最佳网络传输[15],以重建t块。

4 初步结果

我们用C++实现了Beehive,使用英特尔存储加速库(ISA-L)[1]进行有限域运算。我们还用ISA-L实现了RS码和MSR码,以便于比较。我们让k=6,r=6,并设定块大小为60MB。我们首先比较RS、MSR(d=10)的不同操作的速度,图4中的MSR码和Beehive码(d=10;t=2),运行在c4.2xlarge类型的亚马逊EC2实例上。我们观察到,MSR码和Beehive码的编码和解码操作是相当接近的。Beehive码的编码操作比MSR码慢一点,因为Beehive码是建立在MSR码之上的。尽管如此,我们没有观察到MSR码和蜂巢码之间的解码或重建操作速度有明显的不同。在MSCR码下,新人一侧的第一阶段重建的吞吐量较低。然而,由于在这个阶段只产生一个片段,实际处理时间要比第二阶段快得多。这对分布式存储系统更为重要,因为数据将只被编码一次,但被解码或重构多次。另一方面,RS编码可以享受更高的吞吐量,因为在RS编码下,每个块中只有一个段。

image-20230611163332105

在每个区块大小为60MB的情况下,在RS或MSR编码下的一代是360MB,但在Beehive编码下的一代要少10MB。事实上,在相同的存储开销(即相同的k和r)下,Beehive码存储的实际数据更少。换句话说,在原始数据量相同的情况下,我们在Beehive编码下可能有更多的代数。然而,这种额外的存储开销是很小的。在这种情况下,它只是2.8%。

我们在图5中比较了RS、MSR和Beehive码在重建过程中的磁盘读取和网络传输。特别是,当t=1时,Beehive编码将与MSR编码相同。当t>1时,RS码和MSR码分别重构t块。换句话说,在每次重建时都会有数据被读取。因此,如图5a所示,Beehive码在重建过程中实现了更少的磁盘读取,这并不随t的变化而变化,而只取决于帮助器的数量。与MSR代码相比,Beehive代码可以节省高达75%的磁盘读取量。关于网络传输,我们在图5b中观察到,RS码总是施加最多的网络传输。随着d的增加,MSR代码和Beehive代码都需要较少的网络传输。然而,蜂巢代码可以进一步节省网络传输,与MSR代码相比,最多可节省42.9%,与RS代码相比,最多可节省69.4%。随着t的增加,网络传输的减少变得更加明显。

image-20230611163450076

5 相关工作

为了优化重建过程中的网络传输而不损失容错性,Dimakis等人[4]探讨了单块重建的网络传输的理论下限,有很多文献介绍了这种擦除码(称为再生码)的构造[3]。在这些代码中,最小存储再生(MSR)代码实现了最佳存储开销[11]。当有多个区块需要同时重建时,可以进一步节省网络传输[15]。然而,目前还没有构建能够在一般参数值和最佳存储开销下达到这个下限的擦除码。Shum[15]和Li等人[7]提出了这种纠删码的构造,分别在d=k和t=2的情况下实现了最佳网络传输。在本文中,我们提出了一种结构,在接近最优的存储开销和广泛的参数范围内实现了最优的网络传输。

6 结论

在本文中,我们提出了Beehive,一个新的擦除码系列,它可以同时重建多个块,并以接近最佳的存储开销实现最佳的网络传输。通过在亚马逊EC2上的实验,我们表明,与现有的擦除代码如RS和MSR代码相比,Beehive代码可以同时大大节省网络传输和磁盘I/O。

参考文献

[1] Intel Storage Acceleration Library. https://01.org/intel%C2%
AE-storage-acceleration-library-open-source-version.
[2] BORTHAKUR, D. HDFS Architecture Guide. Hadoop Apache
Project. http://hadoop.apache.org/common/docs/
current/hdfs_design.pdf.
[3] DIMAKIS, A., RAMCHANDRAN, K., WU, Y., AND SUH, C. A
Survey on Network Codes for Distributed Storage. Proceedings
of the IEEE 99, 3 (Mar. 2011), 476–489.
[4] DIMAKIS, A. G., GODFREY, P. B., WU, Y., WAINWRIGHT,
M. J., AND RAMCHANDRAN, K. Network Coding for Distributed Storage Systems. IEEE Trans. Inform. Theory 56, 9
(2010), 4539–4551.
[5] FORD, D., LABELLE, F., POPOVICI, F. I., STOKELY, M.,
TRUONG, V.-A., BARROSO, L., GRIMES, C., AND QUINLAN, S. Availability in Globally Distributed File Systems. In
Proc. USENIX Symposium on Operating System Design and Implementation (OSDI) (2010).
[6] HUANG, C., SIMITCI, H., XU, Y., OGUS, A., CALDER, B.,
GOPALAN, P., LI, J., AND YEKHANIN, S. Erasure Coding in
Windows Azure Storage. In Proc. USENIX Annual Technical
Conference (USENIX ATC) (2012).
[7] LI, J., AND LI, B. Cooperative Repair with Minimum-Storage
Regenerating Codes for Distributed Storage. In Proc. IEEE INFOCOM (2014).
[8] MA, A., DOUGLIS, F., LU, G., SAWYER, D., CHANDRA, S.,
AND HSU, W. RAIDShield: Characterizing, Monitoring, and
Proactively Protecting Against Disk Failures. In Proceedings of
the 13th USENIX conference on File and Storage Technologies
(2015).
[9] RASHMI, K. V., NAKKIRAN, P., WANG, J., SHAH, N. B., AND
RAMCHANDRAN, K. Having Your Cake and Eating It Too:
Jointly Optimal Erasure Codes for I/O, Storage, and Networkbandwidth. In Proceedings of 13th USENIX Conference on File
and Storage Technologies (FAST) (2015).
[10] RASHMI, K. V., SHAH, N. B., GU, D., KUANG, H.,
BORTHAKUR, D., AND RAMCHANDRAN, K. A Solution to
the Network Challenges of Data Recovery in Erasure-coded Distributed Storage Systems: A Study on the Facebook Warehouse
Cluster. In Proc. 5th USENIX Workshop on Hot Topics in Storage
and File Systems (HotStorage) (2013).
[11] RASHMI, K. V., SHAH, N. B., AND KUMAR, P. V. Optimal
Exact-Regenerating Codes for Distributed Storage at the MSR
and MBR Points via a Product-Matrix Construction. IEEE Transactions on Information Theory 57, 8 (2011), 5227–5239.
[12] SATHIAMOORTHY, M., ASTERIS, M., PAPAILIOPOULOS, D.,
DIMAKIS, A. G., VADALI, R., CHEN, S., AND BORTHAKUR,
D. XORing Elephants: Novel Erasure Codes for Big Data.
Proc. VLDB Endowment (2013).
[13] SHAH, N., RASHMI, K. V., KUMAR, P., AND RAMCHANDRAN,
K. Interference Alignment in Regenerating Codes for Distributed
Storage: Necessity and Code Constructions. IEEE Trans. Inf.
Theory 58, 4 (2012), 2134–2158.
[14] SHAH, N. B., RASHMI, K. V., VIJAY KUMAR, P., AND N,
K. Distributed Storage Codes With Repair-by-Transfer and
Nonachievability of Interior Points on the Storage-Bandwidth
Tradeoff. IEEE Trans. on Inform. Theory, 58, 3 (2012), 1837–
1852.
[15] SHUM, K. W. Cooperative Regenerating Codes for Distributed
Storage Systems. In Proc. IEEE International Conference on
Communications (ICC) (2011).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值