25.2.2 NDB 集群节点、节点组、分片副本和分区
本节讨论了NDB 集群如何将数据分割和复制以供存储。
接下来的几段话中,讨论了一些理解这个主题的关键概念。
数据节点。 一个ndbd或ndbmtd进程,它存储一个或多个分片副本—即该节点组的成员之一的分配给该节点组的分区(后面在本节中讨论)的副本。
每个数据节点都应该位于单独的计算机上。虽然也可以在单个计算机上托管多个数据节点进程,但这种配置通常不被推荐。
在讨论NDB集群时,术语“节点”和“数据节点”通常被互换使用,以指代ndbd或ndbmtd进程;在这里提到时,管理节点(ndb_mgmd进程)和SQL节点(mysqld进程)将被明确指定为这样。
节点组. 节点组由一个或多个节点组成,并存储分区,或者称为碎片副本(见下一项)的集合。
NDB集群中的节点组数量不能直接配置;它是数据节点数和碎片副本数量(NoOfReplicas
配置参数)的函数,如下所示:
[# of node groups] = [# of data nodes] / NoOfReplicas
因此,如果在config.ini
文件中设置NoOfReplicas
为1,一个NDB集群中的4个数据节点将被分配到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
表。这受到以下限制:
-
生产环境中,只支持
KEY
和LINEAR KEY
分区方案在NDB
表中。 -
对任何
NDB
表定义的最大分区数是8 * [
,NDB集群中的节点组数量由本节前面讨论的方式确定。当运行ndbd数据节点进程时,设置LDL线程数量无效(因为LDL线程数量
] * [节点组数量
]ThreadConfig
只适用于ndbmtd);在这种情况下,这个值可以被视为等于1,以便执行此计算。请参阅第25.5.3节,“ndbmtd — The NDB Cluster Data Node Daemon (Multi-Threaded)”,获取更多信息。
关于 NDB 集群和用户自定义分区的更多信息,请见第 25.2.7 节,“NDB 集群已知限制”和第 26.6.2 节,“与存储引擎相关的分区限制”。
副本碎片. 这是一个集群分区的副本。每个节点组中的每个节点存储一个副本碎片。也称为分区副本。副本碎片的数量等于节点组中的节点数。
副本碎片完全属于单个节点;一个节点可以(通常情况下)存储多个副本碎片。
以下图表展示了四个数据节点运行ndbd,以两个节点组的形式运行,每个节点组中有两个节点;节点 1 和 2 属于节点组 0,而节点 3 和 4 属于节点组 1。
只显示了数据节点;虽然 NDB 集群需要一个ndb_ mgmd 进程进行集群管理,以及至少一个 SQL 节点来访问由集群存储的数据,但这些在图表中被省略以提高清晰度。
NDB 集群存储的数据被分为四个分区,编号为0、1、2和3。每个分区都在同一个节点组中存储—多个副本。在以下方式下,每个分区都存储于不同的节点组:
-
分区0在节点组0上存储;primary fragment replica(主副本)在节点1上,backup fragment replica(备份副本)在节点2上。
-
分区1在另一个节点组(节点组1)上存储,这个分区的primary fragment replica在节点3上,backup fragment replica在节点4上。
-
分区2在节点组0上存储,但是它的两个fragment replicas的位置与分区0相反;对于分区2,primary fragment replica在节点2上,backup在节点1上。
-
分区3在节点组1上存储,它的两个fragment replicas的位置与分区1相反,即primary fragment replica在节点4上,backup在节点3上。
这意味着,对于NDB 集群来说,如果参与集群的每个节点组至少有一个节点在运行,那么集群就拥有所有数据的完整副本,并且保持可用。这如图25.3所示。
在这个示例中,集群由两个节点组,每个节点组包含两个数据节点。每个数据节点都运行一个ndbd实例。任何至少包含一个节点组0中的节点和至少包含一个节点组1中的节点的组合都足以保持集群“存活”。然而,如果单个节点组中的所有节点失败,组成由其他节点组中的两个剩余节点的组合则不够。在这种情况下,集群已经失去了一个整个分区,因此无法提供对NDB Cluster数据的完整访问。
单个 NDB 集群实例支持的最大节点组数为 48。