这是大多数内核块参与的阶段之一(参见中的表)第5.3节,“STTOR阶段0”).否则,大多数块主要涉及数据的初始化——例如,这就是所有这些DBTC
所做的事。
许多块在阶段1中初始化对其他块的引用。DBLQH
初始化块引用DBTUP
,DBACC
初始化块引用DBTUP
而且DBLQH
。DBTUP
对象的初始化引用DBLQH
,TSMAN
,LGMAN
块。
NDBCNTR
初始化一些变量并设置块引用DBTUP
,DBLQH
,DBACC
,DBTC
,DBDIH
,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节点如下图所示:
最后一步,QMGR
也启动它负责的计时器处理。这意味着它会向请求它的块生成一个信号。这个信号每秒发送100次,即使信号的任何一个实例被延迟。
的备份
内核块也开始周期性地发送信号。这是为了确保不会将过多的数据写入磁盘,并且在重新启动期间和之后将数据写入控制在集群配置文件中指定的限制范围内。的DBUTIL
块初始化事务标识,并且DBTUX
对象的引用DBTUP
块,而PGMAN
对象的指针初始化LGMAN
而且DBTUP
块。的恢复
内核块创建对DBLQH
而且DBTUP
块,以便在需要时快速访问这些块。