NDB 集群内部结构  /  NDB 集群启动阶段  /  第 4 阶段中的系统重启处理

5.21 第 4 阶段中的系统重启处理

这包括以下步骤:

  1. 主节点将最新的 GCI 设置为重启 GCI,然后将其系统文件同步到参与系统重启的所有其他节点。

  2. 下一步是同步系统重启中所有节点的模式。这在 15 个过程中完成。我们试图在此解决的问题发生在节点启动时创建了一个模式对象,但在节点关闭时删除了该对象,并且可能在新对象不可用时使用相同的模式 ID 创建了新对象。为了处理这种情况,首先需要从启动节点的角度重新创建所有应该存在的对象。在此之后,将删除该节点处于“死亡”状态时集群中其他节点删除的任何对象;这也适用于在中断期间删除的任何表。最后,在启动节点不可用时由其他节点创建的任何表都将在启动节点上重新创建。所有这些操作都是针对启动节点的本地操作。作为此过程的一部分,还需要确保需要重新创建的所有表都已在本地创建,并且已在所有内核块中为其设置了适当的数据结构。

    在为主节点执行上述过程后,新的模式文件将发送给系统重启中的所有其他参与者,并且它们执行相同的同步。

  3. 参与重启的所有分片都必须具有从 DBDIH 派生的适当参数。这会导致从 DBDIHDBLQH 发送许多 START_FRAGREQ 信号。这也启动了分片的恢复,这些分片在从磁盘读取恢复数据并并行地将从磁盘读取的恢复数据应用到主内存的过程中逐个恢复,一次恢复一条记录。这仅恢复表的主内存部分。

  4. 一旦所有分片都已恢复,就会向启动集群中的所有节点发送 START_RECREQ 消息,然后应用表的任何磁盘数据部分的所有撤消日志。

  5. LGMAN 中应用撤消日志后,需要在 TSMAN 中执行一些需要扫描表空间范围标头的恢复工作。

  6. 接下来,需要为重做日志的执行做好准备,该日志最多可以分四个阶段执行。对于每个分片,可能需要执行来自多个不同节点的重做日志。这是通过为特定分片在不同阶段执行重做日志来处理的,如在发送 START_FRAGREQ 信号时在 DBDIH 中决定的那样。对于需要在此阶段执行的每个阶段和分片,都会发送一个 EXEC_FRAGREQ 信号。发送完这些信号后,会向所有节点发送一个 EXEC_SRREQ 信号,告诉它们可以开始执行重做日志。

    注意

    在开始执行第一个重做日志之前,需要确保由 DBLQH 早期(在阶段 4 中)启动的设置已完成,或者在继续之前等待它完成。

  7. 在执行重做日志之前,需要计算从哪里开始读取以及重做日志应该在哪里结束。当到达要恢复的最后一个 GCI 时,应该找到重做日志的结尾。

  8. 完成重做日志的执行后,所有写入到要恢复的最后一个 GCI 之后的重做日志页都将失效。考虑到重做日志的循环性质,这可能会将失效信息带入到执行的最后一个重做日志文件之后的新重做日志文件中。

  9. 完成上一步后,DBLQH 使用 START_RECCONF 消息将此报告回 DBDIH

  10. 当主节点从所有启动节点收到此消息后,它会向 NDBCNTR 发送 NDB_STARTCONF 信号。

  11. NDB_STARTCONF 消息向 NDBCNTR 发出 STTOR 阶段 4 结束的信号,它是唯一一个在此阶段中起重要作用的块。