【问题标题】:Settings for multiple partitions, multiple node for service fabric stateless serviceService Fabric 无状态服务的多个分区、多个节点的设置
【发布时间】:2019-05-25 16:43:40
【问题描述】:

在当前使用无状态服务的情况下,为防止连接丢失,所需的设计是使用在每个节点上运行的主实例(当前设置为使用 5 个节点),希望每个节点上运行的每个主实例有助于端点不会因为以下原因而出错连接丢失。 (在这种情况下,SignalR)

所以设计应该是: 每个分区中的单个主副本和 4 个副本总共运行在 5 个节点中的 5 个分区。

这应该是一个简单的配置设置,但由于缺乏包含示例代码的完整手册,因此很难完成。

到目前为止,我发现的是:

为服务实例计数设置 DefaultValue="-1" 可实现服务在每个节点中运行,但您仍需要将其与以下之一结合:

SingletonPartition 或 UniformInt64Partition 或 命名分区

SingletonPartition 是无状态服务中的默认值,DefaultValue "-1" 与 SingletonPartition 的组合会强制服务仅在一个节点上运行,这超出了使用多个节点的目的。

所以我尝试了类似的方法: StatelessService InstanceCount="5" (这应该是 25,包括副本吗?) UniformInt64Partition PartitionCount="5" lowKey="0" highkey="5" (highkey 应该是 24 以包含所有副本吗?)

一些链接说 lowkey 和 highkey 应该匹配分区数,而另一个链接似乎包括所有实例,包括副本。

我还是没有成功实现5个分区,5个节点,每个分区运行主服务..

【问题讨论】:

    标签: c# azure-service-fabric service-fabric-stateless


    【解决方案1】:
    • 对于无状态服务,单例分区将实例计数设置为-1 means'在每个节点上运行一个'。
    • 对于无状态服务,不要使用Replicas but Instances。副本用于复制状态。

    因此,使用单例分区并将实例计数设置为 -1。

    【讨论】:

      【解决方案2】:

      我相信你想要的 ApplicationManifest 参数:

      <Parameter Name="YourService_PartitionCount" DefaultValue="5" />
      <Parameter Name="YourService_MinReplicaSetSize" DefaultValue="4" />
      <Parameter Name="YourService_TargetReplicaSetSize" DefaultValue="4" />
      

      然后在你想要的 DefaultServices 部分中

      <Service Name="YourService" ServicePackageActivationMode="ExclusiveProcess">
          <StatefulService ServiceTypeName="YourService" TargetReplicaSetSize="[YourService_TargetReplicaSetSize]" MinReplicaSetSize="[YourService_MinReplicaSetSize]">
              <UniformInt64Partition PartitionCount="[YourService_PartitionCount]" LowKey="0" HighKey="4" />
          </StatefulService>
      </Service>
      

      确保您的应用程序参数文件夹中没有可能覆盖这些值的值。

      LowKey="0" HighKey="4" 背后的原因是,如果您正在使用服务远程处理,则可以轻松定位它们。

      【讨论】:

        【解决方案3】:

        如果我正确理解了这个问题,您需要确保每个节点都有一个单独的主副本在其上运行。

        我只能想到一个解决方案(我无法通过原始分区来实现) - 您可以创建服务的多个实例并使用 placement constraints 将每个服务限制为单个节点,使用 NodeType 约束或placement policies 通过设置无效或必需的域。

        【讨论】:

          【解决方案4】:

          您应该在这两种情况下都使用副本集。就 Service Fabric 中的无状态服务而言,副本只是服务的副本。 另外,对无状态服务进行分区是非常罕见的场景。

          【讨论】:

          • 嗯......这与@LoekD 的观点完全相反......有趣......哪种方法更可取?有人吗?
          • @swcraft 不,不是真的,只是剪切想法。在这种情况下,InstanceCount -1 看起来像是无状态可用性的最佳选择。每个实例都将得到平等对待。没有分区。
          猜你喜欢
          • 2020-02-12
          • 2018-09-18
          • 2020-02-19
          • 2020-09-07
          • 2016-08-03
          • 2018-10-25
          • 1970-01-01
          • 2017-05-03
          • 2016-11-16
          相关资源
          最近更新 更多