随着大数据、人工智能等新兴领域的快速发展, 用户的数据量已开始呈指数型增长. 存储系统作为数据存在和发挥价值的基础平台需要保证大容量数据存储的可靠性[1-3]. 目前, 存储系统通常以块为单位对数据进行存储和处理. 为了保证这些数据块不会因为系统故障而丢失, 存储系统通常会额外存储着一定的冗余数据, 并通过对应的修复机制来保证当系统发生节点或服务器故障等突发情况时, 数据仍然能够被修复, 这被称为存储系统的冗余容错机制. 冗余容错大致分为多副本技术和纠删码技术两类. 多副本技术通过将原始数据拷贝多份并分别存储来保证数据的可靠性. 纠删码技术(erasure coding, EC)作为另一种被广泛应用的存储系统容错策略[2], 相对于多副本而言能够使用更低的存储开销提供更高的存储可靠性[4]. 然而, 由于纠删码需要额外的编解码计算以及更为复杂的数据条带化的逻辑, 纠删码会导致更高的计算、元数据等开销, 例如在数据读写、降级读以及故障修复等过程中, 纠删码存储系统需要对数据进行大量的编解码计算. 在当前RDMA等技术相继出现, 数据传输速度不断提升的背景下, 修复数据带来的计算开销对于纠删码存储系统的性能影响不断增大, 在许多场景下会成为其正常读写工作以及数据修复的性能瓶颈.
RS码(Reed-Solomon codes, RS codes)[5]是纠删码中最著名的一类编码. 参数为(
ZD码 (ZigZag-decodable codes, ZD codes)[6]作为另一种纠删码策略, 整个编码计算都仅通过移位和异或操作实现. 相比于广泛使用的RS码而言, 它通过存储了额外的一部分冗余数据来进行数据校验, 换取了更简单的编解码计算流程, 避免了执行矩阵乘法, 计算的时间复杂度更低, 同时也只使用GF(2)的有限域. 这些使得它的编解码计算过程十分具有优势[7].
ZD码的解码过程由之字形解码算法设计生成. 经过分析发现, 当前应用在存储系统领域中的之字形解码算法[6-8]对于编码的信息利用是不完全的, 这导致了系统需要存储更多的冗余数据才能保证编码达到所需要的高容错性. 本文通过对之字形解码算法进行优化, 提高了校验数据中的信息利用率, 从而使得存储系统可以采用存储开销更低的ZD码编码方案, 进而达到降低整个系统的冗余存储开销的目的. 在本文中, 我们设计了一种优化的之字形解码算法, 它继承了原算法的之字形解码思想, 同时更彻底地利用偏移矩阵中包含的信息. 这使我们能够提出更宽松的约束条件来设计更有效的偏移矩阵. 我们提出了一个性质来限制数据块的偏移量, 并进一步推导出一类具有最佳存储开销的新 ZD 码, 可以通过我们新的之字形解码算法对其进行解码. 我们从理论上证明了代码的正确性, 并在现有的EC库中实现了它们. 以下是本文的主要贡献.
(1)我们提出了一种基于之字形解码的新之字形解码算法. 与原有算法相比, 新算法具有更大的适用范围.
(2)我们提出了一个更宽松的偏移矩阵性质, 并证明了这一性质是ZD码具有MDS性质的必要条件. 基于这一性质, 我们可以搜索开销更低的编码方案, 并证明了在保证MDS性质的前提下, 这一编码产生的存储开销达到了理论的最低值.
(3)我们通过数学分析比较了新编码和现有的ZD码产生的存储开销. 与当前ZD码相比, 在常用的编码参数下, 新编码的额外存储开销减少了 33%–67%. 我们实现了新的 ZD 编码方案并对编码性能进行了实验. 与在 Jerasure 中实现的 Cauchy-RS 代码相比, 新编码的编码吞吐量提高了59%. 在多故障修复的场景中, 新编码将解码吞吐量提高了 40%–121%.
目前已有一些工作针对ZD码的额外存储开销进行了研究和优化. Chen等人优化了基于范德蒙矩阵的偏移矩阵设计[9], 将开销降低了 50%, 但仍然没有达到最优的存储开销. Dai等人设计了一个最优的ZD码编码方案[10], 但仅是参数
ZD码最初在无线网络领域被提出, 用于解决包碰撞的问题[18]. 以图1作为例子, 这是一个(2, 2) ZD码条带.
定义1. 一个l位长的数据块D以多项式:
$ D({\textit{z}}) = {d_0}{{\textit{z}}^0} + {d_1}{{\textit{z}}^1} + {d_2}{{\textit{z}}^2} + \cdots + {d_{l - 1}}{{\textit{z}}^{l - 1}} $ | (1) |
表示, 其中
定义2. 给出
$ {D_i}({\textit{z}}) = {d_{i, 0}}{{\textit{z}}^0} + {d_{i, 1}}{{\textit{z}}^1} + {d_{i, 2}}{{\textit{z}}^2} + \cdots + {d_{i, l - 1}}{{\textit{z}}^{l - 1}} $ | (2) |
则一个(k, m) ZD码将这
$ {P_j}({\textit{z}}) = {{\textit{z}}^{{t_{1, j}}}}{D_1}({\textit{z}}) + {{\textit{z}}^{{t_{2, j}}}}{D_2}({\textit{z}}) + \cdots + {{\textit{z}}^{{t_{k, j}}}}{D_k}({\textit{z}}) $ | (3) |
以上定义皆在GF(2)的有限域上. 将这
式(3)中, 非负整数
$ T = \left[ {\begin{array}{*{20}{c}} {{t_{1, 1}}}&{{t_{1, 2}}}& \cdots &{{t_{1, m}}} \\ {{t_{2, 1}}}&{{t_{2, 2}}}& \cdots &{{t_{2, m}}} \\ \vdots & \vdots & \ddots & \vdots \\ {{t_{k, 1}}}&{{t_{k, 2}}}& \cdots &{{t_{k, m}}} \end{array}} \right] $ | (4) |
在图1的例子中, 只有
我们接下来再次以图1为例来说明ZD码的解码过程. 当条带中有单个数据块发生故障时, 我们显然可以用剩余的一个数据块与任意一个校验块通过再次进行带有偏移量的异或运算来解码出故障数据. 而当两个数据块同时发生故障时, 我们首先给出该(2, 2) ZD码条带中所有校验位的具体编码:
$\left\{ \begin{split} & {p_{1, i}} = {d_{1, i}} \oplus {d_{2, i}},\quad \;0 \leqslant i \leqslant 7 \\& {p_{2, 0}} = {d_{1, 0}} \\& {p_{2, i}} = {d_{1, i}} \oplus {d_{2, i - 1}},\;\; 1 \leqslant i \leqslant 7 \\& {p_{2, 8}} = {d_{2, 7}} \end{split}\right. $ |
可以注意到, 由于错位异或, 校验块
$ {d_{1, 0}} = {p_{2, 0}} $ | (5) |
$ {d_{1, i}} = {d_{2, i - 1}} \oplus {p_{2, i}}, \;1 \leqslant i \leqslant 7 $ | (6) |
$ {d_{2, i}} = {d_{1, i}} \oplus {p_{1, i}},\; 0 \leqslant i \leqslant 7 $ | (7) |
由于所有的校验位都已知, 又由式(5), 从暴露位
如此循环, 系统每一次通过已有的暴露位修复一个数据位, 并利用已修复的数据位更新校验位来生成新的暴露位, 即可仅靠2个校验块修复所有的数据位. 这一解码过程即是之字形解码算法. 将示例中的情况推广出去, 若对于定义2中的一个(
如同上述讨论中的校验块
$ {l_{{p_j}}} = l + \max ({t_{1, j}}, {t_{2, j}}, \cdots , {t_{k, j}}) $ |
当
在实际的存储系统中, 如果条带里的各个校验块大小都不同会使得系统实现和执行十分的复杂, 因此ZD码的校验块通常被统一按照最大的校验块大小分配存储空间并工作. 这种情况下, 一个(
显然, 这一额外存储开销越大, 系统的性能将会越低. 然而, 从另一方面来说, 之字形解码算法的过程是利用暴露位不断地修复数据位, 同时更新校验位产生新的暴露位并循环迭代直至所有数据被解码. 过少的暴露位会导致一些故障情况下的条带无法按之字形解码恢复数据. 为了保证数据的容错性, ZD码条带必须保证其额外存储的冗余数据足够支持它的MDS性质. 现在的工作最常见的策略是使用基于范德蒙矩阵和汉克尔矩阵来生成偏移矩阵
我们发现当前使用的之字形解码算法对冗余信息的利用是不完全的. 当前的之字形解码算法只从每个校验块的首位开始寻找暴露位并尝试进行迭代解码. 然而, 由于ZD码的移位特性, 许多校验块的末位也是暴露位. 在第2.2节的示例中, 算法通过使用暴露位
$ {d_{2, 7}} = {p_{2, 8}} $ | (8) |
$ {d_{1, i}} = {d_{2, i}} \oplus {p_{1, i}},\; 0 \leqslant i \leqslant 7 $ | (9) |
$ {d_{2, i}} = {d_{1, i + 1}} \oplus {p_{2, i + 1}},\; 0 \leqslant i \leqslant 6 $ | (10) |
通过式(9)和式(10)以及初始的暴露位
3 设计 3.1 新的之字形解码算法
我们提出了一种新的之字形解码算法, 该算法同时利用校验块首部和末尾的额外冗余信息来加速故障块的重建. 新的算法充分利用了校验信息, 使得ZD码能够用更少的存储量保证高容错性, 具体性能见第4.2节.
由于故障的校验块可以在数据块都可用时通过编码修复, 因此我们只考虑如何在发生故障时用之字形解码算法重构所有故障的数据块. 假设一个(
算法1. 新之字形解码算法
输入:
输出:
1) 将所有的数据位标记为未修复, 令
2) 在所有的校验块首位中寻找1个暴露位
3) 若存在这样的暴露位
4) 对所有的
5) 若此时所有数据位都标记为已修复, 输出
6) 在所有的校验块末位中寻找暴露位
7) 若存在这样的暴露位
8) 对所有的
令
9) 若此时所有数据位都标记为已修复, 输出
算法1将上述的
为了找到ZD码开销的下界, 我们定义了一个新的偏移矩阵性质来描述其元素之间的关系.
定义3. 令
$ {t_{i, j'}} - {t_{i, j}} \ne {t_{i', j'}} - {t_{i', j}} $ | (11) |
则称矩阵T具有差异不同性.
对于图1的(2, 2) ZD码条带, 其偏移矩阵
如果在一个(
定理1. 如果ZD码是最大距离可分(MDS)的, 则其偏移矩阵满足差异不同性.
证明: 我们使用反证法来证明定理1. 假设一个(k, m) ZD码条带由大小为
$ p'_{{j}_{1}, h}=\left\{ \begin{aligned} & p'_{{j}_{2}, h-{t}_{{i}_{1}, {j}_{2}}+{t}_{{i}_{1}, {j}_{1}}},\; {t}_{{i}_{1}, {j}_{2}}-{t}_{{i}_{1}, {j}_{1}}< h < {l}_{p} \\ & 0\text{, }\qquad\qquad\quad\;\; 其他 \end{aligned}\right. $ | (12) |
式(12)表示此时
有了差异不同性这一基础之后, 我们便可以求得ZD码的一个额外存储开销的下界.
在此基础上, 我们通过简单的搜索算法可以对较小的参数(
4 实验与分析 4.1 实验设置
基于上述的编码构造方式和解码算法, 我们成功地在现有的EC库中实现了OS-ZD码. 我们选择广泛使用的EC库Jerasure, 在其中增加了OS-ZD码的编解码方案模块并使其能够正确地运行并执行读、写和修复等功能. Cauchy-RS码是目前最为通用的MDS纠删码, 我们选用Jerasure库中自带的高效Cauchy-RS码模块作为参照, 在服务器上真实地运行这两种纠删码并比较其结果, 来验证OS-ZD码的正确性和工作效率. 由于两种编码都实现在同一个EC库中, 实验避免了底层运算指令等细节对性能测试的影响.
我们在具有512 GB内存, 2 个Intel(R) Xeon(R) E5-2650 v4 CPU, 2 TB SSD, 操作系统为CentOS 7.5.1804 的服务器上运行实验. 我们随机生成一定大小的数据, 并使用
由于目前没有其他开源的ZD码库, 我们将OS-ZD码与已有的ZD码在理论层面进行比较, 在同样的参数条件以及配置下, 通过理论计算各ZD编码产生的额外存储开销并作比较, 来体现我们在存储开销上的优化效果.
4.2 存储开销我们选取了HDFS等分布式存储系统中常见的一些纠删码参数配置, 并根据各个矩阵的生成方式[7]理论计算了 OS-ZD 码的偏移矩阵与其他两种常用的 ZD 码偏移矩阵在这些配置下的额外存储开销.
表3显示了各个ZD 码偏移矩阵在这些常用参数下产生的具体开销. 第2–4列中的数字表示每个校验块在使用相应的偏移矩阵时额外存储的校验位. 从表3可以看出, OS-ZD 码相比于现有的ZD码总是具有最小的存储开销, 并且存储开销的差距会随着编码参数
4.3 编码性能
(
在前面的讨论中, ZD码都是以位为单位进行的异或计算和偏移. 事实上在实现中, 这样的编解码效率是十分低下的, 系统需要以更大的单位来运算以提升效率. 在我们的编码实现中, OS-ZD码和Cauchy-RS码一样, 采用包作为每次运算的最小单位, 数据块将以数据包为单位进行异或和偏移并生成校验数据, 同样的, 校验块最终产生的额外存储开销也从
从图3可以看到, 相同条件下OS-ZD码的编码吞吐量总是比Cauchy-RS码高86.5%–100.1%, 这是因为OS-ZD码的编码计算量远低于Cauchy-RS码, 使得同种条件时OS-ZD码的计算开销优势很明显. 可以注意到包太小或太大时两种编码的吞吐量都较低, 两种编码受到包大小的影响是相似的, 过小的数据包会导致每次计算的粒度太细, 频繁的存取和计算指令减缓了编解码的速度; 而数据包过大会导致一次编码循环中涉及的数据量太多, 超出了缓存的大小而导致数据频繁地换入/换出缓存. 从图3可见, OS-ZD码和Cauchy-RS码都在包大小为16 KB时实现了最大吞吐量, 因此在后续的实验中, 我们都使用16 KB的包大小来比较两种编码各自的编解码速率.
图4展示了使用(6, 3)作为编码参数时两种纠删码的编码吞吐量. 从图4可以看到, OS-ZD码在所有的块大小参数上的表现都优于Cauchy-RS码. 在块大于1 MB时, OS-ZD码的编码吞吐量比Cauchy-RS码高出64.0%–86.8%. 块较小时, OS-ZD码和Cauchy-RS码的性能差距很大, 在块大小为256 KB时, OS-ZD码的编码吞吐量比Cauchy-RS码高出540%. 这是因为Cauchy-RS码需要在包的基础上进一步细分数据才能进行计算. 如果块太小, Cauchy-RS码的计算效率会变得十分低下, 致使编码吞吐量降低, 而OS-ZD码则由大粒度的异或计算完成编码, 所受负面影响更小.
4.4 解码性能我们测试了两种编码在不同的故障情形下的解码效率, 如图5所示. 图5(a) 展示了发生单个节点故障时的解码吞吐量. 在这种情况下, 两种代码的性能非常接近, 因为Cauchy-RS码条带有一个特殊的校验块
在多块故障的情形下, OS-ZD码的解码吞吐量是高于Cauchy-RS码的(如图5(b)和图5(c)). 由于RS码的矩阵乘法逻辑, 随着故障的数据块增多, Cauchy-RS 码执行的解码计算会变得复杂, 即需要执行比OS-ZD码更多的异或指令. 具体而言, 当两节点发生故障和三节点发生故障时, OS-ZD码分别比Cauchy-RS码高出40%–50%和105%–121%的吞吐量, 如图5(b)和图5(c) 所示.
5 总结与展望本文提出了一种新的基于之字形解码的解码算法, 使ZD码的冗余数据在编解码过程中得到更加充分的利用. 本文还提出偏移矩阵的差异不同性, 并证明了这一性质是ZD码具有MDS性质所需的一个必要条件, 并以此为基础计算出了ZD码存储开销的理论下界, 并提出了OS-ZD码. OS-ZD码以更低的额外存储开销成功地达到了高速编解码的效果.
在目前的工作中, OS-ZD码的编码矩阵暂时还是通过普通的搜索完成的, 这使得该编码无法自由地选取参数; 同时, 现有的解码算法为了寻找暴露位, 需要保存包括各数据位的修复状态在内的许多额外内容, 对内存的占用较大, 并且每次迭代都要通过一次搜索操作来确定所使用的暴露位, 这也增加了不必要的计算开销. 在将来的工作中, 我们会针对这些问题继续展开工作, 不断完善和优化ZD码.
[1] |
Shvachko K, Kuang HR, Radia S, et al. The Hadoop distributed file system. Proceedings of the 26th IEEE Symposium on Mass Storage Systems and Technologies. Incline Village: IEEE, 2010. 1–10.
|
[2] |
Calder B, Wang J, Ogus A, et al. Windows azure storage: A highly available cloud storage service with strong consistency. Proceedings of the 23rd ACM Symposium on Operating Systems Principles. Cascais: ACM, 2011. 143–157.
|
[3] |
Weil SA, Brandt SA, Miller EL, et al. Ceph: A scalable, high-performance distributed file system. Proceedings of the 7th Symposium on Operating Systems Design and Implementation. Seattle: USENIX Association, 2006. 307–320.
|
[4] |
Weatherspoon H, Kubiatowicz JD. Erasure coding vs. replication: A quantitative comparison. Proceedings of the 1st International Workshop on Peer-to-peer Systems. Cambridge: Springer, 2002. 328–337.
|
[5] |
Reed IS, Solomon G. Polynomial codes over certain finite fields. Journal of the Society for Industrial and Applied Mathematics, 1960, 8(2): 300-304. DOI:10.1137/0108018 |
[6] |
Sung CW, Gong XQ. A ZigZag-decodable code with the MDS property for distributed storage systems. Proceedings of the 2013 IEEE International Symposium on Information Theory. Istanbul: IEEE, 2013. 341–345.
|
[7] |
Gong XQ, Sung CW. ZigZag decodable codes: Linear-time erasure codes with applications to data storage. Journal of Computer and System Sciences, 2017, 89: 190-208. DOI:10.1016/j.jcss.2017.05.005 |
[8] |
Hou HX, Lee PPC, Han YS. ZigZag-decodable reconstruction codes with asymptotically optimal repair for all nodes. IEEE Transactions on Communications, 2020, 68(10): 5999-6011. DOI:10.1109/TCOMM.2020.3011718 |
[9] |
Chen J, Li H, Hou HX, et al. A new ZigZag MDS code with optimal encoding and efficient decoding. Proceedings of the 2014 IEEE International Conference on Big Data. Washington: IEEE, 2014. 1–6.
|
[10] |
Dai MJ, Lu ZX, Shen D, et al. Design of (4, 8) binary code with MDS and ZigZag-decodable property. Wireless Personal Communications, 2016, 89(1): 1-13. DOI:10.1007/s11277-016-3234-8 |
[11] |
Lu SS, Zhang CT, Dai MJ. CP-BZD repair codes design for distributed edge computing. Proceedings of the 26th IEEE International Conference on Parallel and Distributed Systems. Hong Kong: IEEE, 2020. 722–727.
|
[12] |
Blaum M, Brady J, Bruck J, et al. EVENODD: An efficient scheme for tolerating double disk failures in RAID architectures. IEEE Transactions on Computers, 1995, 44(2): 192-202. DOI:10.1109/12.364531 |
[13] |
Blaum M, Roth RM. On lowest density MDS codes. IEEE Transactions on Information Theory, 1999, 45(1): 46-59. DOI:10.1109/18.746771 |
[14] |
Corbett P, English B, Goel A, et al. Row-diagonal parity for double disk failure correction. Proceedings of the 3rd USENIX Conference on File and Storage Technologies. San Francisco: USENIX Association, 2004. 1–14.
|
[15] |
Hafner JL, Deenadhayalan V, Rao KK, et al. Matrix methods for lost data reconstruction in erasure codes. Proceedings of the 4th USENIX Conference on File and Storage Technologies. San Francisco: USENIX Association, 2005. 183–196.
|
[16] |
Huang C, Li J, Chen MH. On optimizing XOR-based codes for fault-tolerant storage applications. Proceedings of the 2007 IEEE Information Theory Workshop. Tahoe City: IEEE, 2007. 218–223.
|
[17] |
Plank JS, Schuman CD, Robison BD. Heuristics for optimizing matrix-based erasure codes for fault-tolerant storage systems. Proceedings of the 2012 IEEE/IFIP International Conference on Dependable Systems and Networks. Boston: IEEE, 2012. 1–12.
|
[18] |
Gollakota S, Katabi D. ZigZag decoding: Combating hidden terminals in wireless networks. Proceedings of the 2008 ACM SIGCOMM Conference on Data Communication. Seattle: ACM, 2008. 159–170.
|