【问题标题】:Failover cluster Alert Automation故障转移集群警报自动化
【发布时间】:2017-09-25 15:17:06
【问题描述】:

在具有 50 个集群的高可用性环境(两个 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。

我根据其状态(无论它是否正在运行)和所有者节点(无论是在主 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
}

【问题讨论】:

  • Get-Clustergroup -cluster $cluster - 返回三列 Name、OwnerNode、State 和 5-6 个条目。从那里我必须选择 Filter 如果 State 不等于 Online 并且 OwnerNode 不应该是 $Standbynodes 数组中的任何项目。
  • 我有点困惑,所以你有一个 DC ->50 个集群->5-6 个节点-> 意思是大约 250 个节点....但是你运行脚本的方式看起来像你的针对每个集群运行每个节点。这意味着您将获得 12,500 次运行,而不是总共 250 次运行.....

标签: arrays powershell cluster-computing hashtable


【解决方案1】:

您多次查询每个集群。为了加快您的代码查询每个集群一次,将结果存储在一个变量中,并在循环的其余部分使用该变量。您可能还想用哈希表查找替换遍历 $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
}

【讨论】:

  • 我从来没有使用过那个特定的命令,但是我们不能使用后台作业或运行空间来大大加快它的速度吗?只提到它是因为没有其他人这样做,我想知道为什么没有人这样做。
  • @RohinSidharth 这可能也有帮助,但 AFAICS OP 代码的最大问题是嵌套循环与重复的 Get-ClusterGroup 调用。
  • @AnsgarWiechers 它减少了我的编译时间。但是,{ $sb.ContainsKey($_.OwnerNode) } 不起作用。备用服务器上有四个节点在运行,但数组是空的。
  • @SivaThilak 您是否确认$sb 包含正确的密钥?请使用修改后的代码更新您的问题。
  • @AnsgarWiechers 我已经根据新要求修改了代码。但是,我仍然找不到填充数组的方法。
【解决方案2】:

尝试使用工作流。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 2016-03-19
    • 1970-01-01
    • 2021-02-15
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多