NDB 集群内部结构  /  NDB 集群启动阶段  /  NDB_STTOR 阶段 5

5.13 NDB_STTOR 阶段 5

对于初始启动和系统重启,此阶段意味着执行本地检查点。这由主节点处理,以便其他节点立即从该阶段返回。节点重启和初始节点重启在此阶段执行将记录从主片段副本复制到启动片段副本的操作。

将数据复制到启动节点是节点接管协议的一部分。作为此协议的一部分,将更新启动节点的节点状态;这是使用全局检查点协议进行通信的。等待这些事件发生可确保新的节点状态传达到所有节点及其系统文件。

在节点的状态传达之后,所有节点都会收到信号,表明我们将为此节点启动接管协议。此协议的一部分包括本节稍后描述的系统重启阶段中的步骤 3 - 9。这意味着所有片段的恢复、重做日志执行的准备、重做日志的执行,以及最后在重做日志执行完成后向 DBDIH 报告,都是此过程的一部分。

准备工作完成后,必须对节点中的每个片段执行复制阶段。复制片段的过程涉及以下步骤:

  1. 通过向启动节点中的 DBLQH 内核块发送 PREPARE_COPY_FRAGREQ 信号,通知它复制过程即将开始。

  2. DBLQH 确认此请求后,将向所有节点发送 CREATE_FRAGREQ 信号,通知它们正在准备将数据复制到此表片段的片段副本。

  3. 在所有节点都确认后,COPY_FRAGREQ 信号将从要从中复制数据的节点发送到新节点。这始终是片段的主片段副本。指示的节点响应此消息将所有数据复制到启动节点。

  4. 复制完成后,将发送 COPY_FRAGCONF 消息,通过 UPDATE_TOREQ 信号通知所有节点完成。

  5. 在所有节点都更新以反映片段的新状态后,启动节点的 DBLQH 内核块将收到通知,告知复制已完成,片段副本现在是最新的,任何故障现在都应视为真正的故障。

  6. 如果新片段副本在创建表时具有主片段副本的角色,则将其转换为主片段副本。

  7. 完成此更改后,将向所有节点发送另一轮 CREATE_FRAGREQ 消息,通知它们片段的接管现已提交。

  8. 之后,如果存在另一个片段,则使用下一个片段重复此过程。

  9. 当节点没有更多片段要接管时,通过向所有节点发送 UPDATE_TOREQ 信号来通知它们。

  10. 等待下一个完整的本地检查点发生,从开始到结束运行。

  11. 使用完整的全局检查点更新节点状态。与上一步中的本地检查点一样,必须允许全局检查点启动然后完成。

  12. 全局检查点完成后,它将通过向所有节点发送 END_TOREQ 信号来传达此节点重启的成功本地检查点。

  13. 向启动节点发送 START_COPYCONF,通知它节点重启已完成。

  14. 收到 START_COPYCONF 信号将结束 NDB_STTOR 阶段 5。这为系统重启提供了另一个同步点,指定为 WAITPOINT_5_2

注意

理论上,此阶段的复制过程可以由多个节点并行执行。但是,目前从主节点到所有节点的所有消息都是一次发送到单个节点,但可以完全并行化。这可能会在不久的将来完成。

在初始和初始节点重启中,SUMA 块从 SUMA 主节点请求订阅。NDBCNTR 执行 NDB_STTOR 阶段 6。不会发生其他 NDBCNTR 活动。