Skip to content

集群生命周期

本章节介绍有关 Ignite 3 集群初始化和生命周期的内容。

1.无线上集群的节点启动

当节点启动时,它们会检查节点探测器配置network.nodeFinder中列出的所有地址。

找到的所有节点都将添加到物理拓扑中,即彼此识别的节点。所有节点会共享其他节点的信息,因此拓扑将包括其地址在至少一个其他节点中列出的所有节点。如果存在完全分离的节点(例如,节点 A 和 B 只知道彼此,C 和 D 也是如此),它们将形成单独的物理拓扑(在此示例中,将有 A 和 B 组成的集群,以及另一个 C 和 D 组成的集群)。

如果没有正在运行的集群,则节点会交换有关网络的信息,但在收到集群初始化命令之前不会启动任何进程,也不会形成逻辑拓扑,即经过验证并形成集群的节点。

1.1.节点环境要求

集群中的所有节点必须具有相似的时间,该时间的差异不得超过schemaSync.maxClockSkew,这是事务正常执行的必要条件。

由于网络延迟是不可预测的,因此某些请求可能需要很长时间才能到达,以至于接收节点上的时间会因请求到达的时间而异。要考虑延迟,请将schemaSync.delayDuration属性设置为足够长的时间,以便将模式更新传送到集群中的所有节点。但是此延迟也会影响执行 DDL 所需的时间,因为所有节点都需要等待延迟过去才能应用更新。

2.集群初始化

集群中的任何节点收到cluster init命令后,就会发起初始化过程。

首先,参数中指定--cluster-management-group的节点会形成一个 Raft 组,并承担集群管理组(CMG)的角色,其负责处理集群操作。

之后,指定--metastorage-group参数的节点会形成一个 Raft 组并承担元存储组(MG)的角色,其负责存储集群元数据的权威副本。

如果只指定了 --cluster-management-group--metastorage-group 中的一个,则指定的值将用于两者。如果未指定,则按字母顺序自动为 CMGMG 选择一组节点,所选节点的数量按以下方式确定:

  • 如果集群规模为 3 个或更小,则所有节点都用于元存储组(CMGMG);
  • 如果集群规模为 4,则使用 3 个节点来维持一个奇数,从而提高共识效率;
  • 如果集群规模为 5 个或更大,则使用 5 个节点来平衡容错和开销。

2 个 Raft 组启动并选举其组长之后,拓扑中的所有其他节点都会收到集群已启动的通知,他们可以加入集群。此时集群被视为已初始化,可以开始接收请求。

每个非领导者节点都会收到 CMG 的加入集群邀请,并形成验证请求。然后将请求发送到 CMG,验证后节点从元存储组接收集群元信息并加入集群。

节点同时也被添加到集群逻辑拓扑中,这些节点被 CMG 验证并接受为集群的一部分。当节点因任何其他原因关闭或离开物理拓扑时,集群逻辑拓扑会立即进行调整。

2.1.集群管理组

集群管理组存储有关集群的信息、集群中的节点列表,并处理所有集群逻辑拓扑的更新。由于使用了 Raft 共识算法,CMG 提高了对脑裂的保护(因为任何失去 CMG 多数的集群组都将功能不完整)。

建议使用 3、5 或 7 个节点作为集群管理组,较大的集群管理组可以提高稳定性,因为它降低了丢失多数 CMG 节点的几率,但可能会导致轻微的性能影响。

失去多数集群管理组节点集群大部分功能仍然正常,没有 CMG 多数的集群仍然可以处理事务和用户请求,但不能:

  • 将新节点添加到逻辑拓扑中;
  • 将离开集群的节点重新添加到逻辑拓扑中;
  • 创建新的表索引,这时,CREATE INDEX DDL操作将不会完全解析,并且会阻塞应用程序。

要恢复集群的完整功能,需要将 CMG 的离线节点重新上线。

CMG 存储以下信息:

  • 当前集群状态,包括集群管理组和元存储组中的节点、使用的 Ignite 版本和集群标签;
  • 逻辑拓扑中所有节点的一致性 ID;
  • 节点验证状态。

这些信息默认存储在work文件夹中,但可以通过设置ignite.system.cmgPath属性在每个集群管理组节点上对其进行配置。

2.2.集群元数据组

集群元数据组存储有关集群中数据的信息,并处理数据分布。

建议使用 3、5 或 7 个节点作为元存储组,较大的元存储组可以提高稳定性,因为它降低了丢失多数元存储节点的几率,但可能会导致轻微的性能影响。

失去多数元存储节点将使集群无法运行,并可能导致数据丢失。

元存储包含以下信息:

  • 集群目录:有关集群的所有元信息的单个存储:表模式、索引、视图、分布区信息等;
  • 逻辑拓扑历史记录;
  • 集群运行所需的其他数据。

这些信息默认存储在work文件夹中,但可以通过设置ignite.system.metastoragePath属性在每个节点上对其进行配置。

3.节点加入的场景

3.1.新节点加入集群

当新节点启动时,它会将自身添加到物理拓扑中。然后集群管理组收到新节点已加入拓扑的事件,并向其发送加入集群的邀请。节点收到消息后会发送包含节点信息的验证请求,集群管理组会验证该节点并将节点添加到逻辑拓扑中。

3.2.节点重新加入集群

如果节点离开物理拓扑(例如由于该节点所在的主机故障),则会立即调整集群逻辑拓扑,并将该节点排除在外,该节点将无法以相同节点 ID 重新加入集群。

要重新加入集群,必须重启该节点。在重启期间,将生成一个新的节点 ID,然后加入集群的物理和逻辑拓扑。

当节点重新出现在物理拓扑中时,集群管理组会向其发送加入邀请。然后该节点要求集群管理组验证自身,如果成功,则启动其组件(此期间执行本地恢复),然后告诉集群管理组它已准备好加入。然后集群管理组会将其添加到逻辑拓扑中。此过程与首次加入空节点的过程相同。

18624049226