5.4 STTOR 階段 1

這是大多數核心區塊參與的階段之一(請參閱第 5.3 節,「STTOR 階段 0」中的表格)。此外,大多數區塊主要參與資料的初始化——例如,這是 DBTC 所做的全部工作。

許多區塊在階段 1 中初始化對其他區塊的參考。DBLQH 初始化對 DBTUP 的區塊參考,而 DBACC 初始化對 DBTUPDBLQH 的區塊參考。DBTUP 初始化對 DBLQHTSMANLGMAN 區塊的參考。

NDBCNTR 初始化一些變數,並建立對 DBTUPDBLQHDBACCDBTCDBDIHDBDICT 的區塊參考;這些在使用 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 訊號。當「總統」接收到最後的 CM_ACKADD 時,它會將 CM_ADD 訊號傳送至所有目前的資料節點(也就是說,除了剛啟動的節點之外)。收到此訊號後,現有的資料節點會啟用與新節點的通訊;它們開始向其傳送心跳訊號,並包含在心跳協定所使用的鄰居清單中。

重設 start 結構,以便它可以處理新的啟動節點,然後每個資料節點會將 CM_ACKADD 傳送至「總統」,然後在收到所有此類 CM_ACKADD 訊號後,將 CM_ADD 傳送至啟動節點。然後,新節點會開啟其所有與已連線至叢集的資料節點的通訊管道;它也會設定其自己的心跳結構並開始傳送心跳訊號。它也會傳送 CM_ACKADD 訊息來回應「總統」。

啟動資料節點、已「作用中」的資料節點、「總統」以及在此階段連接至叢集的任何 API 節點之間的訊號傳送如下圖所示

Exchange of signals in cluster STTOR start phase 1

最後一個步驟,QMGR 也會啟動它所負責的計時器處理。這表示它會產生一個訊號給已請求它的區塊。即使訊號的任何一個執行個體延遲,也會每秒傳送此訊號 100 次。

BACKUP 核心區塊也會開始定期傳送訊號。這是為了確保不會將過多的資料寫入磁碟,並確保資料寫入保持在重新啟動期間和之後叢集組態檔案中指定的限制範圍內。DBUTIL 區塊會初始化交易識別,而 DBTUX 會建立對 DBTUP 區塊的參考,而 PGMAN 會初始化指向 LGMANDBTUP 區塊的指標。RESTORE 核心區塊會建立對 DBLQHDBTUP 區塊的參考,以便在需要時快速存取這些區塊。