均衡 Service Fabric 群集

Service Fabric 群集资源管理器支持动态负载更改、对添加或删除节点或服务做出反应。 还会自动更正约束冲突和主动重新均衡群集。 但这些操作的执行频率是多少,又是什么触发了这些操作?

群集资源管理器可以执行三种不同类别的工作:

  • 放置 - 此阶段负责放置任何遗漏的有状态副本或无状态实例。 放置既包括新服务也包括处理已失败的有状态副本或无状态实例。 可在此进行删除和丢弃副本或实例。
  • 约束检查 - 此阶段检查并更正系统中不同放置约束(规则)的违规情况。 规则示例包括确保节点不超出容量,以及符合服务的放置约束。
  • 均衡 - 此阶段根据为不同指标配置的所需均衡级别检查是否需要重新均衡。 如果需要,则尝试查找群集中更均衡的排列方式。

配置群集资源管理器计时器

与均衡相关的第一组控件是一组计时器。 这些计时器控制群集资源管理器检查群集并采取纠正措施的频率。

群集 Resource Manager 可以进行的每种不同类型的修复都由不同的计时器控制,控管修复频率。 激发每个计时器时,会计划任务。 默认情况下,Resource Manager:

  • 每 1/10 秒扫描其状态并应用更新(如记录某节点处于关闭状态)
  • 每秒设置放置检查标志
  • 每秒设置约束检查标志
  • 每隔 5 秒设置一次均衡标志

下面是用于管理这些计时器的配置示例:

ClusterManifest.xml:

        <Section Name="PlacementAndLoadBalancing">
            <Parameter Name="PLBRefreshGap" Value="0.1" />
            <Parameter Name="MinPlacementInterval" Value="1.0" />
            <Parameter Name="MinConstraintCheckInterval" Value="1.0" />
            <Parameter Name="MinLoadBalancingInterval" Value="5.0" />
        </Section>

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

"fabricSettings": [
  {
    "name": "PlacementAndLoadBalancing",
    "parameters": [
      {
          "name": "PLBRefreshGap",
          "value": "0.10"
      },
      {
          "name": "MinPlacementInterval",
          "value": "1.0"
      },
      {
          "name": "MinConstraintCheckInterval",
          "value": "1.0"
      },
      {
          "name": "MinLoadBalancingInterval",
          "value": "5.0"
      }
    ]
  }
]

现在,群集资源管理器仅按顺序一次执行这些操作中的一个。 因此将这些计时器称为“最小间隔”,将计时器停止时可采取的操作称为“设置标志”。 例如,群集 Resource Manager 处理挂起的请求,以在均衡群集之前创建服务。 可以看到,群集资源管理器根据指定的默认时间间隔扫描它需要频繁执行的任何操作。 通常这意味着在每个步骤中所采取的变更集很小。 通过频繁的小更改,群集资源管理器可以在群集中发生事件时迅速做出响应。 许多相同类型的事件往往同时发生,因此默认计时器可进行某种批处理。

例如,节点出现故障时,它们可以一次性地对整个容错域执行这样的操作。 会在 PLBRefreshGap 后的下一个状态更新过程中捕获所有这些故障。 在以下放置、约束检查和均衡运行的过程中,确定要修正的内容。 默认情况下,群集资源管理器不会扫描群集中数小时的更改,也不会尝试同时处理所有更改。 这样会导致大量改动。

群集 Resource Manager 还需要一些其他信息来确定群集是否不均衡。 为此,我们还提供了另外两个配置:BalancingThresholdsActivityThresholds

均衡阈值

均衡阈值是触发重新均衡的主要控件。 指标的均衡阈值是一个比率。 如果负载最重的节点上某个指标的负载除以负载最轻的节点的负载量超过指标的 BalancingThreshold,群集是不均衡的。 因此群集 Resource Manager 进行下一次检查时将触发均衡。 MinLoadBalancingInterval 计时器定义群集资源管理器应检查是否需要重新均衡的频率。 检查并不代表发生任何事件。

