SqlCmd -Windows Cluster Model
前提条件
1存储lun 划分完毕并且挂载到其中一台机器上
2 需要加入群集的节点机器加入域完毕,并设置好心跳线 .加域部分可以参考 之前 Sqler Cmd 加域部分.
1检查Feature 更新
SqlerCmdWinClusterInstallFeature
再需要按装cluster的 节点机器上面运行 SqlerCmdWinClusterInstallFeature
cat C:\CheckInstallClusterLog.Log
如果节点机器已安装
PS C:\Users\xwj> cat C:\CheckInstallClusterLog.Log
Application-Server,AS-Outgoing-Trans,AS-Incoming-Trans,Failover-clustering Is Exists
如果节点机器没安装
PS C:\Users\xwj> cat C:\CheckInstallClusterLog.Log
3428: 2013-04-09 14:14:25.685 [ServerManagerPS] Complete initializing log file. 3428: 2013-04-09 14:14:25.866 [CBS] IsCacheStillGood: True. 3428: 2013-04-09 14:14:26.540 [ServerManagerPS] 开始安装... 3428: 2013-04-09 14:14:26.541 [ServerManagerPS] 已为安装指定: [应用程序服务器] .NET Framework 3.5.1 3428: 2013-04-09 14:14:26.633 [Sync] Sync Graph of changed nodes ========== --------------------------------------------------------------------------- name : 应用程序服务器 state : Changed rank : 1 sync tech: Unknown guest[1] : .NET Framework 3.5.1 guest[2] : .NET 4.0 的应用程序服务器扩展 guest[3] : Web 服务器(IIS)支持 guest[4] : COM+ 网络访问 guest[5] : TCP 端口共享 guest[6] : Windows 进程激活服务支持 guest[7] : 分布式事务 ant. : empty pred. : empty provider : ApplicationServerRoleProvider --------------------------------------------------------------------------- name : .NET Framework 3.5.1 state : Changed rank : 10 sync tech: Unknown ant. : .NET Framework 3.5.1, 进程模型, .NET 环境, 配置 API pred. : 应用程序服务器, .NET Framework 3.5.1, 进程模型, .NET 环境, 配置 API provider : ApplicationServerRoleProvider 3428: 2013-04-09 14:14:26.634 [Sync] Calling sync provider of .NET Framework 3.5.1 ... 3428: 2013-04-09 14:14:26.635 [ApplicationServer] Sync:: guest: '.NET Framework 3.5.1', guest deleted?: False 3428: 2013-04-09 14:14:26.635 [ApplicationServer] Begin installation of '.NET Framework 3.5.1'... 3428: 2013-04-09 14:14:26.638 [ApplicationServer] Installing: '.NET Framework 3.5.1' 3428: 2013-04-09 14:14:26.649 [ApplicationServer] Writing app server view: C:\ProgramData\Microsoft\Event Viewer\Views\ServerRoles\ApplicationServer.Events.xml 3428: 2013-04-09 14:14:26.651 [ApplicationServer] Skipped configuration of '.NET Framework 3.5.1' because running in command line mode. 3428: 2013-04-09 14:14:26.651 [ApplicationServer] [STAT] For '.NET Framework 3.5.1': [STAT] Installation took '0.0152068' second(s) total. [STAT] Configuration took '0' second(s) total. [STAT] Total time: '0.0152068' second(s). 3428: 2013-04-09 14:14:26.652 [Provider] Sync Result - Success: True, RebootRequired: False, Id: 230 3428: 2013-04-09 14:14:26.656 [Provider] Sync Message - OperationKind: Install, MessageType: Information, MessageCode: 0, Message: <null>, AdditionalMessage: <null> 3428: 2013-04-09 14:14:26.670 [ServerManagerPS] [STAT] Overall Sync Time: '0.0421967' second(s) 3428: 2013-04-09 14:14:26.732 [ServerManagerPS] [安装] 成功: [应用程序服务器] .NET Framework 3.5.1。 3428: 2013-04-09 14:14:27.641 [ServerManagerPS] Complete initializing log file. 3428: 2013-04-09 14:14:27.812 [CBS] IsCacheStillGood: True. 3428: 2013-04-09 14:14:27.890 [ServerManagerPS] 开始安装... 3428: 2013-04-09 14:14:27.891 [ServerManagerPS] 已为安装指定: [故障转移群集] 故障转移群集 3428: 2013-04-09 14:14:28.046 [Sync] Sync Graph of changed nodes ========== --------------------------------------------------------------------------- name : 故障转移群集 state : Changed rank : 1 sync tech: CBS ant. : empty pred. : empty provider : Provider 3428: 2013-04-09 14:14:28.046 [Sync] Calling sync provider of 故障转移群集 ... 3428: 2013-04-09 14:14:28.047 [Provider] Sync:: guest: '故障转移群集', guest deleted?: False 3428: 2013-04-09 14:14:28.047 [Provider] Begin installation of '故障转移群集'... 3428: 2013-04-09 14:14:28.047 [Provider] Install: Guest: '故障转移群集', updateElement: 'FailoverCluster-FullServer' 3428: 2013-04-09 14:14:28.048 [Provider] Installation queued for '故障转移群集'. 3428: 2013-04-09 14:14:28.049 [CBS] installing 'FailoverCluster-FullServer ' ... 3428: 2013-04-09 14:14:30.351 [CBS] ...parents that will be auto-installed: '<none>' 3428: 2013-04-09 14:14:30.351 [CBS] ...default children to turn-off: '<none>' 3428: 2013-04-09 14:14:30.493 [CBS] ...current state of 'FailoverCluster-FullServer': p: Staged, a: Staged, s: UninstallRequested 3428: 2013-04-09 14:14:30.493 [CBS] ...setting state of 'FailoverCluster-FullServer' to 'InstallRequested' 3428: 2013-04-09 14:14:30.531 [CBS] ...'FailoverCluster-FullServer' : applicability: Applicable 3428: 2013-04-09 14:14:32.291 [CbsUIHandler] Initiate: 3428: 2013-04-09 14:15:35.350 [CbsUIHandler] Terminate: 3428: 2013-04-09 14:15:35.854 [CBS] ...done installing 'FailoverCluster-FullServer '. Status: 0 (0) 3428: 2013-04-09 14:15:35.922 [Provider] Skipped configuration of '故障转移群集' because running in command line mode. 3428: 2013-04-09 14:15:35.923 [Provider] [STAT] ---- CBS Session Consolidation ----- [STAT] For '故障转移群集'[STAT] installation(s) took '67.8737122' second(s) total. [STAT] Configuration(s) took '0.0006572' second(s) total. [STAT] Total time: '67.8743694' second(s). 3428: 2013-04-09 14:15:35.924 [Provider] Sync Result - Success: True, RebootRequired: False, Id: 33 3428: 2013-04-09 14:15:35.924 [Provider] Sync Message - OperationKind: Install, MessageType: Information, MessageCode: 0, Message: <null>, AdditionalMessage: <null> 3428: 2013-04-09 14:15:35.993 [ServerManagerPS] [STAT] Overall Sync Time: '67.9480339' second(s) 3428: 2013-04-09 14:15:36.067 [ServerManagerPS] [安装] 成功: [故障转移群集] 故障转移群集。
2 Test-Cluster
Import-Module FailoverClusters; [array] $ClusterNodes='db001','db002' SqlerCmdWinClusterTest $ClusterNodes
cmd C:\ClusterReport.Log.mht
你可以在 查看 报告C:\ClusterReport.Log.mht
报告通过,下面正式开始安装
新建群集 配置群集ip 和节点
$DomainName='xwjtest' $ClusterName='ClusterTest'; $ClusterIP='192.168.1.43'; [array] $ClusterNodes='db001','db002' [array] $ClusterGroup ='Test01','Test02'; SqlerCmdCreateWinCluster $DomainName $ClusterName $ClusterIP $ClusterNodes
创建群集资源组
SqlerCmdWinClusterCreateGroup $ClusterName $ClusterNodes $ClusterGroup
创建 资源磁盘并获取磁盘信息
SqlerCmdWinClusterGetDiskResource $ClusterName 'c:\CreateClusterDisk.log'
cat c:\CreateClusterDisk.log
Name : 群集磁盘 1
Path : T:
FileSystem : NTFS
TotalSize : 2044
FreeSpace : 2006
Name : 群集磁盘 3
Path : Q:
FileSystem : NTFS
TotalSize : 1020
FreeSpace : 987
Name : 群集磁盘 5
Path : H:
FileSystem : NTFS
TotalSize : 1020
FreeSpace : 988
Name : 群集磁盘 2
Path : K:
FileSystem : NTFS
TotalSize : 252
FreeSpace : 230
Name : 群集磁盘 4
Path : M:
FileSystem : NTFS
TotalSize : 1020
FreeSpace : 988
根据需求合理分配磁盘
$ResourceName="群集磁盘 5" ,"群集磁盘 1" SqlerCmdWinClusterMoveDiskToGroup $ClusterName $ResourceName 'Test01' $ResourceName="群集磁盘 4" SqlerCmdWinClusterMoveDiskToGroup $ClusterName $ResourceName 'Test02'
创建仲裁盘
SqlerCmdWinClusterCreateQuorum $ClusterName "群集磁盘 3" $ClusterNodes
创建 dtc
$DtcDiskName="群集磁盘 2" $DtcIpAddress='192.168.1.44' $DtcIpNetSub='255.255.255.0' SqlerCmdWinClusterCreateDtc $ClusterName $ClusterNodes $DtcDiskName $DtcIpAddress $DtcIpNetSub
流程化的安装大大降低了人为的错误,同时提高了个人效率. 适合大规模 流程化 db运维.
附上sqlerCmd Create CLuster 模块代码
1 Function SqlerCmdWinClusterInstallFeature 2 {param([string] $LogPath='C:\CheckInstallClusterLog.Log') 3 try 4 { 5 Import-Module ServerManager; 6 $Array= 'Application-Server','AS-Outgoing-Trans','AS-Incoming-Trans','Failover-clustering' 7 $Feature=$Array| %{$f=$_; Get-WindowsFeature |where {$f -eq $_.Name -and $_.Installed -eq $False }|select-object Name,FeatureType,Installed}; 8 if((Test-Path -Path $LogPath )){Remove-Item -Path $LogPath}; 9 if($Feature -ne $Nul) 10 { 11 $Feature|foreach-object{ Add-WindowsFeature -Name $_.Name -logPath $LogPath } 12 Restart-computer -force 13 14 } 15 Else 16 { 17 "Application-Server,AS-Outgoing-Trans,AS-Incoming-Trans,Failover-clustering Is Exists "|out-file -FilePath $LogPath -Append 18 } 19 } 20 catch 21 { 22 $_.Exception.Message|out-file -FilePath $LogPath -Append 23 } 24 } 25 26 27 28 Function SqlerCmdWinClusterTest 29 {param([array] $Nodes,[string] $LogPath='C:\ClusterReport.Log') 30 try 31 { 32 if((Test-Path -Path $LogPath )){Remove-Item -Path $LogPath}; 33 Test-Cluster -Node $Nodes -reportname $LogPath 34 } 35 catch [Exception] 36 { 37 $_.Exception.Message|out-file -FilePath $LogPath -Append 38 } 39 } 40 41 42 43 Function SqlerCmdWinClusterCreate 44 {param 45 ([string] $DomainName 46 ,[string] $ClusterName 47 ,[string] $ClusterIP 48 ,[array] $ClusterNodes 49 ) 50 try 51 { 52 if( (Get-Cluster -domain $DomainName |where {$_.Name -eq $ClusterName }) -eq $Null) 53 { 54 New-Cluster -Name $ClusterName -StaticAddress $ClusterIP -Node $ClusterNodes -NoStorage -ErrorAction Stop; 55 $Return='OK' 56 } 57 else 58 { 59 $Return= 'Exists Cluster : '+$ClusterName 60 } 61 } 62 catch 63 { 64 $Return=$_.Exception.Message 65 } 66 Return $Return 67 } 68 69 70 71 72 Function SqlerCmdWinClusterCreateGroup 73 {param 74 ( 75 [string] $ClusterName 76 ,[array] $ClusterNodes 77 ,[array] $ClusterGroup 78 ) 79 try 80 { 81 Foreach($GroupName in $ClusterGroup) 82 { 83 Add-ClusterGroup -Name $GroupName -Cluster $ClusterName -ErrorAction Stop ; 84 Set-ClusterOwnerNode -Group $GroupName -Owners $ClusterNodes -Cluster $ClusterName -ErrorAction Stop; 85 } 86 $Return='OK' 87 } 88 catch 89 { 90 $Return=$_.Exception.Message 91 } 92 Return $Return 93 } 94 95 96 97 98 Function SqlerCmdWinClusterGetDiskResource 99 {param 100 ([string] $ClusterName 101 ,[string] $LogPath='c:\CreateClusterDisk.log' 102 ) 103 try 104 { 105 Get-ClusterAvailableDisk -cluster $ClusterName | Add-ClusterDisk -ErrorAction Stop; 106 $MSCluster_DiskPartition=gwmi -Namespace root/MSCluster -class MSCluster_DiskPartition| select-object @{n='PartComponent';e={$_.__RELPATH}},FileSystem,TotalSize,FreeSpace,Path -ErrorAction Stop ; 107 $MSCluster_DiskToDiskPartition=gwmi -Namespace root/MSCluster -class MSCluster_DiskToDiskPartition |select-object PartComponent,GroupComponent -ErrorAction Stop ; 108 $MSCluster_ResourceToDisk=gwmi -Namespace root/MSCluster -class MSCluster_ResourceToDisk |select-object PartComponent,GroupComponent -ErrorAction Stop ; 109 $MSCluster_Resource=gwmi -Namespace root/MSCluster -class MSCluster_Resource | where {$_.type -replace ' ','' -eq 'PhysicalDisk'} |Select-object Name,@{n='GroupComponent';e={$_.__RELPATH}} -ErrorAction Stop ; 110 $ClusterDisk=$MSCluster_DiskPartition | % { $f = $_; $MSCluster_DiskToDiskPartition ` 111 | where { $_.PartComponent -eq $f.PartComponent } ` 112 | Select GroupComponent,PartComponent,@{n='Path';e={$f.path}},@{n='FileSystem';e={$f.FileSystem}},@{n='TotalSize';e={$f.TotalSize}},@{n='FreeSpace';e={$f.FreeSpace}}} ` 113 | % { $e=$_; $MSCluster_ResourceToDisk |where { $_.PartComponent -eq $e.GroupComponent } ` 114 | Select GroupComponent,PartComponent, @{n='Path';e={$e.path}},@{n='FileSystem';e={$e.FileSystem}},@{n='TotalSize';e={$e.TotalSize}},@{n='FreeSpace';e={$e.FreeSpace}}} ` 115 | % { $d = $_; $MSCluster_Resource| where { $d.GroupComponent -eq $_.GroupComponent } ` 116 | Select Name, @{n='Path';e={$d.path}},@{n='FileSystem';e={$d.FileSystem}},@{n='TotalSize';e={$d.TotalSize}},@{n='FreeSpace';e={$d.FreeSpace}}}; 117 if((Test-Path -Path $LogPath )){Remove-Item -Path $LogPath}; 118 $ClusterDisk|out-file -FilePath $LogPath -Append 119 $Return='OK' 120 } 121 catch 122 { 123 $Return=$_.Exception.Message 124 } 125 Return $Return 126 } 127 128 129 130