2017-09-25 64 views
0

在具有50个群集的高可用性环境(两个DC,主要和备用)中。每个群集中有5到6个节点。我想确保每个群集中的所有节点都是“Online”(状态),并在“Primary”(OwnerNode)中运行。任何显示其他节点都必须注意。故障转移群集警报自动化

我正在使用数组将所需信息存储在foreach循环中。问题是,编译时间太长。我想尽快完成它。

$Clusternodes= * some 50 elements * 
$Standbynodes= * some 50 elements * 

foreach ($cluster in $Clusternodes) { 
    $NotOnline += Get-ClusterGroup -Cluster $Cluster | 
        where {$_.State -ne "Online"} | 
        Select-Object Name,OwnerNode,State 
    foreach ($node in $Standbynodes) { 
     $Standbys += Get-ClusterGroup -Cluster $Cluster | 
        where {$_.OwnerNode -eq "$node"} | 
        Select-Object Name,OwnerNode,State 
    } 
} 

编辑:

Get-clustergroup -Cluster $Cluster返回在每个簇5至6项。输出包含三列Name,OwnerNode,State。

我将根据其状态(无论是否正在运行)和所有者节点(无论是在主DC还是从DC中)将每个条目存储在数组中。因此,我想要四个数组。前者很容易,后者则不是。因为它本身是另外两个阵列,每个阵列有50个奇数元素。因此我使用下面提到的哈希表。但是,当我尝试下面的代码时,它总是返回一个空数组。

$Clusternodes = * some 50 elements * 
$Standbynodes = * some 50 elements * 
$Primarynodes = * some 50 elements * 
$pr = @{} 
$sb = @{} 
$Standbynodes | ForEach-Object { $sb[$_] = $true } 
$Primarynodes | ForEach-Object { $pr[$_] = $true } 

$RunninginPrimary = @() 
$NotRunninginPrimary = @() 
$RunninginStandby = @() 
$NotRunninginStandby = @() 

foreach ($cluster in $Clusternodes) { 
    $c = Get-ClusterGroup -Cluster $Cluster 

    $NotRunninginStandby += $c | Where-Object { 
     ($_.State -ne "Online") -and ($sb.ContainsKey($_.OwnerNode)) 
    } | Select-Object Name,OwnerNode,State 

    $NotRunninginPrimary += $c | Where-Object { 
     ($_.State -ne "Online") -and ($pr.ContainsKey($_.OwnerNode)) 
    } | Select-Object Name,OwnerNode,State 

    $RunninginStandby += $c | Where-Object { 
     ($_.State -eq "Online") -and ($sb.ContainsKey($_.OwnerNode)) 
    } | Select-Object Name,OwnerNode,State 

    $RunninginPrimary += $c | Where-Object { 
     ($_.State -eq "Online") -and ($pr.ContainsKey($_.OwnerNode)) 
    } | Select-Object Name,OwnerNode,State 
} 
+0

'GET-Clustergroup -cluster $ cluster' - 返回三个列名称,OwnerNode,国家和5-6项。从那里我必须选择筛选,如果状态不等于在线,并且OwnerNode不应该是$ Standbynodes数组中的任何项目。 –

+0

我有点困惑, 所以你有一个DC - > 50群集 - > 5-6节点 - > 意思是大约250个节点....但是你运行脚本的方式看起来就像是每个节点都在运行簇。意思,而不是总共250次运行,你会得到12,500次运行..... – ArcSet

回答

0

您可以多次查询每个群集。为了加速您的代码只查询一次每个集群,将结果存储在一个变量中,并在该循环的其余部分中使用该变量。您可能还想用散列表查找替换遍历$Standbynodes的嵌套循环。

$Clusternodes = ... 
$Standbynodes = ... 

$sb = @{} 
$Standbynodes | ForEach-Object { $sb[$_] = $true } 

$NotOnline = @() 
$Standbys = @() 

foreach ($cluster in $Clusternodes) { 
    $c = Get-ClusterGroup -Cluster $Cluster 

    $NotOnline += $c | Where-Object { $_.State -ne "Online" } | 
        Select-Object Name,OwnerNode,State 
    $Standbys += $c | Where-Object { $sb.ContainsKey($_.OwnerNode) } | 
        Select-Object Name,OwnerNode,State 
} 
+0

我从来没有使用过那个特定的命令,但是我们不能使用后台作业或运行空间来使它大大加快吗?只是提到它,因为没有人做,我想知道为什么没有人做。 –

+0

@RohinSidharth这也可能有帮助,但AFAICS OP代码最大的问题是重复的Get-ClusterGroup调用的嵌套循环。 –

+0

@AnsgarWiechers它减少了我的编译时间。然而,'{$ sb.ContainsKey($ _。OwnerNode)}'不起作用。有四个节点在备用服务器上运行,但数组为空。 –

0

尝试使用工作流程。

workflow clusterCheck { 

    $Clusternodes= * some 50 elements * 
    $Standbynodes= * some 50 elements * 

    foreach -parallel ($cluster in $Clusternodes) { 
     $NotOnline += Get-ClusterGroup -Cluster $Cluster | 
        where {$_.State -ne "Online"} | 
        Select-Object Name,OwnerNode,State 
     foreach -parallel ($node in $Standbynodes) { 
        $Standbys += Get-ClusterGroup -Cluster $Cluster | 
        where {$_.OwnerNode -eq "$node"} | 
        Select-Object Name,OwnerNode,State 
     } 
    } 
} 

来源: - Scripting guy

相关问题