均衡阈值根据每个指标定义为群集定义的一部分。 有关指标的详细信息,请查看指标文章

ClusterManifest.xml

    <Section Name="MetricBalancingThresholds">
      <Parameter Name="MetricName1" Value="2"/>
      <Parameter Name="MetricName2" Value="3.5"/>
    </Section>

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

"fabricSettings": [
  {
    "name": "MetricBalancingThresholds",
    "parameters": [
      {
          "name": "MetricName1",
          "value": "2"
      },
      {
          "name": "MetricName2",
          "value": "3.5"
      }
    ]
  }
]

Diagram showing an example of a node balancing threshold

在此示例中,每个服务使用一个单位的指标。 在最上面的示例中,节点的负载上限为 5,下限为 2。 假设此指标的均衡阈值为 3。 群集中的比率为 5/2 = 2.5,这小于指定的均衡阈值 3,因此群集被视为均衡。 群集 Resource Manager 进行检查时不会触发均衡。

在底部的示例中,节点的最大负载为 10,最小负载为 2,因此比率为 5。 5 大于该指标的指定均衡阈值 3。 因此,下一次引发均衡计时器时,将计划运行重新均衡。 在此类似情况下,一些负载通常会分配到节点 3。 因为 Service Fabric 群集资源管理器不使用贪婪方法,所以一些负载也可能分配到节点 2。

Diagram showing an action taken in response to a balancing threshold.

注意

“均衡”会处理两种不同的策略,管理群集中的负载。 群集资源管理器使用的默认策略是在群集的节点间分发负载。 另一个策略是碎片整理。 在同一均衡运行的过程中,执行碎片整理。 均衡和碎片整理策略可以用于同一群集中的不同指标。 一个服务可具有均衡和碎片整理两个指标。 对于碎片整理指标,群集中负载的比率低于均衡阈值时,会触发重新均衡。

低于均衡阈值不是显式目标。 均衡阈值只是一个触发器。 均衡运行时,群集资源管理器会确定它可进行哪些改进(如有)。 因为仅仅启动均衡搜索并不意味着会移动任何内容。 有时群集是不均衡的,但约束过度,就无法修正。 或者,改进需要成本高昂的移动)。

活动阈值

有时,虽然节点相当不均衡,但群集中的负载 总量 很低。 负载缺乏可能是暂时性的下降,或是因为群集是新的并且刚刚开始引导。 不管是哪种情况,建议不要花费时间来均衡群集,因为实际的收获很少。 如果均衡群集,会耗费网络和计算资源进行移动操作,却不会产生任何大的绝对差异。 为了避免不必要的移动,可使用名为“活动阈值”的另一种控件。 活动阈值可以指定活动的绝对下限。 如果没有节点高于此阈值,即使达到均衡阈值,也不触发均衡。

假设我们为此指标保留三个均衡阈值。 另外假设具有 1536 个活动阈值。 在第一种情况下,根据均衡阈值,群集为不均衡状态,但没有节点符合活动阈值,因此保持现状。 在底部的示例中,节点 1 超过活动阈值。 由于同时超过了指标的均衡阈值和活动阈值,所以计划进行均衡。 有关示例,请看下图:

Diagram showing an example of a node activity threshold.

如同平衡阈值,活动阈值通过群集定义根据每个指标进行定义:

ClusterManifest.xml

    <Section Name="MetricActivityThresholds">
      <Parameter Name="Memory" Value="1536"/>
    </Section>

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

"fabricSettings": [
  {
    "name": "MetricActivityThresholds",
    "parameters": [
      {
          "name": "Memory",
          "value": "1536"
      }
    ]
  }
]

均衡阈值和活动阈值都与特定的指标绑定,只有在同时超过同一个指标的均衡阈值和活动阈值时,才触发均衡。

注意

如未指定,则指标的均衡阈值为 1,活动阈值为 0。 这表示对于任何给定的负载,群集资源管理器将尝试使该指标保持完美平衡。 如果正在使用自定义指标,则建议显式定义指标的均衡和活动阈值。

