本節討論 NDB 叢集如何分割和重複資料以進行儲存。
在接下來的幾個段落中,將討論一些理解本主題的核心概念。
資料節點。 ndbd 或 ndbmtd 程序,其儲存一個或多個片段複本,也就是指派給節點所屬節點群組的分割區(在本節稍後討論)的複本。
每個資料節點都應該位於單獨的電腦上。雖然也可以在單一電腦上託管多個資料節點程序,但通常不建議這樣配置。
在指稱 ndbd 或 ndbmtd 程序時,通常會將術語「節點」和「資料節點」交替使用;在討論中提及時,會明確指定管理節點 (ndb_mgmd 程序) 和 SQL 節點 (mysqld 程序)。
節點群組。 節點群組由一個或多個節點組成,並儲存分割區或多組片段複本(請參閱下一個項目)。
NDB 叢集中的節點群組數量無法直接設定;它是資料節點數量和片段複本數量 (NoOfReplicas
設定參數) 的函數,如下所示
[# of node groups] = [# of data nodes] / NoOfReplicas
因此,如果 config.ini
檔案中的 NoOfReplicas
設定為 1,則具有 4 個資料節點的 NDB 叢集會有 4 個節點群組;如果 NoOfReplicas
設定為 2,則會有 2 個節點群組;如果 NoOfReplicas
設定為 4,則會有 1 個節點群組。片段複本將在本節稍後討論;如需有關 NoOfReplicas
的詳細資訊,請參閱第 25.4.3.6 節,「定義 NDB 叢集資料節點」。
NDB 叢集中的所有節點群組必須具有相同數量的資料節點。
您可以將新的節點群組 (以及新的資料節點) 線上新增至執行中的 NDB 叢集;如需詳細資訊,請參閱第 25.6.7 節,「線上新增 NDB 叢集資料節點」。
分割區。 這是叢集儲存的資料部分。每個節點都負責維護至少一個指派給它的任何分割區複本 (也就是至少一個片段複本),供叢集使用。
NDB 叢集預設使用的分割區數量取決於資料節點數量和資料節點使用的 LDM 執行緒數量,如下所示
[# of partitions] = [# of data nodes] * [# of LDM threads]
使用執行 ndbmtd 的資料節點時,LDM 執行緒數量由 MaxNoOfExecutionThreads
的設定控制。使用 ndbd 時,會有單一 LDM 執行緒,這表示叢集分割區的數量與參與叢集的節點數量相同。使用 ndbmtd 且 MaxNoOfExecutionThreads
設定為 3 或更少時,情況也是如此。(您應該注意,LDM 執行緒的數量會隨著此參數的值而增加,但並非嚴格線性增加,而且設定它還有其他限制;如需詳細資訊,請參閱 MaxNoOfExecutionThreads
的描述。)
NDB 和使用者定義的分割區。 NDB 叢集通常會自動分割 NDBCLUSTER
表格。不過,也可以對 NDBCLUSTER
表格採用使用者定義的分割區。這受限於以下限制
在搭配
NDB
表格的生產環境中,僅支援KEY
和LINEAR KEY
分割區配置。可以針對任何
NDB
表格明確定義的最大分割區數量為8 * [
,而 NDB 叢集中的節點群組數量取決於本節前面討論的內容。針對資料節點程序執行 ndbd 時,設定 LDM 執行緒數量不會產生任何影響 (因為LDM 執行緒數量
] * [節點群組數量
]ThreadConfig
僅適用於 ndbmtd);在這種情況下,就執行此計算的目的而言,此值可視為等於 1。如需詳細資訊,請參閱第 25.5.3 節,「ndbmtd — NDB 叢集資料節點守護程式 (多執行緒)」。
如需有關 NDB 叢集和使用者定義分割區的詳細資訊,請參閱第 25.2.7 節,「NDB 叢集的已知限制」,以及第 26.6.2 節,「與儲存引擎相關的分割區限制」。
片段複本。 這是叢集分割區的複本。節點群組中的每個節點都儲存片段複本。有時也稱為分割區複本。片段複本的數量等於每個節點群組的節點數量。
片段複本完全屬於單一節點;一個節點可以 (通常會) 儲存多個片段複本。
下圖說明具有四個資料節點執行 ndbd 的 NDB 叢集,其排列在兩個節點群組中,每個群組各包含兩個節點;節點 1 和 2 屬於節點群組 0,而節點 3 和 4 屬於節點群組 1。
此處僅顯示資料節點;雖然執行中的 NDB 叢集需要一個用於叢集管理的 ndb_mgmd 程序,以及至少一個 SQL 節點來存取叢集儲存的資料,但為了清楚起見,圖中省略了這些程序。
叢集儲存的資料會分為四個分割區,編號為 0、1、2 和 3。每個分割區都會以多個複本儲存在相同的節點群組上。分割區會以交替方式儲存在不同的節點群組上,如下所示
分割區 0 儲存在節點群組 0 上;一個主要片段複本(主要副本)儲存在節點 1 上,而一個備份片段複本(分割區的備份副本)儲存在節點 2 上。
分割區 1 儲存在另一個節點群組(節點群組 1)上;這個分割區的主要片段複本在節點 3 上,而其備份片段複本在節點 4 上。
分割區 2 儲存在節點群組 0 上。然而,其兩個片段複本的放置方式與分割區 0 相反;對於分割區 2,主要片段複本儲存在節點 2 上,而備份複本則在節點 1 上。
分割區 3 儲存在節點群組 1 上,而其兩個片段複本的放置方式與分割區 1 相反。也就是說,其主要片段複本位於節點 4 上,而備份複本則在節點 3 上。
關於 NDB Cluster 持續運作的意義是:只要參與叢集的每個節點群組都至少有一個節點在運作,叢集就擁有所有資料的完整副本並保持可運作狀態。下圖說明了這一點。
在這個範例中,叢集由兩個節點群組組成,每個節點群組包含兩個資料節點。每個資料節點都在執行一個 ndbd 的實例。節點群組 0 中至少一個節點和節點群組 1 中至少一個節點的任何組合都足以保持叢集「存活」。但是,如果單個節點群組中的兩個節點都發生故障,則由另一個節點群組中的其餘兩個節點組成的組合則不足夠。在這種情況下,叢集已遺失整個分割區,因此無法再提供對所有 NDB Cluster 資料完整集合的存取。
單個 NDB Cluster 實例支援的最大節點群組數為 48 個。