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

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

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