部署的无状态服务数量大于集群节点数量

Deploying number of stateless services larger than number of cluster nodes

我注意到在集群中部署无状态服务时,最大实例数不能超过物理节点数。两个问题:

  1. 这是设计的硬性限制吗(即不仅仅是开发集群问题)?
  2. 当半个集群宕机时,该服务的处理能力会发生什么变化?

实例数不能超过集群中的节点数,不,有一个placement constraint可以确保这一点。您可以修改集群的放置约束,但我认为您不能将其设置为完全忽略 ReplicaExclusionStatic 约束。还值得注意的是,在默认设置中它被视为警告,即如果你有 node count = 7 并且你的集群有 5 个节点,它会给你警告它无法放置 2 个实例。

在 Service Fabric 中有实例分区的概念,最常见的实例与无状态服务相关联,而分区有状态,但这并不意味着你不能有无状态服务的分区(但在大多数情况下它可能也没有意义)。

如果您希望您的服务有更多实际实例 运行,那么您可以更改分区计数以便在每个节点上创建更多分区。无状态服务的默认值为 SingletonPartition,实例计数为 -1,即在每个可用节点上放置一个实例:

在ApplicationManifest.xml中:

<Service Name="MyService">
    <StatelessService ServiceTypeName="MyServiceType" InstanceCount="[MyService_InstanceCount]">
        <SingletonPartition />
    </StatelessService>
</Service>

在你的 PublishProfiles/Cloud.xml:

<Parameters>
    <Parameter Name="MyService_InstanceCount" Value="-1" />
</Parameters>

在 5 节点集群上,您将获得 5 个实例 运行,这没什么奇怪的。如果您更改为实例计数 = 6,那么您将收到放置警告(并且仍然不超过 5 个实际实例 运行)。

现在,如果您想在每个节点上拥有更多实例(或副本)运行,您可以修改无状态服务的分区计数

<Service Name="MyService">
    <StatelessService ServiceTypeName="MyServiceType" InstanceCount="[MyService_InstanceCount]">
        <UniformInt64Partition PartitionCount="4" LowKey="0" HighKey="4" />
    </StatelessService>
</Service>

在同一个集群上,使用相同的实例数量,您现在将获得 20 个(5 个节点 x 4 个分区)服务副本 运行。

现在让事情变得复杂的是,当您与您的无状态服务对话时,您将始终必须包含一个分区键。它可能不像有状态服务那样有意义,因为没有预期状态,但您选择的分区键应该均匀分布到负载。

当您随后扩展集群时,您将始终获得每个分区的相同数量的副本,但如果您将实例计数设置为特定数量而不是 -1,则每个节点的分区数量可能会有所不同。

本文详细讨论了分区、实例和副本。 https://blogs.msdn.microsoft.com/mvpawardprogram/2015/10/13/understanding-service-fabric-partitions/