本节介绍 NDB Cluster 如何划分和复制数据以进行存储。
在接下来的几段中,将讨论理解此主题的一些核心概念。
数据节点。 一个 ndbd 或 ndbmtd 进程,它存储一个或多个 片段副本,即分配给节点所属的节点组的 分区(在本节后面讨论)的副本。
每个数据节点应位于单独的计算机上。虽然在同一台计算机上托管多个数据节点进程也是可能的,但通常不建议这样做。
当指代 ndbd 或 ndbmtd 进程时,术语 “节点” 和 “数据节点” 通常可以互换使用;在本讨论中,如果提到管理节点 (ndb_mgmd 进程) 和 SQL 节点 (mysqld 进程),将在此明确说明。
节点组。 节点组由一个或多个节点组成,并存储分区或 片段副本 集(见下一项)。
NDB Cluster 中的节点组数量不能直接配置;它是数据节点数量和片段副本数量 (NoOfReplicas
配置参数) 的函数,如下所示
[# of node groups] = [# of data nodes] / NoOfReplicas
因此,如果 NoOfReplicas
在 config.ini
文件中设置为 1,则具有 4 个数据节点的 NDB Cluster 具有 4 个节点组;如果 NoOfReplicas
设置为 2,则有 2 个节点组;如果 NoOfReplicas
设置为 4,则有 1 个节点组。片段副本将在本节后面讨论;有关 NoOfReplicas
的更多信息,请参见 第 25.4.3.6 节,“定义 NDB Cluster 数据节点”。
NDB Cluster 中的所有节点组必须具有相同数量的数据节点。
可以将新的节点组(以及新的数据节点)在线添加到正在运行的 NDB Cluster 中;有关更多信息,请参见 第 25.6.7 节,“在线添加 NDB Cluster 数据节点”。
分区。 这是集群存储的数据的一部分。每个节点负责至少保留分配给它的一个分区副本(即至少一个片段副本)可供集群使用。
NDB Cluster 默认使用的分区数量取决于数据节点的数量和数据节点使用的 LDM 线程数量,如下所示
[# of partitions] = [# of data nodes] * [# of LDM threads]
当使用运行 ndbmtd 的数据节点时,LDM 线程数量由 MaxNoOfExecutionThreads
的设置控制。当使用 ndbd 时,只有一个 LDM 线程,这意味着集群分区数量与参与集群的节点数量相同。当使用 ndbmtd 并将 MaxNoOfExecutionThreads
设置为 3 或更小时,情况也是如此。(您应该知道,LDM 线程的数量会随着此参数值的增加而增加,但不是严格线性增加,并且在设置它时还有一些其他限制;有关更多信息,请参见 MaxNoOfExecutionThreads
的描述。)
NDB 和用户定义的分区。 NDB Cluster 通常自动对 NDBCLUSTER
表进行分区。但是,也可以对 NDBCLUSTER
表使用用户定义的分区。这受以下限制
在使用
NDB
表的生产环境中,仅支持KEY
和LINEAR KEY
分区方案。任何
NDB
表可以显式定义的最大分区数量为8 * [
,NDB Cluster 中的节点组数量如前所述确定。当运行 ndbd 用于数据节点进程时,设置 LDM 线程的数量没有任何效果(因为LDM 线程数
] * [节点组数
]ThreadConfig
仅适用于 ndbmtd);在这种情况下,为了执行此计算,此值可以视为等于 1。有关更多信息,请参见 第 25.5.3 节,“ndbmtd — NDB Cluster 数据节点守护进程(多线程)”。
有关 NDB Cluster 和用户定义的分区的更多信息,请参见 第 25.2.7 节,“NDB Cluster 的已知限制” 和 第 26.6.2 节,“与存储引擎相关的分区限制”。
片段副本。 这是集群分区的副本。节点组中的每个节点都存储一个片段副本。有时也被称为 分区副本。片段副本的数量等于每个节点组中的节点数量。
片段副本完全属于单个节点;一个节点可以(并且通常会)存储多个片段副本。
下图说明了一个 NDB Cluster,它有四个运行 ndbd 的数据节点,并被安排在两个由两个节点组成的节点组中;节点 1 和 2 属于节点组 0,节点 3 和 4 属于节点组 1。
此处仅显示数据节点;尽管一个正常工作的 NDB Cluster 需要一个 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 个。