5.4 STTOR Phase 1

这是大多数内核块参与的阶段之一(参见中的表)第5.3节,“STTOR阶段0”).否则,大多数块主要涉及数据的初始化——例如,这就是所有这些DBTC所做的事。

许多块在阶段1中初始化对其他块的引用。DBLQH初始化块引用DBTUP,DBACC初始化块引用DBTUP而且DBLQHDBTUP对象的初始化引用DBLQHTSMAN,LGMAN块。

NDBCNTR初始化一些变量并设置块引用DBTUPDBLQHDBACCDBTCDBDIH,DBDICT;这些都需要在特殊的开始阶段处理这些块使用NDB_STTOR信号,节点启动过程的大部分实际发生在这里。

如果将集群配置为锁定页面(也就是说,如果LockPagesInMainMemory配置参数已设置),CMVMI处理这种锁定。

QMGR块调用initData ()中定义的方法(存储/ ndb / src /内核/块/ qmgr / QmgrMain.cpp的所有其他块处理它的输出READ_CONFIG_REQ阶段(见第5.1节“初始化阶段(阶段-1)”).这些初始化后,QMGR发送DIH_RESTARTREQ信号DBDIH,以确定是否存在适当的系统文件;如果是,则没有执行初始启动。在接收到该信号之后,将在集群中的其他数据节点中集成该节点,其中数据节点每次进入一个集群。先进去的就作主人。无论何时主节点死亡,新的主节点始终是那些剩余节点中运行时间最长的节点。

QMGR设置计时器,以确保包含在集群中的时间不会超过集群配置设置允许的时间(请参阅控制超时、间隔和磁盘分页为相关配置参数),之后建立与所有其他数据节点的通信。此时,aCM_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信号。当总统接收到finalCM_ACKADD,它发送一个CM_ADD向所有当前数据节点发送信号(也就是说,除了刚刚启动的节点)。在接收到此信号后,现有的数据节点启用与新节点的通信;它们开始向它发送心跳,并将其包含在心跳协议使用的邻居列表中。

开始Struct被重置,以便它能够处理新的开始节点,然后每个数据节点发送一个CM_ACKADD到总统,然后发送aCM_ADD回到起始节点CM_ACKADD信号已经收到了。然后,新节点向已经连接到集群的数据节点打开其所有通信通道;它还建立了自己的心跳结构,并开始发送心跳。它还会发送一个CM_ACKADD消息响应总统。

起始数据节点之间的信令,已经生活数据节点、总统和在此阶段附加到集群的任何API节点如下图所示:

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

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

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