本文概述了有状态服务的副本和无状态服务实例的生命周期。
无状态服务的实例
无状态服务的实例是在群集的某个节点上运行的服务逻辑的副本。 分区中的实例由 其 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 Actors 和 Reliable Services)从开发人员处隐藏副本角色的概念。 在角色模型中,角色的概念是多余的。 在服务领域,对于大多数情况来说已经大大简化。
后续步骤
有关 Service Fabric 概念的详细信息,请参阅以下文章: