有状态服务的副本在其生命周期内会经过几个阶段:InBuild、Ready、Closing 和 Dropped 状态。 只有处于 Ready 和 Closing 状态的副本才能声明默认或动态负载。 处于 Dropped 状态的副本与资源利用率无关。 InBuild (IB) 副本的资源利用率是特定的,因此群集资源管理器为处理这种利用率提供了更多支持。 由于 IB 副本无法报告动态负载,并且其资源利用率可能高于处于 Ready 状态的利用率不佳副本的资源利用率(尤其是对于 I/O 和内存相关指标),因此 CRM 允许限制每个节点的并发生成数。
CRM 支持限制每个节点的 IB 副本数。 可通过两种方式定义限制:
- 每节点类型
- 针对满足放置约束的所有节点
根据约束优先级的一般规则,如果操作违反了为该节点定义的 IB 限制,CRM 将停止在节点上移动和创建副本。 约束仅阻止在 InBuild 阶段会导致 I/O 和内存消耗量高的操作,尤其是在从其他活动副本广泛复制上下文时。
任何类型的移动和 StandBy 副本的提升都是受限操作,会导致状态复制,并在 InBuild 阶段占用大量资源。 另一方面,将活动次要副本提升为主要副本的操作并没有问题,因此约束会阻止这类操作。 在提升次要副本期间,副本的状态与主要副本保持同步,无需进行额外的复制。
备注
由于每节点 InBuild 副本数限制,StandBy 副本的提升可能会被阻止。 从 StandBy 转换为 Ready 副本可能会导致占用大量 I/O 和内存,具体取决于需要从活动副本复制的上下文量。 因此,忽略 StandBy 副本的提升可能会导致每节点 InBuild 副本数限制约束旨在解决的问题。
群集资源管理器可执行三种不同类别的操作:
- 放置:控制缺失副本的放置、在升级期间协调交换,以及删除额外副本。
- 约束检查:强制实施规则。
- 均衡:执行可缓解群集中总节点利用率不均衡问题的操作。
通过群集资源管理器,可以为每个类别启用/禁用每节点 IB 副本数限制。 ThrottlePlacementPhase、ThrottleConstraintCheckPhase 和 ThrottleBalancingPhase 这三个配置可控制限制对特定操作而言是否处于活动状态。 为这些配置指定的值为布尔值。 提供了显式定义这些配置的群集清单部分:
<Section Name="PlacementAndLoadBalancing">
<Parameter Name="ThrottlePlacementPhase" Value="true">
<Parameter Name="ThrottleConstraintCheckPhase" Value="true">
<Parameter Name="ThrottleBalancingPhase" Value="true">
</Section>
下面是启用每节点 IB 副本数限制的配置示例,这些配置是通过 ClusterConfig.json(针对独立部署)或 Template.json(针对 Azure 托管群集)定义的:
"fabricSettings": [
{
"name": "PlacementAndLoadBalancing",
"parameters": [
{
"name": "ThrottlePlacementPhase",
"value": "true"
},
{
"name": "ThrottleConstraintCheckPhase",
"value": "true"
},
{
"name": "ThrottleBalancingPhase",
"value": "true"
}
]
}
]
通过群集资源管理器,可在全局和针对每个类别操作定义 IB 限制:
- MaximumInBuildReplicasPerNode:全局定义 IB 限制。 这些限制用于评估每个类别的最终 IB 限制。
- MaximumInBuildReplicasPerNodePlacementThrottle:定义放置类别的 IB 限制。 这些限制仅用于评估放置类别的最终 IB 限制。
- MaximumInBuildReplicasPerNodeConstraintCheckThrottle:定义约束检查类别的 IB 限制。 这些限制仅用于评估约束检查类别的最终 IB 限制。
- MaximumInBuildReplicasPerNodeBalancingThrottle:定义均衡类别的 IB 限制。 这些限制仅用于评估均衡类别的最终 IB 限制。
对于每个选项,群集资源管理器提供了两个选项来定义 IB 副本限制:
- 为单个节点类型中的所有节点定义 IB 限制。
- 为具有匹配放置约束的所有节点定义 IB 限制。
这些规则允许你为单个类别定义多个值,CRM 始终遵循你提供的最严格限制。 对于全局限制和类别限制,特定阶段中每个节点的限制是根据节点类型或与该节点对应的任何放置属性决定的最低值。 如果未定义特定节点的操作类别限制,则 CRM 假定节点没有 IB 副本计数上限。
提供了为每个阶段显式定义限制的群集清单部分:
<Section Name="MaximumInBuildReplicasPerNode">
<Parameter Name="NodeTypeA" Value="10" />
<Parameter Name="NodeTypeB" Value="20" />
<Parameter Name="NodeTypeName == NodeTypeA || NodeTypeName == NodeTypeC" Value="15" />
</Section>
<Section Name="MaximumInBuildReplicasPerNodePlacementThrottle">
<Parameter Name="NodeTypeC" Value="20" />
</Section>
<Section Name="MaximumInBuildReplicasPerNodeConstraintCheckThrottle">
<Parameter Name="NodeTypeD" Value="10" />
<Parameter Name="Color == Blue" Value="8" />
</Section>
<Section Name="MaximumInBuildReplicasPerNodeBalancingThrottle">
<Parameter Name="Color == Red" Value="25" />
</Section>
下面是通过 ClusterConfig.json(针对独立部署)或 Template.json(针对 Azure 托管群集)定义的相同 IB 限制示例:
"fabricSettings": [
{
"name": "MaximumInBuildReplicasPerNode",
"parameters": [
{
"name": "NodeTypeA",
"value": "10"
},
{
"name": "NodeTypeB",
"value": "20"
},
{
"name": "NodeTypeName == NodeTypeA || NodeTypeName == NodeTypeC",
"value": "15"
}
]
},
{
"name": "MaximumInBuildReplicasPerNodePlacementThrottle",
"parameters": [
{
"name": "NodeTypeC",
"value": "20"
}
]
},
{
"name": "MaximumInBuildReplicasPerNodeConstraintCheckThrottle",
"parameters": [
{
"name": "NodeTypeD",
"value": "10"
},
{
"name": "Color == Blue",
"value": "8"
}
]
},
{
"name": "MaximumInBuildReplicasPerNodeBalancingThrottle",
"parameters": [
{
"name": "Color == Red",
"value": "25"
}
]
}
]