Akka 群集的外围是群集成员,以跟踪哪些节点是群集的一部分, 及其运行状况。应用 gossip 和故障检测来流传群集成员关系。
在群集成员关系服务之上构建了一些高级群集工具。
介绍
集群由一组成员节点组成。每个节点的标识符是主机名:端口:uid 元组。Akka 应用程序能够散布在群集中,每个节点托管应用程序的某些局部。集群成员资格与在该应用程序的该节点上运行的参与者是拆散的。节点能够是群集的成员,而无需托管任何参与者。通过向群集中要退出的节点之一收回“退出”命令来启动退出群集。
节点标识符在外部还蕴含一个 UID,该 ID 在该 hostname:port 上惟一标识此 actor 零碎实例。Akka 应用 UID 可能牢靠地触发近程死亡监督。这意味着从同一集群中删除该集群后,该 actor 零碎再也无奈退出该集群。要将具备雷同 hostname:port 的 actor 零碎重新加入集群,您必须进行 actor 零碎,并启动一个具备雷同 hostname:port 的新零碎,而后它将接管到不同的 UID。
成员状态
群集成员状态是专用的 CRDT,这意味着它具备枯燥合并性能。当不同节点上产生并发更改时,更新始终能够合并并收敛到雷同的最终后果。
join- 退出集群时的瞬态
弱启动 - 网络拆散时的过渡状态(仅当 akka.cluster.allow-weakly-up-members = on 时)
向上 - 失常运行状态
来到 / 退出 - 失常移除期间的状态
down- 标记为 down(不再是集群决策的一部分)
已移除 - 逻辑删除状态(不再是成员)
成员工夫
跟踪成员生命周期的事件是:
ClusterEvent.MemberJoined- 新成员已退出集群,其状态已更改为 Joining
ClusterEvent.MemberUp- 新成员已退出集群,其状态已更改为 Up
ClusterEvent.MemberExited- 成员正在来到集群,其状态已更改为“正在退出”。请留神,当此事件在另一个节点上公布时,该节点可能曾经敞开。
ClusterEvent.MemberRemoved- 从集群中齐全删除的成员。
ClusterEvent.UnreachableMember- 由至多一个其余节点的故障检测器检测到的成员被视为不可达。
ClusterEvent.ReachableMember- 成员在不可拜访之后,再次被认为是可拜访的。先前将其检测为不可达的所有节点已将其再次检测为可达。
成员生命周期
通过调用将节点置于联接状态的联接操作,将节点引入集群。一旦所有节点都晓得新节点正在退出(通过八卦收敛),领导者将把成员状态设置为 up。
如果节点以平安的预期形式来到群集,例如通过协调关机,则它将调用 leave 操作,将其切换到来到状态。领导者在来到状态下看到节点上的收敛后,领导者便会将其移至进口。一旦所有节点都看到退出状态(收敛),领导者就会从群集中删除该节点,并将其标记为已删除。
如果节点不可拜访,那么八卦交融是不可能的,因而大多数领导者行为都是不可能的(例如,容许节点成为集群的一部分)。为了可能向前挪动,该节点必须再次变得可拜访,或者必须将节点明确“敞开”。这是必须的,因为无法访问的节点的状态未知,并且群集无奈晓得该节点是否已解体或因为网络问题或 GC 暂停而临时无法访问。请参阅上面无关用户操作的局部,以理解如何敞开节点。
退出或敞开的节点上的参与者零碎无奈再次退出集群。特地是,在无法访问时被敞开并随后从新取得连贯的节点无奈重新加入群集。相同,必须在节点上重新启动该过程,创立一个新的参与者零碎,该零碎能够再次通过退出过程。
一种非凡状况是在不经验来到或降落过程的状况下重新启动的节点,例如因为托管该节点的计算机意外重新启动。当节点的新实例尝试重新加入群集时,群集可能仍将旧实例视为不可拜访。然而,在这种状况下,很显然旧节点已隐没,因为新实例将具备与其旧实例雷同的地址(主机和端口)。在这种状况下,先前的实例将被主动标记为已敞开,而新实例能够在无需人工干预的状况下重新加入群集。
Leader
领导者的目标是在达到收敛时确认状态变动。八卦收敛后,领导者能够由每个节点明确地确定。依据以后群集的组成,可能要求任何节点都表演领导者的角色。
没有收敛,不同的节点可能对哪个节点是领导者有不同的认识。因而,只有在存在收敛以确保所有节点都批准集群的以后状态并且状态更改源自单个节点的状况下,才容许大多数领导者动作。大多数惯例状态更改(例如将节点从联接更改为向上)都是这种类型的。
在其余状况下,即便以后无奈达到收敛,也须要采取措施。值得注意的是,如果故障检测器确定群集中的一个或多个节点以后不可达,则无奈达到收敛。在这种状况下,群集可能会被分区(裂脑场景),并且每个分区可能对哪些节点可拜访以及哪些节点无法访问有本人的认识。在这种状况下,分区两侧的节点可能会将本人视为可达节点的领导者。领导者在这种状况下执行的任何操作都必须以所有并发领导者得出雷同论断的形式设计(通常这是不可能的,只有在附加约束条件下才可行)。此类情况中最重要的状况是大脑裂开,须要手动或主动敞开节点以使群集复原交融。
Split Brain Resolver 是该程序的内置实现。
无需收敛的另一种可能过渡是将成员标记为 WeaklyUp,如下一节所述。
WeaklyUp 成员
如果节点不可达,则八卦收敛是不可能的,因而大多数领导者行为是不可能的。通过启用 akka.cluster.allow-weakly-up-members(默认状况下启用),即便尚未达到收敛,也能够将退出节点晋升为 WeaklyUp。一旦八卦交融再次建设,领导者就会将 WeaklyUp 成员移至 Up。
您能够订阅 WeaklyUp 成员资格事件以利用处于这种状态的成员,然而您应该晓得,网络分区另一侧的成员不晓得新成员的存在。例如,您不应该在法定决策中计算 WeaklyUp 成员。
状态图
成员国状态图
用户动作
join- 将单个节点退出集群 - 如果已在配置中指定了要退出的节点,则在启动时能够是显式的或主动的
来到 - 通知节点失常来到集群,通常由 ActorSystem 或 JVM 通过协调敞开来敞开
down- 将节点标记为 down。须要执行此操作能力从群集中删除解体的节点(未“来到”)。它能够通过集群 HTTP 治理手动触发,也能够由诸如 Split Brain Resolver 之类的解体提供程序主动触发
Leader 动作
领导者有责任确认用户将成员移入或移出集群的操作:
退出⭢
⭢弱地退出(执行此领导者操作不须要收敛,即便存在无奈达到的节点也能起作用)
弱向上⭢向上(再次达到齐全收敛后)
⭢来到
退出⭢已删除
向下⭢移除
故障检测和不可达性
不可拜访不是一个独自的成员状态,而是一个除状态之外的标记。监督另一个节点的每个节点上的故障检测器能够将被监督的节点标记为不可拜访,而与它的状态无关。之后,故障检测器将持续监督节点,直到它再次检测到该节点可达到并删除该标记。仅在所有监督节点都认为该节点可再次达到后,该节点才被视为可再次达到。