Replication-based Distributed Storage Systems with Variable Repetition Degrees Bing Zhu† , Hui Li† , Hanxu Hou† , and Kenneth W. Shum‡ Eng. Lab of Converged Networks Technology, Peking University Shenzhen Graduate School, China ‡ Institute of Network Coding, The Chinese University of Hong Kong, Hong Kong E-mail:
[email protected],
[email protected],
[email protected],
[email protected]
† Shenzhen
Abstract—We consider a class of regenerating codes for distributed storage systems that provide exact and uncoded repair at the minimum bandwidth regenerating point. The desirable properties can be achieved by a coding scheme which concatenates an outer MDS code and an inner fractional repetition (FR) code. However, it is desirable to have the more popular packets with higher repetition degrees in practical systems. Motivated by this, we propose a new framework of code design where the repetition degrees of coded packets can be different. By adopting group divisible designs, our framework allows the design of system over a large range of parameters. Moreover, we make use of the systematic feature of MDS codes and wisely partition the storage nodes into several clusters. We show that in normal cases, data reconstruction time can be greatly reduced while contacting nodes in the same cluster. Index Terms—Distributed storage systems, fractional repetition codes, minimum bandwidth regenerating, group divisible designs.
I. I NTRODUCTION Distributed storage system plays a prominent role in the ever-increasing demand of large scale data storage, such as online file sharing, cloud storage, etc. It can provide highperformance storage service even in the presence of frequent node failures, which makes it very competitive in today’s pluralistic storage systems. Specifically, in a typical distributed storage environment, the source file is split and delivered to a large number of unreliable nodes in a distributed fashion. By introducing redundancy, this architecture allows the system resilient to node failures within a threshold. From a practical perspective, it is highly desirable to keep the reliability of distributed storage systems above a certain level. Motivated by the pursuit of high reliability, many data storage technologies have been proposed in the literature. Replication strategy has long been adopted in the Google file system [1], where the source file is available as long as one data copy in the system remains active. This scheme has the advantage of simple and easy to implement, however, is weak in storage efficiency. The use of erasure coding in the distributed storage systems provides higher fault-tolerance and lower storage costs, which can be seen in Total Recall [2] system and Hadoop Distributed File System [3] for instance. It is verified that for the same amount of redundancy, coding scheme can potentially provide much more reliability compared to replication [4]. Precisely, a source file of size M is c 2014 IEEE 978-1-4799-2361-8/14/$31.00 ⃝
divided into k equal fragments, each of size M/k. These fragments are then encoded into n coded blocks using an (n, k) maximum distance separable (MDS) code and distributed over n different nodes which can spread over a wide geographical area, satisfying that any k out of the n nodes are able to reconstruct the original file. It can be seen that compared to the replication strategy, erasure coding techniques achieve better storage efficiency. However, a data collector (DC) has to recover the whole file and re-encode the data in the presence of node failures, which induces excessive repair bandwidth overheads when the source object is very large. In order to minimize bandwidth consuming during the repair process, Dimakis et al. proposed in [5] a new paradigm of coding, termed regenerating codes. When a storage node fails, a replacement node is introduced by downloading the same amount of data from arbitrary d (d ≥ k) survivor nodes. Each contacted node delivers a small fraction rather than the entire data it stored to the new node. In addition, they also established a tradeoff between storage per node and repair bandwidth. More specifically, minimum repair bandwidth is theoretically identified, which is of special interest for that in realistic systems, bandwidth resource is much more critical compared to storage. Nevertheless, the reduce in bandwidth is at the price of repair complexity, i.e., plenty of linear operations are needed for the data regeneration. In [6], a simple coding scheme for repair at the minimum-bandwidth regenerating (MBR) point is introduced, which is called fractional repetition (FR) code. Simply by concatenating an outer MDS code and an inner fractional repetition code, FR codes achieve exact and uncoded repair, which is proceeded by directly downloading the exact packets from contacted nodes without any additional operations. Explicit FR codes are designed in [6], [7], [8], [9], which are primarily based on combinatorial structures. In this paper, we consider a more flexible scheme of FR codes, which is suitable for the widely emerging applications in a heterogeneous environment [10]. We relax the constraint on the repetition degree in the conventional model by taking two types of repetition degrees into consideration. Intuitively, the more “important” packets should have higher repetition degrees. Heading this direction, we present a new design framework where the outer MDS code is always made systematic [11] (that is, one copy of the source data remains in the uncoded form). Due to the asymmetrical overheads
in data reconstruction, native packets can be replicated more compared to the parity-check packets. Moreover, we can wisely choose the nodes in this framework and partition them into several clusters. It can be seen that in normal cases, data can be read directly from the uncoded copy from nodes in the same cluster. Upon failure of a node, regeneration can be done by contacting nodes within the same cluster and those from one more other cluster. The rest of this paper is organized as follows. We provide some necessary definitions and notations in the next section. Section III describes the explicit FR codes constructions with variable repetition degrees from group divisible designs. We also discuss the basic properties of proposed codes and make some comparisons with conventional FR codes. A new design framework using the proposed codes is presented in Section IV. We conclude the paper in Section V with general remarks.
nodes that contacted in the repair process. In the normal cases, the following conditions hold that k ≤ d ≤ n − 1. Note that a node may store more than one packet, thus the parameters n and k can differ from those of MDS codes discussed before. To avoid ambiguity, in the rest of this paper, k represents the reconstruction degree and n is the number of storage nodes in the system. The storage capacity of a system in the MBR regime, denoted by CM BR , identifies the maximum file size that can be delivered to a user by contacting any k out of the n nodes. For the case that a replacement node downloads exactly one packet from each of the d survivor nodes, the capacity of an (n, k, d) distributed storage system can be calculated as ( ) k CM BR = kd − . (1) 2
II. P RELIMINARIES
This expression, though derived from the functional repair model [5] where the regenerated packets can be different from the lost data as long as the MDS property is retained after repair, can also be achieved by the exact-repair MBR codes [12]. In the presence of node failures, we will always assume that each of the d contacted nodes transfers exactly one packet to the replacement node. Therefore, it can be seen that in the exact repair regime, d also represents the node storage capacity expressed in packets.
A. Systematic MDS Codes The study of MDS codes has been highly mature that code constructions are available for any parameters. Typically, a file of k packets can be viewed as a k-dimensional vector (m1 , m2 , . . . , mk ) over Fq , where Fq is a finite field of size q. Then, we can obtain an MDS code of length n by multiplying a k × n generator matrix G. For instance, Reed-Solomon code (a classical MDS code), is historically the most investigated where Vandermonde matrix can be adopted as the generator matrix such that the MDS property is maintained from the fact that any k × k submatrix is invertible. Systematic MDS codes, where the k divided data packets are explicitly present amongst the packets collection stored in a select set of storage nodes, are of special interest for that the source file can be obtained directly from the uncoded packets without extra decoding. We also refer to the k packets as systematic symbols. In particular, systematic MDS codes can be constructed by containing a k × k identity matrix in the generator matrix, i.e., 1 · · · 0 g1,k+1 · · · g1,n .. .. . .. G := ... . . . ... . . . 0 ···
1 gk,k+1
···
gk,n
Then, we can get n − k parity symbols pk+1 , pk+2 , . . . , pn , where k ∑ pi = mj gj,i , k + 1 ≤ i ≤ n. j=1
Therefore, the generated n packets can be further denoted as (m1 , . . . , mk , pk+1 , . . . , pn ), where packets and symbols are interchangeable. It is clear that exact repair of the systematic packets is mandated in the presence of node failure. B. Distributed Storage Systems A distributed storage system is determined by the triplet (n, k, d), where n is the total number of storage nodes in the system, k is the least number of nodes needed for data reconstruction, and d is the repair degree that specifies the number of
C. Variable Fractional Repetition Codes As pointed out before, conventional FR codes consist of two components: an outer MDS code and an inner fractional repetition code. Typically, an original data (containing several packets) is taken as the input to a select MDS code. Then each output packet is repeated ρ times, where ρ is a positive integer and referred to as the repetition degree. We relax the constraint on parameter ρ and construct a new family of FR codes that allow coded packets with different repetition degrees, termed Variable Fractional Repetition (VFR) codes. Precisely, we assume that there are two types of repetition degrees in the system. The formal definition of VFR codes is presented as follows. Definition 1. (VFR Code): Let ρ1 and ρ2 be positive integers, and let [n] denote the set {1, 2, ..., n}. A VFR code C for an (n, k, d) distributed storage system, is a collection of n subsets {ξ1 , ξ2 , . . . , ξn } of a symbol set Ω = [θ], which satisfies the following conditions: 1) The cardinality of each ξi is d, for 1 ≤ i ≤ n. 2) Each symbol in Ω belongs to ρ sets in the collection, where ρ ∈ {ρ1 , ρ2 }. Note that if ρ1 = ρ2 , VFR codes are identical to those of [6]. In this definition, each individual set ξi corresponds to a node in the system, and the points in the sets indicate the indices of coded packets that stored on the node. Since every pair of nodes can share some packets in common, we define the VFR code rate RC (k) that identifies the number of distinct packets when contacting any k nodes.
Figure 1. A VFR code with ρ1 = 3 and ρ2 = 2 for a (6, 2, 3) distributed storage system. The points in the blocks give the indices of the specific packets that stored on the node. For instance, node N1 contains symbols M1 , M2 , P5 .
Definition 2. (VFR Code Rate): The VFR code rate RC (k) of code C = {ξ1 , ξ2 , . . . , ξn } for an (n, k, d) distributed storage system, is defined as RC (k) :=
min
|I|=k,I⊂[n]
|∪i∈I ξi | .
Moreover, a VFR code is referred to as universally good if its rate is no less than the system capacity, i.e., RC (k) ≥ CM BR (n, k, d) for k = 1, . . . , d. As will be evident, all the VFR codes constructed in this paper are universally good. Example 3. A VFR code for a (6, 2, 3) distributed storage system is depicted in Fig. 1. A file of M = 4 packets (M1 , . . . , M4 ) ∈ Fq4 that needs to be stored on the system. After a (7, 4) systematic MDS code, we obtain 3 parity packets P5 , P6 , P7 . Each systematic packet is then repeated 3 times, and each parity packet has a repetition degree of 2, i.e., ρ1 = 3, ρ2 = 2. When a node fails, regeneration can be proceeded by downloading one packet each from a specific set of d = 3 nodes. Furthermore, any user can retrieve the source file by contacting any k = 2 nodes. In particular, if a user (DC) connects to two nodes such as {N3 , N4 }, the file can be read directly without performing decoding. We further illustrate this interesting finding in Section IV. In analogy with conventional FR codes, it is to be noted that a repair table needs to be maintained during the regeneration of VFR codes. Specifically, the repair table indicates the possible alternatives of d nodes that can be contacted in the presence of a specific node failure, which differs from the random access model in the literature. For example, when node N1 fails, a replacement node can be generated by contacting nodes {N2 , N3 , N4 }, but not {N3 , N4 , N5 }. The table-based repair model, however, reduces the complexity in the repair process, which makes it very attractive in practical systems. III. VFR C ODES FROM G ROUP D IVISIBLE D ESIGNS In this section, we present a method to generate explicit VFR codes from group divisible designs and discuss the properties of designed codes. We first provide a brief description of group divisible designs [13].
1) G is a partition of a set V (of points) into subsets called groups, where |G| > 1; 2) B is a set of subsets of V (called blocks) such that a group and a block contain at most one common point; 3) every pair of points from distinct groups occurs in a unique block. Let B be a set of positive integers and let v denote the cardinality of V. A GDD is referred to as a B-GDD if |B| ∈ B for every block B ∈ B. When B = {b}, we simply write b for B. If v = a1 g1 + a2 g2 + . . . + as gs , and if there are ai groups of size gi (i = 1, 2, ..., s), then the B-GDD is said to be of type g1a1 g2a2 ...gsas . For the ease of description, we will use this exponential notation for the group type. It can be verified that if all the blocks are of the same size, each point in the same group belongs to the identical number of blocks. However, the points from different groups may occur in different number of blocks. More specifically, given a b-GDD of type g1a1 g2a2 ...gsas , a certain point from the group of size gi occurs in ri distinct blocks, where ∑s j=1 aj gj − gi , i ∈ [s]. (2) ri = b−1 Note that there may exist some isomorphic designs for a specific GDD, we only consider one possible design in this paper. It can be seen that our construction can be extended to all the isomorphic designs. B. Codes from Group Divisible Designs Consider a 3-GDD of type 14 31 , hence the cardinality is 7. Suppose that V = {1, . . . , 7}, and the 5 groups are partitioned as G = {{1}, {2}, {3}, {4}, {5, 6, 7}}. Correspondingly, the blocks are {1, 2, 5}, {3, 4, 5}, {1, 3, 6}, {2, 4, 6}, {1, 4, 7}, {2, 3, 7}. Using the above 3-GDD, we can construct an explicit VFR code as illustrated in Example 3, where each block is taken as a storage node and the points in the blocks show the indices of specific packets. Since all the nodes in the system are of the identical capacity, we are mostly interested in the b-GDDs. This example suggests the following direct construction. Construction: Given a b-GDD of type g i hj , where g ̸= h and i, j are positive integers. A VFR code can be generated by taking C = B and θ = gi + hj. Besides, the parameters of the VFR code are given by ρ1 =
(i − 1)g + hj (j − 1)h + gi , ρ2 = . b−1 b−1
(3)
A. Group Divisible Designs
Equation (3) can be directly derived from (2). This construction gives a distributed storage system with repair degree d = b. Furthermore, the number of nodes in the system which adopts the VFR code constructed above can be determined by the following proposition.
A group divisible design (GDD) is a triple (V, G, B), which satisfies the following properties:
Proposition 4. The node size n of the distributed storage system that implemented the VFR code designed by the above
Metrics Repetition degree ρave Nodes failure tolerance
construction is given by: n=
gi(v − g) + hj(v − h) , b(b − 1)
(4)
Conventional FR codes ρ integer ρ−1
Table I A COMPARISON BETWEEN CONVENTIONAL FR
where v = gi + hj. Proof: From the construction, it is clear that there are gi points of repetition degree ρ1 and hj points of degree ρ2 . Thus, a total of giρ1 + hjρ2 packets are generated and stored on the storage nodes, each of capacity d = b. Thus, we obtain the node size in the system. It can be observed that any pair of points occurs in either a block or a group for a b-GDD. This implies that any two nodes, which correspond to the blocks, can share no more than one symbol ( ) in the above construction. Therefore, there are at most k2 repeated packets in any collection of k nodes, i.e., RC (k) ≥ CM BR (n, k, d). Therefore, the VFR code constructed above can achieve the storage capacity CM BR for all k = 1, . . . , d, as stated in the following lemma. Theorem 5. VFR codes designed by the above construction are universally good. Note that g is not equal to h, this indicates that ρ1 ̸= ρ2 from equation (3). It can be seen that the system incorporated VFR codes is resilient to multiple node failures. In addition, our construction can tolerate up to min{ρ1 , ρ2 } − 1 failures without loss of the uncoded repair property. One more node failure may result in the data reconstruction. For instance, if nodes N1 , N2 in Example 3 fail together, the user will have to recover the file and re-encode to obtain the parity packet P5 . This implies that the smaller repetition degree determines the nodes failure tolerance under the exact and uncoded repair model. Therefore, in practical systems, it is applicable to have the two types of repetition degrees that are close to each other, such as two consecutive integers. Furthermore, we define the average repetition degree of VFR codes, denoted by ρave : ρave
giρ1 + hjρ2 = . gi + hj
(5)
For instance, the VFR code implemented in Example 3 has = 2.57. an average repetition degree of ρave = 4×3+3×2 7 However, it is known that the average repetition degree of the conventional FR codes is an integer (i.e., ρave = ρ), from the fact that each packet is of the identical repetition degree. Thus, we emphasize that our codes can achieve an average decimal rather than integer redundancy without loss of the exact and uncoded repair property. Table I summarizes the differences between conventional FR codes in [6] and VFR codes proposed in this paper. IV. A N EW D ESIGN F RAMEWORK U SING VFR C ODES We have presented the explicit VFR codes construction in the previous sections, where different packets have various repetition degrees. Moreover, in a realistic scenario, it is natural to have the more popular packets with higher repetition degrees. For example, the systematic packets of an MDS code deserve
VFR codes ρ1 , ρ2 decimal min{ρ1 , ρ2 } − 1
CODES AND
N1 N2
1 3 7 1 4 8
VFR
CODES .
2 3 9
N1
1 3 7
N7
1 5 9
N8
2 4 10
N2
2 6 7
N8
2 3 9 4 6 9
N7
C1
C3
N3
1 5 9
N9
4 5 7
N3
4 5 7
N9
N4
1 6 10
N10
3 6 8
N4
1 4 8
N10 1 6 10
4 6 9
N5
2 5 8
N6
3 6 8
N5
2 6 7
N11
N6
2 5 8
N12 3 5 10
(a)
C2
C4
N11 2 4 10 N12 3 5 10
(b)
Figure 2. A VFR code for a (12, 3, 3) distributed storage system. (a) All the blocks are taken as storage nodes without any processing. (b) All the nodes are partitioned into four clusters, wherein each cluster contains exactly one copy of the uncoded packets.
the higher repetition degrees, for that they provide direct data reconstruction without decoding. Heading this direction, we present a new design framework based on VFR codes where the systematic symbols are of higher repetition degrees. We start by the following example. Example 6. Consider a 3-GDD of type 23 41 , and {1, 2}, {3, 4}, {5, 6}, {7, 8, 9, 10} are taken as the groups. The blocks are listed as follows: {1, 3, 7}, {1, 4, 8}, {1, 5, 9}, {1, 6, 10}, {2, 6, 7}, {2, 5, 8}, {2, 3, 9}, {2, 4, 10}, {4, 5, 7}, {3, 6, 8}, {4, 6, 9}, {3, 5, 10}. By adopting the above design, we can obtain a VFR code with ρ1 = 4 and ρ2 = 3. More specifically, a systematic (10, 6) MDS code is generated with 6 systematic symbols and 4 parity symbols. Each systematic packet is repeated 4 times, and each parity packet has a repetition degree of 3. All these give a total of 36 packets that are stored on a distributed storage system with 12 nodes, where each node contains 3 packets. The explicit placement of the packets is shown in Fig. 2(a). It can be seen that any user who contacts k = 3 nodes can recover the source file. From the MDS property, it is clear that anyone who obtains 6 distinct packets can retrieve the original file. However, the reconstruction overheads can vary a lot, depending on which specific set of k nodes have been contacted. For instance, if a user connects to nodes N1 , N5 and N9 , he will get all the 6 systematic symbols and no additional operations are needed. While contacting nodes N1 , N3 and N12 , he can only obtain three systematic packets. Thus, it is necessary to perform decoding on the obtained parity packets, such as matrix inversion and linear combinations.
It is highly desirable to have the systematic feature, for that in the normal cases data can be directly recovered from the uncoded copy without any decoding process. Motivated by this, we carefully partition the above twelve nodes into four separate clusters C1 , . . . , C4 , as depicted in Fig. 2(b). It can be seen that each cluster contains exactly one copy of all the systematic packets and one more specific parity packet. In this sense, if a user contacts any one of the four clusters (each contains k = 3 nodes), he can easily read the file without decoding. When a node fails, the single parity packet can be regenerated by any one of the nodes in the same cluster, and the systematic packets can be downloaded from one more other cluster. For example, if node N1 fails, a replacement node can recover the lost packets by downloading one packet each from nodes {N2 , N4 , N6 }, where N2 ∈ C1 and N4 , N6 ∈ C2 . It can be seen that the cluster-based nodes partition can reduce the data reconstruction time as compared to the random access model. The partition, though, is simple and easy to implement. We believe that this is a well-justified price to pay with respect to the time reduce in the data recovery. Moreover, in practical systems, the cluster details can be stored in the metadata of the tracker server. Hence in normal cases, a user can connect to the nodes in the same cluster and retrieve the file directly. Note that each node contains exactly one parity packet, and storage nodes with the same parity packet are included in the same cluster. This implies that we can adopt the b-GDDs of type g i f 1 in the construction of the specific VFR codes, where the group of size f shows the indices of the parity packets. More specifically, an outer systematic MDS code with parameters (gi+f, gi) is generated, where the systematic symbols are labeled by {1, . . . , gi} and parity packets are of indices {gi + 1, . . . , gi + f }. All these give a VFR code with gi ρ1 = g(i−1)+f , ρ2 = b−1 . b−1 We always assume that systematic symbols are of the higher repetition degrees, thus it follows that g < f . For the sake of data reconstruction, it is required that the VFR code rate is no less than gi, i.e., RC (k) ≥ gi. Moreover, since each cluster contains one copy of the systematic packets and one distinct parity packet, it is clear that the repetition degree of each systematic packet is equal to the number of parity packets, that is, g(i − 1) + f f= . (6) b−1 For instance, the explicit VFR code constructed in Example 3 can be partitioned into three clusters as {{1, 2, 5}, {3, 4, 5}}, {{1, 3, 6}, {2, 4, 6}},{{1, 4, 7}, {2, 3, 7}}, where f = ρ1 = 3 and gi = 4 ≤ RC (2) = 5. The above VFR codes are constructed assuming that there exist the b-GDDs of desired types, which is not always true. However, the necessary conditions of the b-GDDs of type g i f 1 for small block sizes (namely, b = 3, 4, 5), are given in [13]. If we evaluate all the possible group types, then we have the appropriate designs of small order, such as 3-GDD of type {14 31 , 23 41 , 16 51 } and 4-GDD of type 19 41 , etc.
V. C ONCLUSION In this paper, we propose a new family of FR codes, termed VFR codes, which achieves an overall decimal rather than integer redundancy without loss of the exact and uncoded repair property. By adopting the group divisible designs, we are able to construct VFR codes over a wide range of parameters. Our codes can be extended to more general cases, in which the repetition degrees of all the packets are different. In particular, we present a new design framework based on the VFR codes, where the storage nodes can be partitioned into several clusters. This framework in conjunction with the systematic MDS feature can greatly reduce the data recover time. Future work would include constructions of VFR codes from other combinatorial structures. ACKNOWLEDGMENT This work is supported in part by the National Basic Research Program of China (973 Program, No. 2012CB315904), the National Natural Science Foundation of China (No. NSFC61179028) and a grant from University Grants Committee of the Hong Kong Special Administrative Region, China (Project No. AoE/E-02/08). R EFERENCES [1] S. Ghemawat, H. Gobioff, and S.-T. Leung, “The Google file system,” in Proc. of the 19th ACM SIGOPS Symp. on Operating Systems Principles (SOSP’03), Oct. 2003. [2] R. Bhagwan, K. Tati, Y. Cheng, S. Savage, and G. Voelker, “Total recall: system support for automated availability management,” in Proc. of the 1st Conf. on Networked Systems Design and Implementation, San Francisco, Mar. 2004. [3] A. Thusoo, Z. Shao, S. Anthony, D. Borthakur, N. Jain, J. Sen Sarma, R. Murthy, and H. Liu, “Data warehousing and analytics infrastructure at facebook,” in Proc. of the 2010 ACM SIGMOD Intl. Conference on Management of data, ser. SIGMOD’10, 2010. [4] H. Weatherspoon and J. D. Kubiatowicz, “Erasure coding vs. replication: A quantitative comparison,” in Proc. Int. Workshop Peer-to-Peer Syst., 2002. [5] A. G. Dimakis, P. B. Godfrey, Y. Wu, M. Wainwright, and K. Ramchandran, “Network Coding for Distributed Storage Systems,” IEEE Trans. on Inf. Theory, vol. 56, no. 9, pp. 4539–4551, 2010. [6] S. El Rouayheb and K. Ramchandran, “Fractional repetition codes for repair in distributed storage systems,” in 48th Annual Allerton Conference on Communication, Control, and Computing, pp. 1510–1517, Oct. 2010. [7] S. Pawar, N. Noorshams, S. El Rouayheb, and K. Ramchandran, “Dress codes for the storage cloud: Simple randomized constructions,” in Proc. of IEEE International Symposium on Information Theory, pp. 2338–2342, Jul. 2011. [8] J. Koo and J. Gill, “Scalable constructions of fractional repetition codes in distributed storage systems,” in 49th Annual Allerton Conference on Communication, Control, and Computing, pp. 1366–1373, Sept. 2011. [9] O. Olmez and A. Ramamoorthy, “Repairable replication-based storage systems using resolvable designs,” in 50th Annual Allerton Conference on Communication, Control, and Computing, pp. 1174–1181, Oct. 2012. [10] M. K. Gupta, A. Agrawal, D. Yadav, “On Weak Dress Codes for Cloud Storage,” in arXiv:1302.3681v1 [cs.IT], Feb. 2013. [11] Y. Wu, “A Construction of Systematic MDS Codes With Minimum Repair Bandwidth,” IEEE Trans. on Inf. Theory, vol. 57, no. 6, pp. 3738–3741, 2011. [12] K. V. Rashmi, N. B. Shah, P. V. Kumar, and K. Ramchandran, “Explicit Construction of Optimal Exact Regenerating Codes for Distributed Storage,” in 47th Annual Allerton Conference on Communication, Control, and Computing, pp. 1243–1249, Sept. 2009. [13] C. J. Colbourn and J. H. Dinitz, Handbook of Combinatorial Designs, Second Edition. Chapman and Hall/CRC, 2006.