一起平衡服务

群集是否非均衡是从整个群集来看。 但是,我们对其进行修复的方式是移动单个服务副本和实例。 这种说法很合理,是吗? 如果内存堆积在某一个节点上,可能是由多个副本或实例造成的。 修复不均衡需要移动所有使用不均衡指标的有状态副本或无状态实例。

但本身不均衡的服务偶尔会移动(请记住之前有关局部权重和全局权重的讨论)。 为什么某服务的所有指标均衡时,该服务会移动? 请看以下示例:

  • 假设有四个服务:服务 1、服务 2、服务 3 和服务 4。
  • 服务 1 报告指标 1 和指标 2。
  • 服务 2 报告指标 2 和指标 3。
  • 服务 3 报告指标 3 和指标 4。
  • 服务 4 报告指标指标 99。

我们没有 4 个独立的服务,我们拥有 3 个相关的服务以及 1 个独立的服务。

Diagram showing how to balance services together.

由于此链条,指标 1-4 不均衡可能会导致属于服务 1-3 的副本或实例四处移动。 我们还知道,指标 1、2 或 3 中的不均衡不会导致服务 4 中出现移动。 因为移动属于服务 4 的副本或实例绝对不会影响指标 1-3 的均衡,所以这样做毫无意义。

群集资源管理器会自动计算出哪些服务是相关的。 添加、移除或更改服务的指标会影响服务间的关系。 例如,在两次运行均衡之间,服务 2 可能已经更新为删除指标 2。 这会中断服务 1 和服务 2 之间的链接。 现在有三组相关服务,而不是两组:

Diagram showing that Cluster Resource Manager determines what services are related.

均衡每种节点类型的群集

正如我们在前面几节中所述,触发重新均衡的主要控件是活动阈值均衡阈值计时器。 Service Fabric 群集资源管理器通过指定每种节点类型的参数并仅允许在不均衡的节点类型上移动,对触发重新均衡提供更精细的控制。 按节点类型进行均衡的主要好处是可以提高需要更严格均衡规则的节点类型的性能,而不会降低其他节点类型的性能。 该功能包含两个主要部分:

  • 不均衡是根据节点类型检测的。 以前的全局不均衡计算是针对每种节点类型进行计算的。 如果所有节点类型都已均衡,则 CRM 将不会触发均衡阶段。 否则,如果至少一种节点类型不均衡,则需要均衡阶段。
  • 均衡仅在不均衡的节点类型上移动副本,其他节点类型不受均衡阶段的影响。

每种节点类型的均衡如何影响群集

在均衡每种节点类型的群集期间,Service Fabric 群集资源管理器会计算每种节点类型的不均衡状态。 如果至少一种节点类型不均衡,则会触发均衡阶段。 当均衡在这些节点类型上暂时暂停时(例如,自上一个均衡阶段以来尚未经过最小均衡间隔),均衡阶段不会移动不均衡节点类型上的副本。 不均衡状态的检测使用已可用于经典群集均衡的通用机制,但提高了配置粒度和灵活性。 下面的列表中提供了用于均衡每种节点类型以检测不均衡的机制:

  • 每种节点类型的指标均衡阈值是与经典均衡中使用的全局定义的均衡阈值具有类似作用的值。 计算每种节点类型的最小和最大指标负载的比率。 如果节点类型的比例高于该节点类型定义的均衡阈值,则该节点类型被标记为不均衡。 有关每种节点类型的指标活动阈值配置的更多详细信息,请查看每种节点类型的均衡阈值部分
  • 每种节点类型的指标活动阈值是与经典均衡中使用的全局定义的活动阈值具有类似作用的值。 计算每种节点类型的最大指标负载。 如果节点类型的最大负载高于为该节点类型定义的活动阈值,则该节点类型将被标记为不均衡。 有关每种节点类型的指标活动阈值配置的更多详细信息,请查看每种节点类型的活动阈值部分
  • 每种节点类型的最小均衡间隔的作用与全局定义的最小均衡间隔类似。 对于每种节点类型,群集资源管理器都会保留上次均衡的时间戳。 在定义的最小均衡间隔内,无法在节点类型上执行两个连续的均衡阶段。 有关每种节点类型的最小均衡间隔配置的更多详细信息,请查看每种节点类型的最小均衡间隔部分

