2017-09-25 5 views
0

50クラスタの高可用性環境(2つのDC、プライマリとスタンバイ)。各クラスタには5〜6個のノードがあります。私はすべてのクラスタのすべてのノードが "オンライン"(状態)で、 "プライマリ"(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の3つの列があります。

状態(実行中かどうか)と所有者ノード(プライマリDCまたはセカンダリDCのいずれか)に基づいて、すべてのエントリを配列に格納しています。したがって、私は4つの配列が必要です。前者は容易であるが、後者は容易ではない。それ自体は50個の奇数要素を持つ別の2つの配列です。したがって、私は以下に述べるようにハッシュテーブルを使用しました。しかし、以下のコードを試してみると、常に空の配列が返されます。

$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' - 3つのカラム名、OwnerNode、国家と5-6のエントリを返します。そこからStateがOnlineと等しくなく、OwnerNodeが$ Standbynodes配列の項目であってはならない場合、Filterを選択する必要があります。 –

+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)}'は動作しません。スタンバイ・サーバーでは4つのノードが実行されていますが、アレイは空です。 –

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