这是大多数内核块参与的阶段之一(请参阅
第 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()
方法(在 中定义
storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
),其输出由阶段中的所有其他块处理
READ_CONFIG_REQ
(参见
第 5.1 节,“初始化阶段(阶段 -1)”)。在这些初始化之后,QMGR
将DIH_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 节点之间的信令:
作为最后一步,QMGR
还启动它负责的计时器处理。这意味着它会向请求它的块生成一个信号。即使信号的任何一个实例被延迟,该信号每秒发送 100 次。
BACKUP
内核块也开始定期发送信号
。这是为了确保不会将过多的数据写入磁盘,并且在重新启动期间和之后将数据写入保持在集群配置文件中指定的限制范围内。该
DBUTIL
块初始化事务标识,并
DBTUX
创建对DBTUP
块的引用,同时
PGMAN
初始化指向LGMAN
和
DBTUP
块的指针。RESTORE
内核块创建对DBLQH
和
块的
引用,DBTUP
以便在需要时能够快速访问这些块。