Windows Server 2012實(shí)現(xiàn)虛擬機(jī)親和性策略
有朋友咨詢?nèi)绾卧赪indows Server 2012實(shí)現(xiàn)虛擬機(jī)親和性策略。熟悉VMware vSphere解決方案的技術(shù)宅肯定會(huì)比較熟悉一個(gè)叫做DRS的動(dòng)態(tài)遷移策略, 其中可以配置VM親和性策略控制兩個(gè)虛擬機(jī)應(yīng)用運(yùn)行在不同的物理ESXi主機(jī)上。這個(gè)功能還是很實(shí)用的,例如如果虛擬機(jī)應(yīng)用運(yùn)行了一個(gè)Guest集群,那么其中一個(gè)基本需求就是讓來賓虛擬機(jī)運(yùn)行在不同的物理主機(jī)上,如果DRS控制策略處于性能考慮讓兩個(gè)來賓虛擬機(jī)運(yùn)行在同一臺(tái)物理主機(jī)上則集群的高可用性就失去了;另一個(gè)常見的案例是在站點(diǎn)集群的解決方案中,如果你希望通過集群控制在一個(gè)站點(diǎn)內(nèi)進(jìn)行故障切換,站點(diǎn)間通過在線遷移轉(zhuǎn)移虛擬機(jī)的靈活性;那么這樣的功能在Windows Server 2012 Hyper-V中是否提供呢?
在Windows Server 2012中對(duì)高可用性進(jìn)行了大量增強(qiáng),包括了:
1. 虛擬機(jī)復(fù)制
2. 網(wǎng)絡(luò)聚合
3. 集成的高可用性
4. 虛擬機(jī)應(yīng)用監(jiān)控
5. 集群感知更新
6. 集群切換優(yōu)先級(jí)控制
7. 虛擬機(jī)親和性策略
這里和大家分享一下虛擬機(jī)親和性策略的設(shè)置方法。
故障轉(zhuǎn)移群組切換時(shí)依照如下的策略控制切換目標(biāo)物理主機(jī),
首先,該物理節(jié)點(diǎn)屬于可能物理節(jié)點(diǎn)列表成員。
其次,根據(jù)***物理節(jié)點(diǎn)順序選擇切換節(jié)點(diǎn)。
如果***物理節(jié)點(diǎn)列表中的節(jié)點(diǎn)屬于親和性控制組成員,則切換策略會(huì)跳到下一***物理節(jié)點(diǎn),以此類推。
當(dāng)所有***節(jié)點(diǎn)均處于親和性策略控制組成員,為了保證高可用性,集群服務(wù)會(huì)忽略親和性策略選擇一個(gè)***節(jié)點(diǎn)作為故障切換節(jié)點(diǎn)。
根據(jù)上面的切換策略控制條件, 需要配置的就包括了可用節(jié)點(diǎn)列表,***節(jié)點(diǎn)列表,和親和性策略這三個(gè)部分。
#p#
1.可用節(jié)點(diǎn)列表
在Windows Server 2012的故障轉(zhuǎn)移集群中,選擇設(shè)置可用節(jié)點(diǎn)。

如果你熟悉Powershell,也可以通過CMDLET完成上述工作:
如果沒有導(dǎo)入故障轉(zhuǎn)移群的Powershell管理模塊,需要先導(dǎo)入該模塊
Import-Module FailoverClusters
確認(rèn)安裝了故障轉(zhuǎn)移集群以及RSAT模塊,如果沒有安裝,則先安裝該模塊
Get-WindowsFeature failover-clustering | Install-WindowsFeature –IncludeManagementTools
設(shè)置VMtest1和VMtest2兩個(gè)虛擬機(jī)的可用物理節(jié)點(diǎn)主機(jī)為shuttle1和shuttle2
Get-ClusterResource -Name "VMtest1", "VMtest2" | Set-ClusterOwnerNode -Owners shuttle1,shuttle2
#p#
2. 設(shè)置***節(jié)點(diǎn)列表
在Windows Server 2012的故障轉(zhuǎn)移集群中,選擇設(shè)置***節(jié)點(diǎn),

