21.1.2 NDB 群集节点,节点组,副本和分区

本节讨论 NDB 群集分割和复制数据进行存储的方式。

在接下来的几段中讨论了许多对于理解该主题至关重要的概念。

数据节点. ndbdndbmtd进程,用于存储一个或多个副本,即分配给该节点所属的节点组的分区的副本(在本节的后面讨论)。

每个数据节点应位于单独的计算机上。虽然也可以在一台计算机上托管多个数据节点进程,但是通常不建议这样的配置。

当指代ndbdndbmtd进程时,术语“节点”和“数据节点”通常可以互换使用;在此提及的地方,Management 节点(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的更多信息,请参见第 21.3.3.6 节,“定义 NDB 群集数据节点”

Note

NDB 群集中的所有节点组必须具有相同数量的数据节点。

您可以在线将新的节点组(以及因此的新数据节点)在线添加到正在运行的 NDB 群集中。有关更多信息,请参见第 21.5.7 节“在线添加 NDB 群集数据节点”

分区. 这是集群存储的数据的一部分。每个节点负责使分配给它的任何分区的至少一个副本(即至少一个副本)可供群集使用。

NDB 群集默认使用的分区数取决于数据节点数和数据节点使用的 LDM 线程数,如下所示:

[# of partitions] = [# of data nodes] * [# of LDM threads]

使用运行ndbmtd的数据节点时,LDM 线程数由MaxNoOfExecutionThreads的设置控制。使用ndbd时,只有一个 LDM 线程,这意味着与参与集群的节点一样多的集群分区。在将MaxNoOfExecutionThreads设置为 3 或更小时使用ndbmtd时也是如此。 (您应该注意,LDM 线程的数量随此参数的值而增加,但不是严格线性的,并且在设置它时还存在其他约束;有关更多信息,请参见MaxNoOfExecutionThreads的说明。)

NDB 和用户定义的分区. NDB 群集通常自动对NDBCLUSTER个 table 进行分区。但是,也可以对NDBCLUSTERtable 采用用户定义的分区。这受到以下限制:

  • NDBtable 的 Producing 仅支持KEYLINEAR KEY分区方案。

  • 可以为任何NDBtable 明确定义的最大分区数是8 * [number of LDM threads] * [number of node groups],如本节前面所讨论的那样,确定 NDB 群集中节点组的数量。当为数据节点进程运行ndbd时,设置 LDM 线程数无效(因为ThreadConfig仅适用于ndbmtd);在这种情况下,出于执行此计算的目的,可以将该值视为等于 1.

有关更多信息,请参见第 21.4.3 节“ ndbmtd-NDB 群集数据节点守护程序(多线程)”

有关 NDB 群集和用户定义的分区的更多信息,请参见第 21.1.7 节“ NDB 群集的已知限制”第 22.6.2 节“与存储引擎有关的分区限制”

副本. 这是群集分区的副本。节点组中的每个节点都存储一个副本。有时也称为分区副本。副本数等于每个节点组的节点数。

副本完全属于单个节点;一个节点可以(通常确实)存储多个副本。

下图说明了一个 NDB 群集,其中有四个运行ndbd的数据节点,并以两个节点组的形式排列,每个节点组包含两个节点。节点 1 和 2 属于节点组 0,节点 3 和 4 属于节点组 1.

Note

这里仅显示数据节点。尽管正常运行的 NDB 群集需要ndb_mgmd进程进行群集 Management,并且至少有一个 SQL 节点才能访问群集存储的数据,但为清楚起见,这些已从图中省略。

图 21.2 具有两个节点组的 NDB 群集

内容在周围的 Literals 中描述。

群集存储的数据分为四个分区,编号分别为 0、1、2 和 3.每个分区(以多个副本的形式)存储在同一节点组上。分区存储在备用节点组上,如下所示:

  • 分区 0 存储在节点组 0 上;主副本(主副本)存储在节点 1 上,备份副本(分区的备份副本)存储在节点 2 上。

  • 分区 1 存储在另一个节点组(节点组 1)上;该分区的主副本位于节点 3 上,其备份副本位于节点 4 上。

  • 分区 2 存储在节点组 0 上。但是,其两个副本的放置与分区 0 相反。对于分区 2,主副本存储在节点 2 上,备份存储在节点 1 上。

  • 分区 3 存储在节点组 1 上,其两个副本的位置与分区 1 的位置相反。也就是说,其主副本位于节点 4 上,而备份副本位于节点 3 上。

这对于 NDB 群集的 continue 运行意味着什么:只要参与该群集的每个节点组至少有一个正在运行的节点,该群集便拥有所有数据的完整副本并保持生存。下图对此进行了说明。

图 21.3 2x2 NDB 群集所需的节点

内容在周围的 Literals 中描述。

在此示例中,集群由两个节点组组成,每个节点组均由两个数据节点组成。每个数据节点都在运行ndbd的实例。来自节点组 0 的至少一个节点和来自节点组 1 的至少一个节点的任意组合足以保持群集“活动”。但是,如果单个节点组中的两个节点均发生故障,则由另一个节点组中其余两个节点组成的组合是不够的。在这种情况下,群集丢失了整个分区,因此无法再提供对所有 NDB 群集数据的完整访问。

在 NDB 7.5.4 和更高版本中,单个 NDB 群集实例支持的最大节点组数为 48(错误#80845,错误#22996305)。