5.4 STTOR 第一阶段

这是大多数内核块参与的阶段之一(请参阅 第 5.3 节“STTOR 阶段 0”中的表格)。否则,大多数块主要涉及数据的初始化——例如,这就是全部 DBTC

许多块在阶段 1 中 DBLQH初始化对其他块的引用。将块引用初始化为DBTUP,并将 DBACC块引用初始化为DBTUPDBLQHDBTUP初始化对 DBLQHTSMANLGMAN块的引用。

NDBCNTR初始化一些变量并设置对 DBTUP, DBLQH, DBACC, DBTC, DBDIH, 和 的块引用DBDICT;在使用信号处理这些块的特殊启动阶段需要这些 NDB_STTOR,其中大部分节点启动过程实际发生。

如果集群配置为锁定页面(即,如果 LockPagesInMainMemory 已设置配置参数), CMVMI则处理此锁定。

QMGR块调用 initData()方法(在 中定义 storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp),其输出由阶段中的所有其他块处理 READ_CONFIG_REQ(参见 第 5.1 节,“初始化阶段(阶段 -1)”)。在这些初始化之后,QMGRDIH_RESTARTREQ信号发送到 DBDIH, 确定是否存在适当的系统文件;如果是,则不会执行初始启动。收到此信号后,该节点将集成到集群中的其他数据节点中,数据节点一次一个地进入集群。第一个进入的成为主人;每当主节点死亡时,新的主节点始终是剩余节点中运行时间最长的节点。

QMGR设置计时器以确保包含在集群中的时间不会超过集群配置设置允许的时间(有关相关配置参数,请参阅 控制超时、间隔和磁盘分页),之后建立与所有其他数据节点的通信. 此时, CM_REGREQ向所有数据节点发送一个信号。只有集群的主席响应这个信号;总统一次允许一个节点进入集群。如果 3 秒内没有节点响应,则总统成为主节点。如果多个节点同时启动,则节点 ID 最小的节点成为总统。总统派 CM_REGCONF为了响应这个信号,同时也向CM_ADD所有当前存活的节点发送一个信号。

CM_NODEINFOREQ接下来,起始节点向所有当前 活动数据节点 发送 信号。NODE_VERSION_REP当这些节点收到该信号时,它们会向所有连接到它们的 API 节点发送信号。每个数据节点也向CM_ACKADD总统发送一个消息,通知总统它已经听到 CM_NODEINFOREQ来自新节点的信号。最后,每个当前数据节点发送 CM_NODEINFOCONF信号以响应起始节点。当起始节点接收到所有这些信号后,它也将CM_ACKADD信号发送给总统。

当总统收到所有预期的 CM_ACKADD信号时,它就知道所有数据节点(包括最新启动的数据节点)都已回复该 CM_NODEINFOREQ信号。当president收到finalCM_ACKADD后,会向当前所有的data节点发送一个 CM_ADD信号(也就是除了刚启动的节点)。收到此信号后,现有数据节点将启用与新节点的通信;他们开始向它发送心跳并将其包含在心跳协议使用的邻居列表中。

start结构被重置,以便它可以处理新的起始节点,然后每个数据节点向 CM_ACKADD总统发送一个,然后总统在收到CM_ADD所有此类信号后向起始节点 发送一个。CM_ACKADD然后,新节点打开所有与已连接到集群的数据节点的通信通道;它还会设置自己的心跳结构并开始发送心跳。它还发送一条CM_ACKADD消息以回应总统。

下图显示了起始数据节点、已经 活跃的数据节点、总统和附加到集群的任何 API 节点之间的信令:

群集 STTOR 开始阶段 1 中的信号交换

作为最后一步,QMGR还启动它负责的计时器处理。这意味着它会向请求它的块生成一个信号。即使信号的任何一个实例被延迟,该信号每秒发送 100 次。

BACKUP内核块也开始定期发送信号 。这是为了确保不会将过多的数据写入磁盘,并且在重新启动期间和之后将数据写入保持在集群配置文件中指定的限制范围内。该 DBUTIL块初始化事务标识,并 DBTUX创建对DBTUP块的引用,同时 PGMAN初始化指向LGMANDBTUP块的指针。RESTORE内核块创建对DBLQH和 块的 引用,DBTUP以便在需要时能够快速访问这些块。