當(dāng)然,也可以通過Powershell的CMDLET完成上述工作:
如果沒有導(dǎo)入故障轉(zhuǎn)移群的Powershell管理模塊,需要先導(dǎo)入該模塊
Import-Module FailoverClusters
確認(rèn)安裝了故障轉(zhuǎn)移集群以及RSAT模塊,如果沒有安裝,則先安裝該模塊
Get-WindowsFeature failover-clustering | Install-WindowsFeature –IncludeManagementTools
設(shè)置虛擬機(jī)VMtest1的***物理節(jié)點(diǎn)為按照Shuttle1,Shuttle2順序
Get-ClusterGroup VMtest1 | Set-ClusterOwnerNode shuttle1, shuttle2
清除***節(jié)點(diǎn)配置
Get-ClusterGroup VMtest1 | Set-ClusterOwnerNode ""
#p#
3. 設(shè)置親和性策略
這個(gè)最核心的部分我沒發(fā)現(xiàn)如何通過GUI界面完成,只能通過Powershell,不過用CMDLET個(gè)人感覺更習(xí)慣一些:)
雖然Cluster.exe可以用于定義了親和性策略,不過從Windows Server 2012后這種方式即將過期,因此并不推薦采用這種方式;使用這種方式需要先安裝故障轉(zhuǎn)移集群命令行接口模塊
Get-WindowsFeature FailoverCluster-CmdInterface | Install-WindowsFeature
設(shè)置VMtest1,VMtest2虛擬機(jī)的親和性組為App Servers和Critical Servers,也就是App Servers和Critical Servers組中的虛擬機(jī)VMtest1和VMtest2不能同時(shí)被放置到一個(gè)故障轉(zhuǎn)移集群中的同一物理節(jié)點(diǎn)上 (注意:這個(gè)設(shè)置只能做Reset,就是每次配置都不是增量而是覆蓋設(shè)置的)
cluster group VMtest1 /prop AntiAffinityClassNames = "App Servers", "Critical Servers"
cluster group VMtest2 /prop AntiAffinityClassNames = "App Servers", "Critical Servers"
清除設(shè)置
cluster group VMtest1 /prop AntiAffinityClassNames = ""
cluster group VMtest2 /prop AntiAffinityClassNames = ""
(可以用通配符)
推薦用Powershell如對(duì)于虛擬機(jī)或虛擬機(jī)組設(shè)置應(yīng)用親和性策略,方法是通過設(shè)置AntiAffinityClassNames的屬性值。
首先,確定AntiAffinityClassNames屬性的當(dāng)前設(shè)置方式是通過 Get-ClusterGroup CMDLET。
Get-ClusterGroup | Select AntiAffinityClassNames
(默認(rèn)情況下,該命令取值為空,說明還沒做任何設(shè)置)
該CMDLET同樣需要導(dǎo)入故障轉(zhuǎn)移群的Powershell管理模塊,需要先導(dǎo)入該模塊
Import-Module FailoverClusters
確認(rèn)安裝了故障轉(zhuǎn)移集群以及RSAT模塊,如果沒有安裝,則先安裝該模塊
Get-WindowsFeature failover-clustering | Install-WindowsFeature –IncludeManagementTools
***,對(duì)該屬性位進(jìn)行設(shè)置和添加方法,各位自己去如法炮制吧:-)
(Get-ClusterGroup VMtest1).AntiAffinityClassNames = "Critical Servers"
(Get-ClusterGroup VMtest1).AntiAffinityClassNames += "App Servers"
(Get-ClusterGroup VMtest2).AntiAffinityClassNames = "Critical Servers"
(Get-ClusterGroup VMtest2).AntiAffinityClassNames += "App Servers"
個(gè)人感覺這個(gè)方法比在Windows 2008R2中設(shè)置容易太多了, 2008R2里面你要配置定義多個(gè)字符串變量,還是挺復(fù)雜的:
# 創(chuàng)建字符變量"antiaffinityclassnames"
$antiaffinityclassnames = New-Object System.Collections.Specialized.StringCollection
# 定義親和性類"App Servers"
$antiaffinityclassnames.Add("App Servers")
# 定義親和性類"Critical Servers"
$antiaffinityclassnames.Add("Critical Servers")
# 分配虛擬機(jī)到已經(jīng)定義的親和性類AntiAffinityClassNames property
(Get-ClusterGroup VMtest1).AntiAffinityClassNames = $antiaffinityclassnames
(Get-ClusterGroup VMtest2).AntiAffinityClassNames = $antiaffinityclassnames