在了解了S2D基本概念及架构以后,我们接下来做一些具体的配置及测试。本实验环境搭在vCenter6.0u2上,配置四台虚机作为S2D的节点,每台虚机的具体配置如下:
OS:Windows 2016 datacenter
4 vCPU& 8GB RAM
4 vNics
1个40GB磁盘装OS;另外再添加2 x 50GB(模拟PCIe SSD);2 x 100GB(模拟SSD);4 x 300GB(HDD)
本测试的设想是将模拟的NVMe PCIe SSD磁盘作为读写缓存使用,而把SSD和HDD作为容量层。S2D本身很灵活,支持全闪存配置或者混合磁盘配置,取决于客户结合其应用对性能,容量及价格的综合考量。个人感觉实际应用中两层磁盘配置是比较合适的。这里模拟三层配置是希望能更多地测试探寻其工作机制。微软下面这篇博客文章很好地解释了S2D缓存原理及最佳实践,这里就不再赘述。只要使用微软认证列表里的硬件,在启用S2D时系统会自动将最高层级的磁盘设置为读写缓存(默认针对SSD磁盘只作为写缓存;针对HDD磁盘作为读写缓存)。但在虚拟机上测试时,磁盘类型和使用方式有时需要手工指定。后续步骤里有具体命令和截图供大家参考。
https://docs.microsoft.com/en-us/windows-server/storage/storage-spaces/understand-the-cache
下面我们过渡到具体的配置步骤:
1.我们将在后续步骤里用Powershell命令指定50GB磁盘类型为SCM;这里先编辑每一台虚机的 vmx配置文件,添加:scsi x:x.virtualSSD = "true"。或者打开虚机设置选项--》VM option--》Advanced Settings--》Configuration Parameters--》Edit Configuration,在如下界面里直接添加,将对应的两块100GB磁盘设置为SSD类型:
2. 将四台虚机安装好W2016后,添加所需的“file and storage services”角色及"failover cluster"功能,做好网络等基本配置,加入域。可根据需要使用VM-Host affinity的设置将虚机分别置于不同的物理机上以增加高可用性。可分别将两块虚拟网卡配置为Team,配置不同的网段,分别用于生产网络和Cluster节点的通信。
3.将虚机配置群集时容易被忽略却又至关重要的细节是系统时钟的设置。虚机安装了VMware Tools之后,默认会在以下情况自动将VM的时间和宿主机时钟做校准:(1)虚机系统重启或者从挂起状态恢复时;(2)虚机VMotion到其他主机时;(3)创建或者恢复快照,或其他命令导致自动触发此类操作时;(4)重启VMWARE Tool服务以后。如果宿主机时钟不准则会导致很多问题。所以建议根据VMware KB1189关闭这几台S2D节点的VMWARE Tools时钟同步服务,开启系统Windows Time服务,使其自动和域控做时钟同步。如果网络里有精准的时钟服务器则更好。
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1189
4.做好群集创建前的准备工作,比如仲裁盘的配置等。接下来在图形界面里或者以管理员身份运行Powershell,输入以下命令为每一台主机添加Failover Clustering的功能(如果还没有添加),并创建新的群集:
Add-WindowsFeature -Name failover-clustering -IncludeManagementTools -ComputerName xxx.yourdomain.com -Verbose -Credential yourdomain\administrator
New-Cluster -Name xxxx -StaticAddress x.x.x.x -Node node1.yourdomain.com,node2.yourdomain.com,node3.yourdomain.com,node4.yourdomain.com -Verbose
5.打开建好的群集节点里的Powershell ISE,输入类似以下命令查看所有节点贡献出来的物理磁盘详细信息:
Get-PhysicalDisk |select friendlyname,serialnumber,canpool,operationalstatus, OperationalDetails,healthstatus,usage,size,bustype,mediatype|ft
小提醒:如果测试是在物理平台上进行,最好先用Clear-disk -removedata -removeOEM命令将所有节点用以构建存储池的硬盘的信息全部清除干净。该命令正常执行的前提是对应磁盘需要保持在线状态。输出结果类似下图,在Partition Style一栏,磁盘全部是RAW状态:
6.在生产环境搭建S2D时,请确保各类硬件满足微软官方的兼容列表。在本测试环境中,查看物理磁盘数量,状态都没有问题后,如果发现有些类型磁盘没有被正确识别,可尝试用命令手工指定其磁盘类型,但是磁盘类型是其在存储池里的属性之一,所以必须先把所有磁盘添加到存储池后才能手工设置其类型。这里我们先开启S2D,并暂时关闭缓存,并跳过磁盘检测:
Enable-ClusterS2D -CacheState disabled -AutoConfig:0 -SkipEligibilityChecks
7.用New-storagepool命令创建自己的存储池,创建时可以将不同的磁盘放置于不同的池中。这里我们将所有磁盘放入一个存储池“mys2dpool1”。
New-StoragePool -StorageSubSystemFriendlyName *cluster* -FriendlyName mys2dpool1 -ProvisioningTypeDefault Fixed -PhysicalDisks (Get-PhysicalDisk|? canpool -EQ "true")
完成后可用Get-storagepool命令查看其状态。或者进入Server Manager图形界面查看,如下图示:
在Failover Manager里的状态:
下图是加入存储池后的物理磁盘详细信息,可以看到,除了8块SSD磁盘外,300GB的HDD和50GB的NVMe PCIe SSD类型磁盘都没有被识别:
8.接下来用下面命令将没有识别的50GB磁盘指定为SCM类型:
Get-PhysicalDisk |where {$_.mediatype -eq "unspecified" -and $_.canpool} | Set-PhysicalDisk -MediaType SCM
该命令可灵活组合,如根据磁盘大小进行分类指定,我们再用下面命令将300GB磁盘类型设置为HDD:
Get-PhysicalDisk|where{$_.size -eq 322122547200}|Set-PhysicalDisk -MediaType HDD
完成后Get-physicaldisk命令输出如下图示:
9.S2D系统在创建存储池时会自动把最高层级的磁盘当做读写缓存用。本例中需要手工调整把SCM指定为缓存层(journal):
Get-PhysicalDisk|where{$_.mediatype -eq "scm"}|Set-PhysicalDisk -Usage Journal
完成后再用get- physicaldisk命令查看最后物理磁盘状态。确保无误。
10.接着开启S2D的缓存:
(Get-Cluster).S2DCacheDesiredState= 2
11.和VMWARE VSAN类似,S2D也可以支持不同类型的故障域以增强在生产环境里的高可用性。其故障域类型包括:Node、Rack、Chassis、Site等。这里我们创建4个基于Rack的故障域,并把4台节点分别放置于不同的故障域里:
1..4|ForEach-Object {New-ClusterFaultDomain -Name fd0$_ -FaultDomainType rack}
1..4|ForEach-Object {Set-ClusterFaultDomain -Namedths2sofsnode$_ -Parent fd0$_}
完成用Get-Clusterfaultdomain可看到类似如下结果:
12.创建Virtual Disk(Storage Space)的过程很简单,可以通过ServerManager的图形界面,也可以通过Powershell命令。需要注意的是通过图形界面做时可以自定义的选项很少,跟着向导简单几步就可以完成;通过Powershell创建能给客户更多的灵活性。比如下面我们用 New-Virtualdisk命令创建一个名为“testshrink1”的VD,大小20GB,Dural Parity布局。
New-VirtualDisk -StoragePoolFriendlyName mys2dpool1 -FriendlyName testshrink1 -Size 20GB -ResiliencySettingName parity -PhysicalDiskRedundancy 2
Server Manager里面创建VD的选项如下图示:
完成后可在Server Manager里查看其状态,也可以用以下命令在Powershell里查看:
Get-VirtualDisk -FriendlyName testshrink1 |select *
输出信息如下,可以看到,缺省状态下该卷的写缓存为1GB:
下图是在Failover Cluster管理界面看到的信息,此时即可在该VD的Owner Node里,从磁盘管理里面初始化,格式化成NTFS或者ReFS,然后在群集管理器里可将其转换为CSV格式使用。
13.我们也可以一步到位,直接在Powershell里创建一个ReFS卷“myvol3”,并做成CSV,布局为两份拷贝的Mirror:
New-Volume -StoragePoolFriendlyName mys2dpool1 -FriendlyName myvol3 -FileSystem CSVFS_ReFS -Size 25GB -ResiliencySettingName mirror -PhysicalDiskRedundancy 1
同样,用Get-volume命令可查看其详细信息:
细心的同学可能发现,我们在创建时定义的大小是25GB,怎么生成后的大小却是32GB?
那么我们再用Get-Virtualdisk查看这个卷对应VD的细节信息:
注意上图红框里的参数配置。这里先介绍几个Storage Space里的重要概念:
Slab:存储池里组成Virtual Disk的基本单位。存储池里的磁盘都被划成一块块的Slab,然后以用户定义的数据保护方式(Mirror或者Parity)组成虚拟磁盘分配给主机使用。S2D里每块slab大小为256MB。
Column:可以简单地理解为条带宽度,即Storage Space在以条带方式往VD里写数据时,包含了多少块物理磁盘。理论上说Column多了,同时工作的磁盘数量也多了,IOPS也有相应增加。实际情况下,因为有读写缓存的存在,需要进一步测试column不同带来的性能差别。
Interleave:可以简单理解为条带深度,即Storage Space在以条带方式往VD里写数据时,最终落地到每块磁盘上的数据,S2D里默认为256KB。
在S2D里,微软建议创建VD时,Column和Interleave值最好都不要手工设置,系统会自动进行最优配置。而Slab大小是不可调的。但上图里看到的VD"myvol3"实际尺寸超过定义尺寸很多的原因就在于不同的Column的选择。如上图示,系统自动为两路Mirror布局的“myvol3”配置了"Numbersofcolumn”为8,笔者猜测每一份数据的每个副本写入时都会跨8块磁盘,而每块磁盘以256MB的Slab预先分配空间,势必会造成多余的空间的分配。创建VD时定义的尺寸越小,这个现象越明显。笔者试过创建1GB的两路Mirror的VD,生成后的大小却是8GB;而如果创建很大的VD,反而没有明显多余空间的分配了。所以在真正生产环境下,带来的影响应该不大。如下图为1TB VD的详细信息:
另外,系统自动为VD“myvol3”配置了“faultdomainawareness”值 “StorageScaleUnit”,即以扩展单位为基本的故障域。而实际生产环境里,需要根据现场情况定义真正能提高系统容错度的故障域。故障域类型当前有“physicaldisk”、“StorageChassis”、“StorageEnclosure”、“StorageRack”和“StorageSacleUnit”五种选择。结合之前我们创建的“StorageRack”故障域,我们也可以用类似如下命令创建VD时定义将每个数据副本固定在每个故障域内,此例中我们新建一个名为“3mirrorvd8”的VD,故障域类型为前面步骤里定义的StorageRack,同时限定Numberofcolumns值为4,不超过每个节点HDD的数量:
New-VirtualDisk -StoragePoolFriendlyName mys2dpool1 -FriendlyName 3mirrorvd8 -Size 10GB -ResiliencySettingName mirror -NumberOfDataCopies 3 -FaultDomainAwareness StorageRack -NumberOfColumns 4
14.通过Powershell,也可在创建VD时,根据业务性能需要,轻松将其固定在不同类型的磁盘里。比如下面我们创建一个Mirror卷“ssdvol1”,将其固定在SSD磁盘里:
new-volume -StoragePoolFriendlyName mys2dpool1 -FriendlyName ssdvol1 -FileSystem CSVFS_ReFS -MediaType SSD -Size 15GB -ResiliencySettingName mirror –PhysicalDiskRedundancy 1
下面是用get-virtualdisk看到的详细信息,可看到该卷所在磁盘均为SSD磁盘,同样的方法,我们也可以将某些大容量,性能要求低的VD直接固定在HDD上。
我们可以很方便地在Server Manager里或者用下面命令对改卷进行在线扩容:
Resize-VirtualDisk -FriendlyName ssdvol1 -Size 25GB -Verbose
完成后在ssdvol1卷的所属节点的磁盘管理器里即可实现该VD文件系统在线扩容:
小提醒:S2D里VD当前只能支持在线扩容,不支持尺寸的缩减。另外针对于在群集里的S2D存储池,也只能支持Fix格式的VD,不支持按实际使用分配空间的自动精简卷。
15. 因为在存储池里有SSD和HDD两种类型的磁盘充当容量层,接下来我们尝试创建跨多层存储的卷(Multi Resilient Volume),该功能仅限于W2016 S2D,而且仅限于ReFS文件系统。使用这种类型的卷的目的是自动平衡冷热数据的布局,从而优化其上应用的性能,同时节省高层级磁盘空间的占用。数据写入时以Mirror的方式写入到预先定义的Mirror层(SSD),然后按需将“冷却”下来的数据自动调度到Parity层(HDD),以节省SSD的空间占用,腾出来的SSD空间给真正需要性能的热点数据。下图来源于微软官方文档,很好地把VD容错布局的类型做了一个归纳:
接下来我们在存储池里分别定义Mirror层和Parity层,Mirror层命名为“perf”,数据采用2份拷贝的Mirror布局,写惩罚小,性能较好;Parity层命名为“cap”,采用更节省空间的Dual Parity布局(类似Raid6),同时提供更好的安全性。具体命令如下:
New-StorageTier -StoragePoolFriendlyName mys2dpool1 -FriendlyName perf -MediaType SSD -ResiliencySettingName mirror -PhysicalDiskRedundancy 1
New-StorageTier -StoragePoolFriendlyName mys2dpool1 -FriendlyName cap -MediaType HDD -ResiliencySettingName parity -PhysicalDiskRedundancy 2
输出结果如下图示:
下面我们用以下命令创建一个名为"mrvol1”的卷,该卷大小60GB,Mirror部分为10GB,Parity部分为50GB:
new-volume -StoragePoolFriendlyName mys2dpool1 -FriendlyName mrvol1 -FileSystem CSVFS_ReFS -StorageTierFriendlyNames perf,cap -StorageTierSizes 10GB,50GB -verbose
用微软的脚本工具“show-prettyvolume”可看到该卷的如下信息:
还可用类似下面命令查看该卷在两层磁盘里的详细配置信息:
Get-VirtualDisk mrvol1 |Get-StorageTier |select *
至于MRV类型的卷在创建时Mirror层和Parity层对应的容量比例大概多少合适,并没有一个硬性规定。一般SSD上会存放最新写入的热数据,所以可根据其上所跑业务每天产生多少新数据作为一个基准,Mirror层的容量至少不能小于该值。另外如果Mirror层空间占用超过定义的60%时也会触发数据搬动(到Parity层),所以建议适当放宽Mirror层的定义容量以避免过于频繁的数据搬动带来的额外系统负担。根据微软给出的最佳实践,建议最好在Mirror层预留两倍于热点数据大小的尺寸,同时整个卷定义的大小最好比所需要的容量多给20%左右。不过和之前做过的实验步骤类似,可以通过Powershell轻松在线扩容Mirror层或者Parity层,比如下面命令将两层分别扩容10GB,完成后进入该卷所属节点的磁盘管理工具,扩展其文件系统即可,不再赘述。
Get-VirtualDisk -FriendlyName mrvol1 |Get-StorageTier|? friendlyname -eq mrvol1_perf|Resize-StorageTier -Size 20GB
Get-VirtualDisk -FriendlyName mrvol1 |Get-StorageTier|? friendlyname -eq mrvol1_cap|Resize-StorageTier -Size 60GB
16.最后,可以用如下命令对Multi-Resilient 卷做按需优化。另外,系统也默认配置了对应的数据调度计划任务,可从Task Scheduler里找到,如下图示。用户可根据自身业务需要调整开始的时间。
Optimize-Volume -FileSystemLabel mrvol1 -TierOptimize -Verbose
通过上述步骤可看出,S2D的配置和使用相对不难,也非常灵活,能尽量满足不同使用场景的不同需求。但需要管理员熟悉Powershell命令。微软的产品专家在网上分享出了一些有用的关于S2D的脚本,链接如下,下载后根据自己的环境简单修改即可使用。
查看存储池及卷的使用状态脚本:
http://cosmosdarwin.com/Show-PrettyPool.ps1
http://cosmosdarwin.com/Show-PrettyVolume.ps1
彻底清除S2D配置的脚本:
https://gallery.technet.microsoft.com/scriptcenter/Completely-Clearing-an-ab745947