描述每种节点类型的均衡

为了启用每种节点类型的均衡,需要在群集清单中启用参数SeparateBalancingStrategyPerNodeType。 此外,还需要启用子群集功能。 用于启用该功能的群集清单 PlacementAndLoadBalancing 部分的示例:

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

使用 ClusterConfig.json 进行独立部署或将 Template.json 用于 Azure 托管群集:

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

正如我们在上一节中所述,可以为每种节点类型指定阈值和间隔。 有关更新特定参数的更多详细信息,请查看以下小节:

每种节点类型的均衡阈值

可以为每种节点类型定义指标均衡阈值,以增加均衡配置的粒度。 均衡阈值具有浮点类型,因为它们表示特定节点类型内最大和最小负载值之比的阈值。 每种节点类型的均衡阈值在 PlacementAndLoadBalancingOverrides 部分中定义:

<NodeTypes>
    <NodeType Name="NodeType1">
        <PlacementAndLoadBalancingOverrides>
            <MetricBalancingThresholdsPerNodeType>
                <BalancingThreshold Name="Metric1" Value="2.5">
                <BalancingThreshold Name="Metric2" Value="4">
                <BalancingThreshold Name="Metric3" Value="3.25">
            </MetricBalancingThresholdsPerNodeType>
        </PlacementAndLoadBalancingOverrides>
    </NodeType>
</NodeTypes>

如果没有为节点类型定义指标均衡阈值,则阈值将继承在 PlacementAndLoadBalancing 部分中全局定义的指标均衡阈值。 否则,如果既没有为节点类型定义指标的均衡阈值,也没有在 PlacementAndLoadBalancing 部分中全局定义指标的均衡阈值,则阈值的默认值将为 1

每种节点类型的活动阈值

可以为每种节点类型定义指标活动阈值,以增加均衡配置的粒度。 活动阈值具有整数类型,因为它们表示特定节点类型内最大负载值的阈值。 每种节点类型的活动阈值在 PlacementAndLoadBalancingOverrides 部分中定义:

<NodeTypes>
    <NodeType Name="NodeType1">
        <PlacementAndLoadBalancingOverrides>
            <MetricActivityThresholdsPerNodeType>
                <ActivityThreshold Name="Metric1" Value="500">
                <ActivityThreshold Name="Metric2" Value="40">
                <ActivityThreshold Name="Metric3" Value="1000">
            </MetricActivityThresholdsPerNodeType>
        </PlacementAndLoadBalancingOverrides>
    </NodeType>
</NodeTypes>

如果没有为节点类型定义指标的活动阈值,则阈值将从 PlacementAndLoadBalancing 部分中全局定义的指标活动阈值继承值。 否则,如果既没有为节点类型定义指标的活动阈值,也没有在 PlacementAndLoadBalancing 部分中全局定义指标的活动阈值,则阈值的默认值将为 0

每种节点类型的最小均衡间隔

可以为每种节点类型定义最小均衡间隔,以增加均衡配置的粒度。 最小均衡间隔具有整数类型,因为它表示同一节点类型上连续两轮均衡之前必须经过的最短时间。 每种节点类型的最小均衡间隔在 PlacementAndLoadBalancingOverrides 部分中定义:

<NodeTypes>
    <NodeType Name="NodeType1">
        <PlacementAndLoadBalancingOverrides>
            <MinLoadBalancingIntervalPerNodeType>100</MinLoadBalancingIntervalPerNodeType>
        </PlacementAndLoadBalancingOverrides>
    </NodeType>
</NodeTypes>

