An
update of this
post. An example of it in action is below. It’s very simple to run, just
run as .\RGcalc.ps1 the first time and it will tell you the command line
syntax if you want to re-run and make minor changes.
Image: RGcalc.ps1 in action!
The Script
Copy the below into to a text editor and save
as RGcalc.ps1:
##########################
## RGcalc.ps1 (RAID-DP) ##
##########################
Param(
[Parameter(Mandatory=$True,HelpMessage="Number of shelves on the
node/HA-pair.")]
[alias("SC")][Int]$Shelf_Count___,
[Parameter(Mandatory=$True,HelpMessage="Number of disks in a shelf
(12/14/24/48).")]
[alias("SD")][Int]$Disks_In_Shelf,
[Parameter(Mandatory=$True,HelpMessage="If
you have require root disks (3 for a node/6 for a HA-pair).")]
[alias("RD")][Int]$Root_Disks____,
[Parameter(Mandatory=$True,HelpMessage="Number of spares on the
node/HA-pair.")]
[alias("SP")][Int]$Spares_Count__,
[Parameter(Mandatory=$True,HelpMessage="Number
of other disks to be removed from the calculation.")]
[alias("OD")][Int]$Other_Disks___,
[Parameter(Mandatory=$True,HelpMessage="Target RAID group
size.`nTYPE: Default => Maximum`nSSD: 23 => 28`nSAS/FC: 16 =>
28`nSATA: 14 => 20`n6TB MSATA: 14 => 14")]
[alias("RG")][Int]$Target_RG_Size,
[Parameter(Mandatory=$True,HelpMessage="Answer 'y' or 'n' depending
on if you want a fixed RAID group size or not.")]
[alias("Fx")][String]$Fixed_RG_Size_,
[Parameter(Mandatory=$True,HelpMessage="Right-Size
info to get aggr capacity.")]
[alias("RS")][Int]$Disk_RightSize
)
## ===== PARAM VALIDATION
===== ##
If("y","n"
-NotContains $Fixed_RG_Size_){"Answer y or n for FixedRGsize!";EXIT}
$Shelf_Count___,$Disks_In_Shelf,$Target_RG_Size
| Foreach{If($_ -le 1){"Invalid input!";EXIT}}
$Root_Disks____,$Spares_Count__,$Other_Disks___,$Disk_RightSize
| Foreach{If($_ -lt 0){"Invalid input!";EXIT}}
## ===== CALCULATION =====
##
Function
RoundUp{Param([Double]$N);[Int][Math]::Ceiling($N)}
[Int]$AvailableDisks =
($Shelf_Count___ * $Disks_In_Shelf) - $Root_Disks____ - $Spares_Count__ -
$Other_Disks___
[Int]$RaidGroups =
RoundUp($AvailableDisks/$Target_RG_Size)
[Int]$AvrgRGsize =
RoundUp($AvailableDisks/$RaidGroups)
[Int]$LastRGsize =
$AvailableDisks - (($RaidGroups -1)*$AvrgRGsize)
[Int]$Balancer =
RoundUp(($AvrgRGsize - $LastRGsize) / $RaidGroups)
[System.Array]$Output = @()
For($i=1;$i -lt
$RaidGroups;$i++){
If(($LastRGsize + $Balancer) -lt
$Target_RG_Size){
$Output += ($AvrgRGsize - $Balancer)
$LastRGsize += $Balancer
}else{ $Output += $AvrgRGsize }
}
$Output += $LastRGsize
$Output = $Output | Sort
-Descending
## ===== OVERRIDE FOR FIXED
RG SIZE ===== ##
If($Fixed_RG_Size_ -eq
"y"){
If(($Target_RG_Size * $RaidGroups) -gt
$AvailableDisks){ $RaidGroups-- }
$Spares_Count__ = $Spares_Count__ +
$AvailableDisks - ($RaidGroups * $Target_RG_Size)
$AvailableDisks = ($RaidGroups *
$Target_RG_Size) # Available disks for RAID Groups needs recalculation with -FixedRGsize
[System.Array]$Output = @()
For($j=1;$j -lt $RaidGroups;$j++){ $Output +=
$Target_RG_Size }
};""
## ===== OUTPUT ===== ##
">>>>>
RAID Groups Calculator (RAID-DP) - RGcalc.ps1
<<<<<";""
"RAID Group: Count =
" + [String]$RaidGroups
"RAID Group: Sizes =
" + [String]$Output;""
[Int]$DataDisks =
$AvailableDisks - ($RaidGroups * 2)
"DISKS: Data = " + [String]$DataDisks
"DISKS: Parity = "
+ [String]($RaidGroups * 2)
"DISKS: Spares = "
+ [String]$Spares_Count__
"DISKS: Other = " + [String]($Root_Disks____ +
$Other_Disks___)
"------------- -"
"DISKS: TOTAL = " + [String]($Shelf_Count___ *
$Disks_In_Shelf);""
If($Disk_RightSize -ne 0){
[Int]$AggrCap = $DataDisks * $Disk_RightSize
"100%/97%/90% AGGR CAPACITY = " +
[String]$AggrCap + " / " + [String]([Int]($AggrCap*0.97)) + " /
" + [String]([Int]($AggrCap*0.90));""
}
"PS> .\RGcalc.ps1
-SC $Shelf_Count___ -SD $Disks_In_Shelf -RD $Root_Disks____ -SP $Spares_Count__
-OD $Other_Disks___ -RG $Target_RG_Size -Fx $Fixed_RG_Size_ -RS
$Disk_RightSize";""
Comments
Post a Comment