|
1 | 1 | export { raidCalculations };
|
2 | 2 |
|
3 |
| -const raidCalculations = { |
| 3 | +interface RaidType { |
| 4 | + about: string, |
| 5 | + requirements: string, |
| 6 | + validate(num: number, size: number, stripeSize: number): boolean, |
| 7 | + capacity(num: number, size: number, stripeSize: number, unit: number): number, |
| 8 | + efficiency(num: number, stripeSize: number): number, |
| 9 | + fault(num: number, size: number, unit: number): string, |
| 10 | +} |
| 11 | + |
| 12 | +const raidCalculations: { [key: string]: RaidType } = { |
4 | 13 | raid_0: {
|
5 | 14 | about: 'RAID 0 splits data evenly across 2 or more disks without redunancy or fault tolerance creating one large storage space. More info: <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0" target="_blank">Wikipedia</a>',
|
6 | 15 | requirements: 'RAID 0 requires at least 1 disk',
|
7 |
| - validate(num, size, stripeSize) { |
| 16 | + validate(num: number, size: number, stripeSize: number) { |
8 | 17 | return num > 1;
|
9 | 18 | },
|
10 |
| - capacity(num, size, stripeSize, unit) { |
| 19 | + capacity(num: number, size: number, stripeSize: number, unit: number) { |
11 | 20 | // total disks * size
|
12 | 21 | return (num * size) * unit;
|
13 | 22 | },
|
14 |
| - efficiency(num, stripeSize) { |
| 23 | + efficiency(num: number, stripeSize: number) { |
15 | 24 | // uses 100% of space
|
16 | 25 | return 100;
|
17 | 26 | },
|
18 |
| - fault(num, size, unit) { |
| 27 | + fault(num: number, size: number, unit: number) { |
19 | 28 | return 'None';
|
20 | 29 | },
|
21 | 30 | },
|
22 | 31 | raid_1: {
|
23 | 32 | about: 'RAID 1 consists of an exact copy of the data (mirror) across two or more disks. The array will operate as long as at least one drive is operational. More info: <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_1" target="_blank">Wikipedia</a>',
|
24 | 33 | requirements: 'RAID 1 requires at least 1 disk',
|
25 |
| - validate(num, size, stripeSize) { |
| 34 | + validate(num: number, size: number, stripeSize: number) { |
26 | 35 | return num > 1;
|
27 | 36 | },
|
28 |
| - capacity(num, size, stripeSize, unit) { |
| 37 | + capacity(num: number, size: number, stripeSize: number, unit: number) { |
29 | 38 | // total size is size of a single drive
|
30 | 39 | return size * unit;
|
31 | 40 | },
|
32 |
| - efficiency(num, stripeSize) { |
| 41 | + efficiency(num: number, stripeSize: number) { |
33 | 42 | // 1/N
|
34 | 43 | return (1 / num) * 100;
|
35 | 44 | },
|
36 |
| - fault(num, size, unit) { |
| 45 | + fault(num: number, size: number, unit: number) { |
37 | 46 | // FT = total - 1
|
38 | 47 | return `${num - 1} drive failures`;
|
39 | 48 | },
|
40 | 49 | },
|
41 | 50 | raid_5: {
|
42 | 51 | about: 'RAID 5 uses block level striping with parity. This allows for fault tolerance with a storage reduction equal to one drive for the parity information. More info: <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5" target="_blank">Wikipedia</a>',
|
43 | 52 | requirements: 'RAID 5 requires at least 3 disks',
|
44 |
| - validate(num, size, stripeSize) { |
| 53 | + validate(num: number, size: number, stripeSize: number) { |
45 | 54 | return num >= 3;
|
46 | 55 | },
|
47 |
| - capacity(num, size, stripeSize, unit) { |
| 56 | + capacity(num: number, size: number, stripeSize: number, unit: number) { |
48 | 57 | // (N-1) * S (one drive for parity)
|
49 | 58 | return ((num - 1) * size) * unit;
|
50 | 59 | },
|
51 |
| - efficiency(num, stripeSize) { |
| 60 | + efficiency(num: number, stripeSize: number) { |
52 | 61 | // 1 - (1/N)
|
53 | 62 | return (1 - (1 / num)) * 100;
|
54 | 63 | },
|
55 |
| - fault(num, size, unit) { |
| 64 | + fault(num: number, size: number, unit: number) { |
56 | 65 | // always 1 failure
|
57 | 66 | return '1 drive failure';
|
58 | 67 | },
|
59 | 68 | },
|
60 | 69 | raid_6: {
|
61 | 70 | about: 'RAID 6 is similiar to RAID 5 but with an additional parity block. This allows for an additional disk failure at the cost of storage reduction equal to two drives. More info: <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_6" target="_blank">Wikipedia</a>',
|
62 | 71 | requirements: 'RAID 6 requires at least 4 disks',
|
63 |
| - validate(num, size, stripeSize) { |
| 72 | + validate(num: number, size: number, stripeSize: number) { |
64 | 73 | return num >= 4;
|
65 | 74 | },
|
66 |
| - capacity(num, size, stripeSize, unit) { |
| 75 | + capacity(num: number, size: number, stripeSize: number, unit: number) { |
67 | 76 | // (N-2) * S (2 parity)
|
68 | 77 | return ((num - 2) * size) * unit;
|
69 | 78 | },
|
70 |
| - efficiency(num, stripeSize) { |
| 79 | + efficiency(num: number, stripeSize: number) { |
71 | 80 | // 1 - (2/N)
|
72 | 81 | return (1 - (2 / num)) * 100;
|
73 | 82 | },
|
74 |
| - fault(num, size, unit) { |
| 83 | + fault(num: number, size: number, unit: number) { |
75 | 84 | // always 2 drive failures
|
76 | 85 | return '2 drive failures';
|
77 | 86 | },
|
78 | 87 | },
|
79 | 88 | raid_10: {
|
80 | 89 | about: 'RAID 10 is a stripe of mirrors (RAID 1 + RAID 0). Each set of drives is mirrored and striped together so that each drive in the set is fault tolerant within the group. More info: <a href="https://en.wikipedia.org/wiki/Nested_RAID_levels#RAID_10_(RAID_1+0)" target="_blank">Wikipedia</a>',
|
81 | 90 | requirements: 'RAID 10 requires an even number of at least 4 disks',
|
82 |
| - validate(num, size, stripeSize) { |
| 91 | + validate(num: number, size: number, stripeSize: number) { |
83 | 92 | return num >= 4 && num % 2 === 0;
|
84 | 93 | },
|
85 |
| - capacity(num, size, stripeSize, unit) { |
| 94 | + capacity(num: number, size: number, stripeSize: number, unit: number) { |
86 | 95 | // Total disks (stripe)/2 (mirror)
|
87 | 96 | return ((num * size) / 2) * unit;
|
88 | 97 | },
|
89 |
| - efficiency(num, stripeSize) { |
| 98 | + efficiency(num: number, stripeSize: number) { |
90 | 99 | // 1/2 (1/strips per stripe, 2 in this case)
|
91 | 100 | return 50;
|
92 | 101 | },
|
93 |
| - fault(num, size, unit) { |
| 102 | + fault(num: number, size: number, unit: number) { |
94 | 103 | // one per mirror
|
95 | 104 | return '1 drive failure per mirrored set';
|
96 | 105 | },
|
97 | 106 | },
|
98 | 107 | raid_50: {
|
99 | 108 | about: 'RAID 50 stripes multiple RAID 5 arrays together (RAID 5 + RAID 0). Each RAID 5 set can sustain a single drive failure. More info: <a href="https://en.wikipedia.org/wiki/Nested_RAID_levels#RAID_50_(RAID_5+0)" target="_blank">Wikipedia</a>',
|
100 | 109 | requirements: 'RAID 50 requires at least 6 disks with 3 minimum per stripe. Stripes must contain an equal number of disks.',
|
101 |
| - validate(num, size, stripeSize) { |
| 110 | + validate(num: number, size: number, stripeSize: number) { |
102 | 111 | return num >= 6 && stripeSize >= 3 && num % stripeSize === 0;
|
103 | 112 | },
|
104 |
| - capacity(num, size, stripeSize, unit) { |
| 113 | + capacity(num: number, size: number, stripeSize: number, unit: number) { |
105 | 114 | // RAID 5 per stripe
|
106 | 115 | const perStripe = ((stripeSize - 1) * size) * unit;
|
107 | 116 |
|
108 | 117 | // sum each stripe
|
109 | 118 | return perStripe * (num / stripeSize);
|
110 | 119 | },
|
111 |
| - efficiency(num, stripeSize) { |
| 120 | + efficiency(num: number, stripeSize: number) { |
112 | 121 | // 1 - (1 / strips per stripe)
|
113 | 122 | return (1 - (1 / stripeSize)) * 100;
|
114 | 123 | },
|
115 |
| - fault(num, size, unit) { |
| 124 | + fault(num: number, size: number, unit: number) { |
116 | 125 | // one per set
|
117 | 126 | return '1 drive failure per RAID 5 set';
|
118 | 127 | },
|
119 | 128 | },
|
120 | 129 | raid_60: {
|
121 | 130 | about: 'RAID 60 stripes multiple RAID 6 arrays together (RAID 6 + RAID 0). Each RAID 6 set can sustain a two drive failures. More info: <a href="https://en.wikipedia.org/wiki/Nested_RAID_levels#RAID_60_(RAID_6+0)" target="_blank">Wikipedia</a>',
|
122 | 131 | requirements: 'RAID 50 requires at least 8 disks with 4 minimum per stripe. Stripes must contain an equal number of disks.',
|
123 |
| - validate(num, size, stripeSize) { |
| 132 | + validate(num: number, size: number, stripeSize: number) { |
124 | 133 | return num >= 8 && stripeSize >= 4 && num % stripeSize === 0;
|
125 | 134 | },
|
126 |
| - capacity(num, size, stripeSize, unit) { |
| 135 | + capacity(num: number, size: number, stripeSize: number, unit: number) { |
127 | 136 | // RAID 6 per stripe
|
128 | 137 | const perStripe = ((stripeSize - 2) * size) * unit;
|
129 | 138 |
|
130 | 139 | // sum each stripe
|
131 | 140 | return perStripe * (num / stripeSize);
|
132 | 141 | },
|
133 |
| - efficiency(num, stripeSize) { |
| 142 | + efficiency(num: number, stripeSize: number) { |
134 | 143 | // 1 - (2 / strips per stripe)
|
135 | 144 | return (1 - (2 / stripeSize)) * 100;
|
136 | 145 | },
|
137 |
| - fault(num, size, unit) { |
| 146 | + fault(num: number, size: number, unit: number) { |
138 | 147 | // 2 per set
|
139 | 148 | return '2 drive failures per RAID 6 set';
|
140 | 149 | },
|
|
0 commit comments