### 23.6.4 NDB 集群启动阶段总结

[](<>)[](<>)

本节简要概述了启动 NDB Cluster 数据节点时所涉及的步骤。更完整的信息可以在[NDB 集群启动阶段](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-start-phases.html)， 在里面*`新开发银行`内部指南*.

这些阶段与输出中报告的阶段相同[`*`node_id`* 状态`](mysql-cluster-mgm-client-commands.html#ndbclient-status)管理客户端中的命令（请参阅[第 23.6.1 节，“NDB 集群管理客户端中的命令”](mysql-cluster-mgm-client-commands.html)）。这些启动阶段也在`开始阶段`的列[`ndbinfo.no​​des`](mysql-cluster-ndbinfo-nodes.html)桌子。

**启动类型。**有几种不同的启动类型和模式，如下表所示：

-   **初始启动。**集群从所有数据节点上的干净文件系统开始。这发生在集群第一次启动时，或者当所有数据节点使用[`- 最初的`](mysql-cluster-programs-ndbd.html#option_ndbd_initial)选项。

    笔记

    使用重新启动节点时不会删除磁盘数据文件[`- 最初的`](mysql-cluster-programs-ndbd.html#option_ndbd_initial).

-   **系统重启。**集群启动并读取存储在数据节点中的数据。当集群在使用后关闭时会发生这种情况，此时集群希望从其停止的点恢复操作。

-   **节点重启。**这是集群本身运行时集群节点的在线重启。

-   **初始节点重启。**这与重新启动节点相同，只是重新初始化节点并使用干净的文件系统启动。

**设置和初始化（阶段-1）。**在启动之前，每个数据节点（[**ndbd**](mysql-cluster-programs-ndbd.html)进程）必须被初始化。初始化包括以下步骤：

1.  获取节点 ID

2.  获取配置数据

3.  分配用于节点间通信的端口

4.  根据从配置文件中获取的设置分配内存

    当数据节点或 SQL 节点首次连接到管理节点时，它会保留一个集群节点 ID。为确保没有其他节点分配相同的节点 ID，此 ID 将一直保留到该节点已成功连接到集群并且至少有一个[**ndbd**](mysql-cluster-programs-ndbd.html)报告此节点已连接。节点 ID 的这种保留受到相关节点和节点之间的连接的保护。[**数据库\_管理**](mysql-cluster-programs-ndb-mgmd.html).

    在每个数据节点都被初始化之后，集群启动过程就可以进行了。此处列出了集群在此过程中经历的阶段：

-   **阶段 0。**这[`NDBFS`](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-ndbfs.html)和[`NDBCNTR`](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-ndbcntr.html)块开始。数据节点文件系统在那些启动的数据节点上被清除[`- 最初的`](mysql-cluster-programs-ndbd.html#option_ndbd_initial)选项。

-   **阶段1。**在这个阶段，所有剩余的[`新开发银行`](mysql-cluster.html)内核块被启动。建立 NDB Cluster 连接，建立块间通信，并启动心跳。在节点重新启动的情况下，还会检查 API 节点连接。

    笔记

    当一个或多个节点在第 1 阶段挂起，而其余一个或多个节点在第 2 阶段挂起时，这通常表明网络存在问题。此类问题的一种可能原因是一台或多台集群主机具有多个网络接口。导致这种情况的另一个常见问题来源是集群节点之间通信所需的 TCP/IP 端口被阻塞。在后一种情况下，这通常是由于防火墙配置错误造成的。

-   **阶段2。**这[`NDBCNTR`](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-ndbcntr.html)内核块检查所有现有节点的状态。选择主节点，并初始化集群模式文件。

-   **第三阶段。**这[`DBLQH`](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-dblqh.html)和[`DBTC`](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-dbtc.html)内核块在它们之间建立通信。确定启动类型；如果这是重新启动，则[`DBDIH`](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-dbdih.html)block 获得执行重启的权限。

-   **第 4 阶段。**对于初始启动或初始节点重新启动，将创建重做日志文件。这些文件的数量等于[`NoOfFragmentLogFiles`](mysql-cluster-ndbd-definition.html#ndbparam-ndbd-nooffragmentlogfiles).

    对于系统重启：

    -   读取模式或模式。

    -   从本地检​​查点读取数据。

    -   应用所有重做信息，直到达到最新的可恢复全局检查点。

        对于节点重启，找到重做日志的尾部。

-   **第 5 阶段。**数据节点启动的大部分与数据库相关的部分都是在此阶段执行的。对于初始启动或系统重新启动，将执行本地检查点，然后执行全局检查点。在此阶段开始定期检查内存使用情况，并执行任何所需的节点接管。

-   **第 6 阶段。**在此阶段，定义和设置节点组。

-   **第 7 阶段。**仲裁节点被选中并开始运行。设置下一个备份 ID，备份磁盘写入速度也是如此。到达这个开始阶段的节点被标记为`开始`.API 节点（包括 SQL 节点）现在可以连接到集群。

-   **第 8 阶段。**如果这是系统重新启动，则重建所有索引（通过[`DBDIH`](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-dbdih.html)）。

-   **第 9 阶段。**节点内部启动变量被重置。

-   **第 100 阶段（已过时）。**以前，在节点重新启动或初始节点重新启动期间，API 节点可以连接到节点并开始接收事件。目前，这个阶段是空的。

-   **阶段 101。**此时在节点重启或初始节点重启中，事件传递被移交给加入集群的节点。新加入的节点负责将其主要数据交付给订阅者。这个阶段也被称为[`苏玛`](https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-suma.html)交接阶段。

    在初始启动或系统重新启动的过程完成后，将启用事务处理。对于节点重新启动或初始节点重新启动，启动过程的完成意味着节点现在可以充当事务协调器。