如果没有为节点类型定义最小均衡间隔,间隔将继承 PlacementAndLoadBalancing 部分中全局定义的最小均衡间隔的值。 否则,如果既没有为节点类型定义最小间隔,也没有在 PlacementAndLoadBalancing 部分中全局定义最小间隔,则最小间隔的默认值将为 0,这表示不需要在连续的均衡轮次之间暂停。

示例

示例 1

假设这样一种情况:群集包含两种节点类型:节点类型 A 和节点类型 B。所有服务都报告相同的指标,并且这些指标分布在这些节点类型之间,因此它们的负载统计数据是不同的。 在此示例中,节点类型 A 的最大负载为 300,最小负载为 100,节点类型 B 的最大负载为 700,最小负载为 500:

Diagram showing an example of a node type balancing threshold wtih two node types.

客户检测到两种节点类型的工作负载具有不同的均衡需求,并决定为每种节点类型设置不同的均衡和活动阈值。 节点类型 A 的均衡阈值为 2.5,活动阈值为 50。 对于节点类型 B,客户将均衡阈值设置为 1.2,将活动阈值设置为 400

在本示例中检测群集不均衡期间,两种节点类型都违反了活动阈值。 节点类型 A 的最大负载 为 300,高于定义的活动阈值 50。 节点类型 B 的最大负载 为 700,高于定义的活动阈值 400。 节点类型 A 违反了均衡阈值标准,因为当前最大负载与最小负载之比为 3,均衡阈值为 2.5。 相反,节点类型 B 没有违反均衡阈值标准,因为该节点类型的当前最大负载与最小负载之比为 1.2,但均衡阈值为 1.4。 仅节点类型 A 中的副本需要均衡,并且在均衡阶段期间唯一有资格进行移动的副本集是放置在节点类型 A 中的副本。

示例 2

假设这样一种情况:群集包含三种节点类型:节点类型 ABC。所有服务报告相同的指标,并且它们在这些节点类型之间划分,因此它们的负载统计数据是不同的。 在示例中,节点类型 A 的最大负载为 600,最小负载为 100,节点类型 B 的最大负载为 900,最小负载为 100,节点类型 C 的最大负载为 600,最小负载为 300:

Diagram showing an example of a node type balancing threshold with three node types.

客户发现这些节点类型的工作负载具有不同的均衡需求,并决定为每种节点类型设置不同的均衡和活动阈值。 节点类型 A 的均衡阈值为 5,活动阈值为 700。 对于节点类型 B,客户将均衡阈值设置为 10,将活动阈值设置为 200。 对于节点类型 C,客户将均衡阈值设置为 2,将活动阈值设置为 300

节点类型 A 的最大负载为 600,低于定义的活动阈值 700,因此节点类型 A 不会得到均衡。 节点类型 B 的最大负载为 900,高于定义的活动阈值 200。 节点类型 B 违反活动阈值标准。 节点类型 C 的最大负载为 600,高于定义的活动阈值 300。 节点类型 C 违反活动阈值标准。 节点类型 B 没有违反均衡阈值标准,因为该节点类型的当前最大负载与最小负载之比为 9,但均衡阈值为 10。 节点类型 C 违反均衡阈值标准,因为当前最大负载与最小负载之比为 2,均衡阈值为 2。 仅节点类型 C 中的副本需要均衡,并且在均衡阶段期间唯一有资格进行移动的副本集是放置在节点类型 C 中的副本。

后续步骤

  • 指标是 Service Fabric 群集资源管理器在群集中管理消耗和容量的方式。 若要详细了解指标及其配置方式,请查看指标文章
  • 移动成本是向群集 Resource Manager 发出信号,表示移动某些服务比移动其他服务会产生更高成本的方式之一。 若要了解有关移动成本的详细信息,请参阅移动成本文章
  • 群集 Resource Manager 提供多个限制机制,可以配置这些限制机制,以减慢群集中的流动。 它们通常不是必需的,但如果你需要它们,可以通过高级限制文章了解它们
  • 群集资源管理器可以识别并处理子群集。 使用放置约束和均衡时,可能会出现子群集。 若要了解子群集如何影响均衡以及如何处理它,请参阅子群集文章