本节讨论NDB Cluster对数据进行划分和重复存储的方式。
在接下来的几段中讨论了许多概念对此主题的理解核心。
数据节点。一个NDBD.或ndbmtd流程,存储一个或多个片段复制品- 这是,副本分区(稍后在本节中讨论)分配给节点是成员的节点组。
每个数据节点应该位于单独的计算机上。虽然也可以在一台计算机上托管多个数据节点进程,但通常不推荐这样的配置。
这术语常见“节点“和“数据节点“交替使用当指…时交替使用NDBD.或ndbmtd过程;提到的,管理节点(ndb_mgmd.进程)和SQL节点(mysqld.流程)在本讨论中是这样指定的。
节点组。一个节点组由一个或多个节点组成,并存储分区或集合片段复制品(见下一条)。
NDB群集中的节点组的数量不可直接配置;它是数据节点数量的函数和片段副本的数量(NoOfReplicas
配置参数),如下图所示:
[# of node groups] = [# of data nodes] / NoOfReplicas
因此,具有4个数据节点的NDB群集具有4个节点组(如果NoOfReplicas
在config.ini
文件,2节点组(如果)NoOfReplicas
设置为2,当NoOfReplicas
设置为4.在本节后面讨论片段副本;有关的更多信息NoOfReplicas
, 看第21.3.3.6节,“定义NDB集群数据节点”。
NDB集群中的所有节点组必须具有相同数量的数据节点。
您可以在线向运行中的NDB集群添加新的节点组(以及新的数据节点);看到第21.5.7节,“在线添加NDB集群数据节点”, 想要查询更多的信息。
分区。这是集群存储的数据的一部分。每个节点负责保持分配给它的任何分区的至少一个副本(即至少一个片段副本)对集群可用。
NDB Cluster默认使用的分区数量取决于数据节点的数量和数据节点使用的LDM线程的数量,如下所示:
[分区#] = [数据节点的##############################
当使用数据节点运行时ndbmtd, LDM线程的数量由设置控制maxnofexecutionthreads.
。使用时NDBD.有一个LDM线程,这意味着有与参与集群的节点一样多的集群分区。在使用时也是如此ndbmtd和maxnofexecutionthreads.
设置为3或更少。(你应该知道LDM线程的数量随这个参数的值而增加,但不是以严格的线性方式,并且在设置它时存在额外的约束;请参阅描述maxnofexecutionthreads.
为更多的信息。)
NDB和用户定义分区。NDB群集通常是分区ndbcluster.
自动表。然而,也可以使用用户定义的分区ndbcluster.
表。这受以下限制:
只有
关键
和线性关键
在生产环境中支持分区方案NDB
表。可以为任何分区显式定义的最大分区数
NDB
表是8 * [
,如先前在本节中所讨论的那样确定NDB集群中的节点组的数量。跑步时NDBD.对于数据节点进程,设置LDM线程的数量没有效果(自从LDM线程数
] * [节点组数
]ThreadConfig
仅适用于ndbmtd);在这种情况下,为了执行该计算,可以将该值视为等于1。看第21.4.3节,“ndbmtd - NDB集群数据节点守护进程(多线程)”, 想要查询更多的信息。
有关NDB集群和用户定义分区的更多信息,请参阅第21.1.7节,“NDB集群的已知限制”,第22.6.2节,“与存储引擎相关的分区限制”。
片段复制。这是群集分区的副本。节点组中的每个节点存储片段副本。有时也称为一个分区副本。片段副本的数量等于每个节点组的节点数。
片段副本完全属于单个节点;节点可以(通常是)存储多个片段副本。
下图展示了一个运行着4个数据节点的NDB集群NDBD.,排列在两个节点的两个节点组中;节点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集群的持续运行是这样的:只要参与群集的每个节点组都有至少一个节点运行,群集都有一个完整的所有数据的副本,并且保持可行。这在下一图中示出。
在此示例中,群集由两个节点组组成,每个节点组由两个数据节点组成。每个数据节点正在运行一个实例NDBD.。节点组0中的至少一个节点和节点组1中的至少一个节点的任意组合足以保持集群“活着“。但是,如果单个节点组中的两个节点都发生故障,那么仅由另一个节点组中的其余两个节点组成的组合是不够的。在这种情况下,集群失去了整个分区,因此不能再提供对所有NDB集群数据的完整访问。
在NDB 7.5.4及更高版本中,单个NDB群集实例支持的最大节点组数为48(Bug#80845,Bug#22996305)。