大多数 NDB
内核块在 STTOR
阶段 1 开始其启动阶段,但 NDBFS
和 NDBCNTR
从阶段 0 开始,这可以通过检查 ALL_BLOCKS
数组(定义于 src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
)中每个元素的第一个值来看出。此外,当 STTOR
信号发送到一个块时,返回信号 STTORRY
始终包含该块感兴趣的启动阶段列表。只有在这些启动阶段,该块才会实际收到 STTOR
信号。
STTOR
信号按照内核块在 ALL_BLOCKS
数组中列出的顺序发送。虽然 NDBCNTR
经历了从 0 到 255 的启动阶段,但其中大部分阶段都是空的。
阶段 0 中的两个活动都与 NDB
文件系统的初始化有关。首先,如果需要,NDBFS
会为数据节点创建文件系统目录。在初始启动的情况下,NDBCNTR
会清除数据节点目录中的所有现有文件,以确保 DBDIH
块随后不会发现任何系统文件(如果 DBDIH
找到任何系统文件,它就不会将启动正确解释为初始启动)。
每次 NDBCNTR
完成向所有内核块发送一个启动阶段后,它都会向所有块发送一个 NODE_STATE_REP
信号,这有效地更新了所有块中的 NodeState
。
每次 NDBCNTR
完成一个非空的启动阶段后,它都会向管理服务器报告;在大多数情况下,这会被记录在集群日志中。
最后,在完成所有启动阶段后,NDBCNTR
会使用 NODE_STATE_REP
信号更新所有块中的节点状态;它还会发送一个事件报告,通知所有启动阶段已完成。此外,还会通知所有其他集群数据节点,该节点已完成其所有启动阶段,以确保所有节点都知道彼此的状态。每个数据节点都会向所有块发送一个 NODE_START_REP
;但是,这只对 DBDIH
有意义,以便它知道何时可以解锁 DBDICT
上的模式更改锁。
在下表中以及本文的其余部分,我们有时将 STTOR
启动阶段简称为“启动阶段”或“阶段 N
”(其中 N
是某个数字)。NDB_STTOR
启动阶段始终按其原样限定,因此称为“NDB_STTOR
启动阶段”或“NDB_STTOR
阶段”。
表 5.1 NDB 内核块和启动阶段
内核块 | 接收启动阶段 |
---|---|
NDBFS |
0 |
DBTC |
1 |
DBDIH |
1 |
DBLQH |
1, 4 |
DBACC |
1 |
DBTUP |
1 |
DBDICT |
1, 3 |
NDBCNTR |
0, 1, 2, 3, 4, 5, 6, 8, 9 |
CMVMI |
1(在 QMGR 之前)、3、8 |
QMGR |
1, 7 |
TRIX |
1 |
BACKUP |
1, 3, 7 |
DBUTIL |
1, 6 |
SUMA |
1、3、5、7、100(空)、101 |
DBTUX |
1,3,7 |
TSMAN |
1、3(两者都被忽略) |
LGMAN |
1、2、3、4、5、6(全部被忽略) |
PGMAN |
1、3、7(阶段 7 当前为空) |
RESTORE |
1、3(只有在阶段 1 中才进行实际工作) |
此表在本文档编写时是最新的,但将来可能会发生变化。最新信息可以在源代码中找到。