Home » Storage Spaces » Is storage expensive – part 2

A good preparation is essential before starting any deployment. For storage spaces setup, the prerequisites and recommendation from Microsoft as well hardware vendor, including those for cluster setup is important. Ensure the systems are up to date with windows server os patches, hardware vendor driver, bios and firmware including that for NIC, SAS HBA etc. For instance Windows driver for LSI 9207-8e driver to be minimum V72.2.

Checking the enclosures and their component level status, using PowerShell as well as storage enclose management software.

Likewise individual disk in an enclosure

Get-StorageEnclosure StorageEnclosure0|Get-PhysicalDisk

Or secli.exe list drives -a=1 -enc=0,

It is a good idea to check all the drive slots are reflecting with disk drives properly

secli.exe list drive slots -a=1 -enc=0

After verifying the storage emms, adapter, slots and disk, it’s time to check the requirement for cluster setup. Systems are joined to domain. Permission to create the cluster object in the OU where base machine is created. Heart bit connection is assigned with IP that both the machine can reach each other

NICs for VM communication are named properly and VM switches with same name across both the nodes and SR-IOV are in place.

Storage Pools can be created before or after cluster setup, here it is done after completing the cluster setup. Two pools so that each node owns one pool during normal operation. For the pool creation, I am going to use 50% SSD and 50% HDD capacity from enclosure 0 and combine (mirror) with the same from enclosure 1.

Enc 0



Pool0 Pool1 Pool0 Pool1

Enc 1



Pool0 Pool1 Pool0 Pool

Getting the two enclosures into variable

$st_enc = Get-StorageEnclosure

And their disks into variable

$st_enc0_disk = $st_enc[0] |Get-PhysicalDisk
$st_enc1_disk = $st_enc[1] |Get-PhysicalDisk

For pool0, getting the first 6 SSD disk from enclosure 0 and 1 and first 24 HDD disk from enclosure 0 and 1. Combining them to get a variable for all the disk that would go into Pool0

$p0_ssddisk_enc0 = $st_enc0_disk | ? MediaType -EQ SSD|select -First 6
$p0_ssddisk_enc1 = $st_enc1_disk | ? MediaType -EQ SSD|select -First 6
$p0_hdddisk_enc0 = $st_enc0_disk | ? MediaType -EQ HDD|select -First 24
$p0_hdddisk_enc1 = $st_enc1_disk | ? MediaType -EQ HDD|select -First 24
$p0_physicaldisk = $p0_ssddisk_enc0 + $p0_ssddisk_enc1 + $p0_hdddisk_enc0 + $p0_hdddisk_enc1

For pool1, repeat the same but with last set of disks

$p1_ssddisk_enc0 = $st_enc0_disk | ? MediaType -EQ SSD|select -Last 6
$p1_ssddisk_enc1 = $st_enc1_disk | ? MediaType -EQ SSD|select -Last 6
$p1_hdddisk_enc0 = $st_enc0_disk | ? MediaType -EQ HDD|select -Last 24
$p1_hdddisk_enc1 = $st_enc1_disk | ? MediaType -EQ HDD|select -Last 24
$p1_physicaldisk = $p1_ssddisk_enc0 + $p1_ssddisk_enc1 + $p1_hdddisk_enc0 + $p1_hdddisk_enc1

Creating the pools

New-StoragePool -EnclosureAwareDefault $true -StorageSubSystemFriendlyName "Clustered Storage Spaces*" -FriendlyName Pool0 -OtherUsageDescription "Log Infra Pool 0 with Tier" -ProvisioningTypeDefault Fixed -ResiliencySettingNameDefault Mirror -WriteCacheSizeDefault 2GB -PhysicalDisks $p0_physicaldisk
New-StoragePool -EnclosureAwareDefault $true -StorageSubSystemFriendlyName "Clustered Storage Spaces*" -FriendlyName Pool1 -OtherUsageDescription "Log Infra Pool 1 with Tier" -ProvisioningTypeDefault Fixed -ResiliencySettingNameDefault Mirror -WriteCacheSizeDefault 2GB -PhysicalDisks $p1_physicaldisk

Creating the storage tiers, to be used for virtual disk creation

$P0_SSDTier=New-StorageTier -StoragePoolFriendlyName Pool0 -FriendlyName Pool0-SSDtier -MediaType SSD
$P0_HDDTier=New-StorageTier -StoragePoolFriendlyName Pool0 -FriendlyName Pool0-HDDtier -MediaType HDD
$P1_SSDTier=New-StorageTier -StoragePoolFriendlyName Pool1 -FriendlyName Pool1-SSDtier -MediaType SSD
$P1_HDDTier=New-StorageTier -StoragePoolFriendlyName Pool1 -FriendlyName Pool1-HDDtier -MediaType HDD

I can check now how much is available from each Tier in a pool to consume for virtual disk creation

(Get-StorageTierSupportedSize -FriendlyName Pool0-SSDtier -ResiliencySettingName Mirror).TierSizeMax / 1GB
 (Get-StorageTierSupportedSize -FriendlyName Pool0-HDDtier -ResiliencySettingName Mirror).TierSizeMax / 1TB

New-VirtualDisk will allow creating a virtual disk, which can be formatted and put to use. However, since this a cluster I can use New-Volume command with CSVFS_NTFS file system, and it will create the virtual disk, format with NTFS and add to cluster shared volume in one go.

New-Volume -StoragePoolFriendlyName Pool0 -FriendlyName P0-TV0-VHD -FileSystem CSVFS_NTFS -ProvisioningType Fixed -StorageTiers $P0_SSDTier,$P0_HDDTier -StorageTierSizes 75GB,750GB -NumberOfColumns 6

Since I have 12 SSD in the pool, with mirror 6 and hence using the NumberOfCoumns count 6 i.e. the max possible

I have few SQL server setup and for the temp DB, I need a 16GB SSD drive i.e. no tiering . Let me use Pool1 for this 

New-Volume -StoragePoolFriendlyName Pool1 -FriendlyName P1-SQL-TempDB -FileSystem CSVFS_NTFS -ProvisioningType Fixed -StorageTiers $P0_SSDTier -StorageTierSizes 16GB -NumberOfColumns 6

Being a two node cluster with no shared storage outside the cluster, file share witness has to set to ensure the cluster has quorum vote to run when one of the node goes down. On a file server, create a folder and assign permission to cluster account.

mkdir <ClusterName>
cacls <ClusterName> /G BUILTIN\Administrators:F “clusteraccount$”:F

once the folder and permission are set, same can be assigned as witness with its file share UNC name

Get-Cluster |Set-ClusterQuorum -FileShareWitness <UNC Path>

I will get the rest of the volume created and continue with the next post on bringing up the VMs for this infra.

Leave a Reply

Your email address will not be published. Required fields are marked *