共用方式為

副本和实例

本文概述了有状态服务的副本和无状态服务实例的生命周期。

无状态服务的实例

无状态服务的实例是在群集的某个节点上运行的服务逻辑的副本。 分区中的实例由 其 InstanceId 唯一标识。 实例的生命周期在下图中建模:

实例生命周期

InBuild (IB)

群集资源管理器确定实例的位置后,它将进入此生命周期状态。 实例在节点上启动。 启动应用程序主机,创建实例,然后打开。 启动完成后,实例将转换为就绪状态。

如果此实例的应用程序主机或节点崩溃,它将转换为已删除的状态。

就绪 (RD)

处于就绪状态,实例在节点上启动并运行。 如果此实例是可靠服务,则已调用 RunAsync

如果此实例的应用程序主机或节点崩溃,它将转换为已删除的状态。

关闭 (CL)

处于关闭状态时,Azure Service Fabric 正在关闭此节点上的实例。 此关闭可能是由于许多原因造成的,例如应用程序升级、负载均衡或服务正在删除。 关闭完成后,它将转换为已删除的状态。

已删除 (DD)

在删除状态下,实例不再在节点上运行。 此时,Service Fabric 会维护有关此实例的元数据,该实例最终也会被删除。

注释

可以通过在 Remove-ServiceFabricReplica 上使用 ForceRemove 选项,从任何状态转换到已删除状态。

有状态服务的副本

有状态服务的副本是运行在集群某个节点上的服务逻辑副本。 此外,副本维护该服务的状态信息拷贝。 两个相关概念描述了有状态副本的生命周期和行为:

  • 副本生命周期
  • 副本角色

以下讨论介绍了持久化的有状态服务。 对于易失性(或内存中)有状态服务,“停机”和“丢失”状态是等价的。

副本生命周期

InBuild (IB)

InBuild 副本是创建或准备用于联接副本集的副本。 根据副本角色,IB 具有不同的语义。

如果 InBuild 副本的应用程序主机或节点崩溃,它将转换为关闭状态。

  • 主 InBuild 副本:主 InBuild 是分区的第一个副本。 创建分区时,通常会发生这种复制现象。 当分区的所有副本重启或删除时,也会产生主 InBuild 副本。

  • IdleSecondary InBuild 副本:这些副本是由群集资源管理器创建的新副本,或者是已经失效且需要重新添加到集合中的现有副本。 这些副本由主要副本预先设置或创建,然后才能加入副本集成为活动次要副本,并通过仲裁共识确认操作。

  • ActiveSecondary InBuild 副本:在某些查询中观察到此状态。 它是一种优化,其中副本集未更改,但需要生成副本。 副本本身会按照正常的状态机转换进行操作(如副本角色部分中所述)。

就绪 (RD)

就绪副本是参与复制和法定人数确认操作的副本。 就绪状态适用于主副本和活动次级副本。

如果应用程序主机或就绪副本的节点崩溃,它将转换为关闭状态。

关闭 (CL)

副本在以下情形下进入关闭状态:

  • 关闭副本的代码:Service Fabric 可能需要关闭副本的运行代码。 此关闭可能是出于许多原因。 例如,这种情况可能发生在应用程序、构架或基础设施升级期间,或者是由于副本报告故障所致。 副本关闭完成后,副本将转换为关闭状态。 存储在磁盘上的此副本关联的持久化状态未被清理。

  • 从群集中删除副本:Service Fabric 可能需要删除持久状态并关闭副本的运行代码。 此关闭可能是出于多种原因,例如负载均衡。

已删除 (DD)

在删除状态下,实例不再在节点上运行。 节点上也没有剩余状态。 此时,Service Fabric 会维护有关此实例的元数据,该实例最终也会被删除。

向下 (D)

在关闭状态下,副本代码未运行,但该副本的持久状态存在于该节点上。 副本可能会由于多种原因而关闭,例如节点关闭、副本代码崩溃、应用程序升级或副本错误。

Service Fabric 会根据需要打开已关闭的副本,例如在节点上的升级完成后。

副本角色在故障状态下无关紧要。

开场(OP)

当 Service Fabric 需要重新启动副本时,停机副本将进入启动状态。 例如,此状态可能是在应用程序的代码升级在节点上完成之后。

如果用于打开副本的应用程序主机或节点崩溃,系统将转换为下线状态。

副本角色在启动状态并不重要。

StandBy (SB)

StandBy 副本是一个持久化服务的副本,该服务曾停止运行,然后被重新启动。 如果需要将另一个副本添加到副本集(因为副本已具有状态的某些部分且生成过程更快),Service Fabric 可以使用此副本。 StandByReplicaKeepDuration 过期后,将丢弃备用副本。

如果备用副本的应用程序主机或节点崩溃,它将转换为关闭状态。

副本角色在备用状态下没有作用。

注释

不关闭或删除的任何副本都被视为 正常运行

注释

可以使用 ForceRemove 选项在 Remove-ServiceFabricReplica上,从任何状态转换为已删除状态。

副本角色

副本的角色决定其在副本集中的作用:

  • 主要 (P):副本集中有一个主要成员负责执行读取和写入操作。
  • ActiveSecondary (S):这些副本接收来自主要副本的状态更新,应用它们,然后发送回确认。 副本集中有多个活动的从节点。 这些活跃的备用数据库数量决定了服务能够处理的故障数量。
  • IdleSecondary (I):这些副本由主要副本生成。 他们正在从主节点接收状态,才能提升为活动的次级节点。
  • 无(N):这些副本在副本集中没有责任。
  • 未知 (U):这是副本在从 Service Fabric 接收到任何ChangeRole API 调用之前的初始角色。

下图演示了副本角色转换及其可能发生的一些示例方案:

副本角色

  • U -> P:创建新的主副本。
  • U -> I:创建新的备用副本。
  • U -> N:删除备用副本。
  • I -> S:将空闲次要副本提升为活动次要副本,以便其确认响应有助于仲裁。
  • I -> P:将闲置的辅助副本提升为主要副本。 当空闲辅助副本是主要副本的正确候选项时,在特殊重新配置下可能会发生这种情况。
  • I -> N:删除空闲的次要副本。
  • S -> P:将活动辅助副本提升为主要副本。 这可能是由于主要故障转移或群集资源管理器启动的主移动造成的。 例如,它可能是为了响应应用程序升级或负载均衡。
  • S -> N:删除活动次要副本。
  • P -> S:主副本的降级。 这可能是由于群集资源管理器发起的第一次移动。 例如,它可能是为了响应应用程序升级或负载均衡。
  • P -> N,删除主副本。

注释

更高级别的编程模型(如 Reliable ActorsReliable Services)从开发人员处隐藏副本角色的概念。 在角色模型中,角色的概念是多余的。 在服务领域,对于大多数情况来说已经大大简化。

后续步骤

有关 Service Fabric 概念的详细信息,请参阅以下文章:

Reliable Services 生命周期 - C#