2024-07-28 20:25:09 +00:00
export { raidCalculations } ;
2024-07-31 20:51:34 +00:00
interface RaidType {
about : string ,
requirements : string ,
validate ( num : number , size : number , stripeSize : number ) : boolean ,
capacity ( num : number , size : number , stripeSize : number , unit : number ) : number ,
efficiency ( num : number , stripeSize : number ) : number ,
fault ( num : number , size : number , unit : number ) : string ,
}
const raidCalculations : { [ key : string ] : RaidType } = {
2024-07-28 20:25:09 +00:00
raid_0 : {
2024-07-29 19:50:37 +00:00
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>' ,
2024-07-28 20:25:09 +00:00
requirements : 'RAID 0 requires at least 1 disk' ,
2024-07-31 20:51:34 +00:00
validate ( num : number , size : number , stripeSize : number ) {
2024-07-29 19:50:37 +00:00
return num > 1 ;
2024-07-28 20:25:09 +00:00
} ,
2024-07-31 20:51:34 +00:00
capacity ( num : number , size : number , stripeSize : number , unit : number ) {
2024-07-28 20:25:09 +00:00
// total disks * size
return ( num * size ) * unit ;
} ,
2024-07-31 20:51:34 +00:00
efficiency ( num : number , stripeSize : number ) {
2024-07-29 20:30:31 +00:00
// uses 100% of space
return 100 ;
} ,
2024-07-31 20:51:34 +00:00
fault ( num : number , size : number , unit : number ) {
2024-07-29 19:50:37 +00:00
return 'None' ;
} ,
2024-07-28 20:25:09 +00:00
} ,
raid_1 : {
2024-07-29 13:19:39 +00:00
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>' ,
2024-07-28 20:25:09 +00:00
requirements : 'RAID 1 requires at least 1 disk' ,
2024-07-31 20:51:34 +00:00
validate ( num : number , size : number , stripeSize : number ) {
2024-07-29 19:50:37 +00:00
return num > 1 ;
2024-07-28 20:25:09 +00:00
} ,
2024-07-31 20:51:34 +00:00
capacity ( num : number , size : number , stripeSize : number , unit : number ) {
2024-07-28 20:25:09 +00:00
// total size is size of a single drive
return size * unit ;
} ,
2024-07-31 20:51:34 +00:00
efficiency ( num : number , stripeSize : number ) {
2024-07-29 20:30:31 +00:00
// 1/N
return ( 1 / num ) * 100 ;
} ,
2024-07-31 20:51:34 +00:00
fault ( num : number , size : number , unit : number ) {
2024-07-28 20:25:09 +00:00
// FT = total - 1
2024-07-29 19:50:37 +00:00
return ` ${ num - 1 } drive failures ` ;
} ,
2024-07-28 20:25:09 +00:00
} ,
raid_5 : {
2024-07-29 13:19:39 +00:00
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>' ,
2024-07-28 20:25:09 +00:00
requirements : 'RAID 5 requires at least 3 disks' ,
2024-07-31 20:51:34 +00:00
validate ( num : number , size : number , stripeSize : number ) {
2024-07-29 19:50:37 +00:00
return num >= 3 ;
2024-07-28 20:25:09 +00:00
} ,
2024-07-31 20:51:34 +00:00
capacity ( num : number , size : number , stripeSize : number , unit : number ) {
2024-07-28 20:25:09 +00:00
// (N-1) * S (one drive for parity)
return ( ( num - 1 ) * size ) * unit ;
} ,
2024-07-31 20:51:34 +00:00
efficiency ( num : number , stripeSize : number ) {
2024-07-29 20:30:31 +00:00
// 1 - (1/N)
return ( 1 - ( 1 / num ) ) * 100 ;
} ,
2024-07-31 20:51:34 +00:00
fault ( num : number , size : number , unit : number ) {
2024-07-28 20:25:09 +00:00
// always 1 failure
2024-07-29 19:50:37 +00:00
return '1 drive failure' ;
} ,
2024-07-28 20:25:09 +00:00
} ,
raid_6 : {
2024-07-29 13:19:39 +00:00
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>' ,
2024-07-28 20:25:09 +00:00
requirements : 'RAID 6 requires at least 4 disks' ,
2024-07-31 20:51:34 +00:00
validate ( num : number , size : number , stripeSize : number ) {
2024-07-29 19:50:37 +00:00
return num >= 4 ;
2024-07-28 20:25:09 +00:00
} ,
2024-07-31 20:51:34 +00:00
capacity ( num : number , size : number , stripeSize : number , unit : number ) {
2024-07-28 20:25:09 +00:00
// (N-2) * S (2 parity)
return ( ( num - 2 ) * size ) * unit ;
} ,
2024-07-31 20:51:34 +00:00
efficiency ( num : number , stripeSize : number ) {
2024-07-29 20:30:31 +00:00
// 1 - (2/N)
return ( 1 - ( 2 / num ) ) * 100 ;
} ,
2024-07-31 20:51:34 +00:00
fault ( num : number , size : number , unit : number ) {
2024-07-28 20:25:09 +00:00
// always 2 drive failures
2024-07-29 19:50:37 +00:00
return '2 drive failures' ;
} ,
2024-07-28 20:25:09 +00:00
} ,
raid_10 : {
2024-07-30 14:37:45 +00:00
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>' ,
2024-07-28 20:25:09 +00:00
requirements : 'RAID 10 requires an even number of at least 4 disks' ,
2024-07-31 20:51:34 +00:00
validate ( num : number , size : number , stripeSize : number ) {
2024-07-29 19:50:37 +00:00
return num >= 4 && num % 2 === 0 ;
2024-07-28 20:25:09 +00:00
} ,
2024-07-31 20:51:34 +00:00
capacity ( num : number , size : number , stripeSize : number , unit : number ) {
2024-07-28 20:25:09 +00:00
// Total disks (stripe)/2 (mirror)
return ( ( num * size ) / 2 ) * unit ;
} ,
2024-07-31 20:51:34 +00:00
efficiency ( num : number , stripeSize : number ) {
2024-07-29 20:30:31 +00:00
// 1/2 (1/strips per stripe, 2 in this case)
return 50 ;
} ,
2024-07-31 20:51:34 +00:00
fault ( num : number , size : number , unit : number ) {
2024-07-29 13:19:39 +00:00
// one per mirror
2024-07-29 19:50:37 +00:00
return '1 drive failure per mirrored set' ;
} ,
} ,
2024-07-30 14:37:45 +00:00
raid_50 : {
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>' ,
2024-07-30 14:46:09 +00:00
requirements : 'RAID 50 requires at least 6 disks with 3 minimum per stripe. Stripes must contain an equal number of disks.' ,
2024-07-31 20:51:34 +00:00
validate ( num : number , size : number , stripeSize : number ) {
2024-07-30 14:37:45 +00:00
return num >= 6 && stripeSize >= 3 && num % stripeSize === 0 ;
} ,
2024-07-31 20:51:34 +00:00
capacity ( num : number , size : number , stripeSize : number , unit : number ) {
2024-07-30 14:46:09 +00:00
// RAID 5 per stripe
2024-07-30 14:37:45 +00:00
const perStripe = ( ( stripeSize - 1 ) * size ) * unit ;
// sum each stripe
return perStripe * ( num / stripeSize ) ;
} ,
2024-07-31 20:51:34 +00:00
efficiency ( num : number , stripeSize : number ) {
2024-07-30 14:37:45 +00:00
// 1 - (1 / strips per stripe)
return ( 1 - ( 1 / stripeSize ) ) * 100 ;
} ,
2024-07-31 20:51:34 +00:00
fault ( num : number , size : number , unit : number ) {
2024-07-30 14:46:09 +00:00
// one per set
2024-07-30 14:37:45 +00:00
return '1 drive failure per RAID 5 set' ;
} ,
} ,
2024-07-30 14:46:09 +00:00
raid_60 : {
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>' ,
requirements : 'RAID 50 requires at least 8 disks with 4 minimum per stripe. Stripes must contain an equal number of disks.' ,
2024-07-31 20:51:34 +00:00
validate ( num : number , size : number , stripeSize : number ) {
2024-07-30 14:46:09 +00:00
return num >= 8 && stripeSize >= 4 && num % stripeSize === 0 ;
} ,
2024-07-31 20:51:34 +00:00
capacity ( num : number , size : number , stripeSize : number , unit : number ) {
2024-07-30 14:46:09 +00:00
// RAID 6 per stripe
const perStripe = ( ( stripeSize - 2 ) * size ) * unit ;
// sum each stripe
return perStripe * ( num / stripeSize ) ;
} ,
2024-07-31 20:51:34 +00:00
efficiency ( num : number , stripeSize : number ) {
2024-07-30 14:46:09 +00:00
// 1 - (2 / strips per stripe)
return ( 1 - ( 2 / stripeSize ) ) * 100 ;
} ,
2024-07-31 20:51:34 +00:00
fault ( num : number , size : number , unit : number ) {
2024-07-30 14:46:09 +00:00
// 2 per set
return '2 drive failures per RAID 6 set' ;
} ,
} ,
2024-07-29 19:50:37 +00:00
} ;