Partager via

子聚类化指标的均衡

什么是子聚类化

当具有不同放置约束的服务具有共同的指标并且都报告自身的负载时,就会发生子聚类化。 如果服务报告的负载明显不同,则节点上的总负载具有较大的标准偏差,并且群集看起来不均衡,即使它具有最佳平衡。

子聚类化对负载均衡造成何种影响

如果不同节点上的服务报告的负载明显不同,则可能看起来存在很大的不平衡,而实际上并没有。 此外,如果子聚类化导致的虚假不均衡性超过了实际的不均衡性,可能会给资源管理器均衡算法造成混淆,使群集中的均衡性欠佳。

例如,假设有四个服务,它们全都报告用于衡量负载的指标 Metric1:

  • 服务 A - 具有放置约束“节点类型==前端”,报告负载为 10
  • 服务 B - 具有放置约束“NodeType==Frontend”,报告负载为 10
  • 服务 C - 具有放置约束“NodeType==Backend”,报告负载为 100
  • 服务 D - 具有放置约束“NodeType==Backend”,报告负载为 100
  • 另外,我们有四个节点。 其中两个节点的 NodeType 设置为“Frontend”,另两个节点的 NodeType 设置为“Backend”

我们有以下摆放:

子聚类化放置示例

群集可能看起来不平衡。 节点 3 和 4 上负载很大,但这种放置在这种情况中创造了最佳平衡。

资源管理器可以识别子聚类化情况,在几乎所有的情况下,它都能够为给定的场合产生最佳均衡。

对于某些异常情况,当 Resource Manager 无法以最佳方式平衡子聚集指标时,它仍会检测子聚集,并生成运行状况报告,以建议你解决问题。

子聚类分析的类型及其处理方式

子聚类化情况可以分为三种不同的类别。 特定子聚类化情况的类别决定了资源管理器对它的处理方式。

第一个类别 - 具有不连续节点组的平面子聚类

此类别是最简单的子聚类化形式,其中的节点可以划分为不同的组,并且每个服务只能放置到其中一个组中的节点上。 每个节点仅且只能属于一个组。 上述情况就是属于此类别,而大多数子聚类化情况也都属于此类别。

对于此类别中的情况,资源管理器可以产生最佳均衡,且无需进一步的干预。

第二个类别 - 使用分层节点组进行子聚集

如果一个服务允许的节点组是另一个服务允许的节点组的子集,则会发生这种情况。 这种情况最常见的示例是,某个服务有一个定义的放置约束,但另一个服务没有放置约束,因此后者可以放置在任何节点上。

示例:

  • 服务 A:无放置限制
  • 服务 B:放置约束“NodeType==Frontend”
  • 服务 C:放置约束“NodeType==Backend”

此配置将在不同服务的节点组之间创建子集-超集关系。

子集、超集和子集群

在这种情况下,有可能取得不理想的平衡。

Resource Manager 可识别这种情况并生成运行状况报告,建议将服务 A 拆分为两个服务 - 可放置在前端节点上的服务 A1 以及可放置在后端节点上的服务 A2。 这让我们回到可以最佳平衡的第一类情况。

第三个类别 - 节点集之间部分重叠的子聚集

当某些服务可以放置到的节点集之间存在部分重叠时,会出现这种情况。

例如,如果存在名为 NodeColor 的节点属性,并且存在三个节点:

  • 节点 1:节点颜色=红色
  • 节点 2:节点颜色=蓝色
  • 节点 3:节点颜色=绿色

此外有两个服务:

  • 服务 A:放置约束为“颜色==红色 || 颜色==蓝色”
  • 服务 B:位置约束为“颜色==蓝色 || 颜色==绿色”

因此,服务 A 可以放置在节点 1 和 2 上,服务 B 可以放置在节点 2 和 3 上。

在这种情况下,有可能取得不理想的平衡。

资源管理器可识别这种情况并生成运行状况报告,建议拆分部分服务。

在这种情况下,Resource Manager 无法提供如何拆分服务的建议,因为可以执行多个拆分,并且无法估计哪种方式是拆分服务的最佳方法。

配置子聚类

可以通过修改以下配置参数,来修改资源管理器在子聚类化方面的行为:

  • SubclusteringEnabled - 参数确定 Resource Manager 在执行负载均衡时是否考虑子聚集。 如果此参数已关闭,资源管理器将忽略子聚集,并尝试在全局级别实现最佳平衡。 此参数的默认值为 false。
  • SubclusteringReportingPolicy - 确定资源管理器如何发出分层和部分重叠子聚集的运行状况报告。 值为“0”表示禁用有关子聚类化的运行状况报告,值为“1”表示将为欠佳子聚类化情况生成警告运行状况报告,值为“2”表示将生成“正常”运行状况报告。 此参数的默认值为“1”。

ClusterManifest.xml:

<Section Name="PlacementAndLoadBalancing">
    <Parameter Name="SubclusteringEnabled" Value="true" />
    <Parameter Name="SubclusteringReportingPolicy" Value="1" />
</Section>

通过 ClusterConfig.json 用于独立部署或 Template.json 用于 Azure 托管群集:

"fabricSettings": [
  {
    "name": "PlacementAndLoadBalancing",
    "parameters": [
      {
          "name": "SubclusteringEnabled",
          "value": "true"
      },
      {
          "name": "SubclusteringReportingPolicy",
          "value": "1"
      },
    ]
  }
]

后续步骤

  • 若要了解群集资源管理器如何管理和均衡群集中的工作负载,请查看有关均衡负载的文章。
  • 若要了解如何将服务约束为仅放置在特定的节点上,请参阅节点属性和放置约束