Documentation Home
MySQL 8.0 参考手册  / 第 23 章 MySQL NDB Cluster 8.0  / 23.2 NDB Cluster 概述  /  21.2.2 NDB Cluster 节点、节点组、片段副本和分区

21.2.2 NDB Cluster 节点、节点组、片段副本和分区

本节讨论 NDB Cluster 划分和复制数据以进行存储的方式。

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

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

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

在提到 ndbdndbmtd进程时 ,术语节点数据节点”通常可以互换使用;在提到的地方,管理节点(ndb_mgmd 进程)和 SQL 节点(mysqld进程)在本讨论中指定为这样。

节点组。  节点组由一个或多个节点组成,并存储分区或片段副本集(请参阅下一项)。

NDB Cluster 中节点组的数量不能直接配置;它是数据节点数量和片段副本数量(NoOfReplicas 配置参数)的函数,如下所示:

[# of node groups] = [# of data nodes] / NoOfReplicas

因此,具有 4 个数据节点的 NDB Cluster 如果 在文件 NoOfReplicas中设置为 1,则有 4 个节点组,如果设置为 2,则有 2 个节点组,如果设置为 4,则有 1 个节点组 。片段副本将在本节后面讨论;有关更多信息 ,请参阅 第 21.4.3.6 节,“定义 NDB Cluster 数据节点”config.iniNoOfReplicasNoOfReplicasNoOfReplicas

笔记

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

您可以在线添加新的节点组(以及新的数据节点)到正在运行的 NDB Cluster;有关更多信息,请参阅 第 21.6.7 节,“在线添加 NDB Cluster 数据节点”

分割。  这是集群存储的一部分数据。每个节点负责保持分配给它的任何分区的至少一个副本(即至少一个片段副本)对集群可用。

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

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

使用运行ndbmtd的数据节点时,LDM 线程的数量由 的设置控制 MaxNoOfExecutionThreads。使用ndbd时,只有一个 LDM 线程,这意味着集群分区与参与集群的节点一样多。使用 设置为 3 或更少的ndbmtd时也是如此 。MaxNoOfExecutionThreads(您应该知道,LDM 线程的数量会随着该参数的值而增加,但不是以严格的线性方式增加,并且在设置它时还有其他限制; MaxNoOfExecutionThreads 有关详细信息,请参阅 的描述。)

NDB 和用户定义的分区。  NDB Cluster 通常会自动对表进行分区 NDBCLUSTER。但是,也可以对NDBCLUSTER表使用用户定义的分区。这受到以下限制:

  1. 在表的生产中仅支持KEYLINEAR KEY分区方案NDB

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

    有关更多信息,请参阅第 21.5.3 节,“ndbmtd — NDB Cluster 数据节点守护进程(多线程)”

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

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

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

下图说明了一个 NDB Cluster,它有四个运行ndbd的数据节点,排列在两个节点组中,每个节点有两个节点;节点1和2属于节点组0,节点3和4属于节点组1。

笔记

此处仅显示数据节点;尽管工作的 NDB Cluster 需要一个用于集群管理的ndb_mgmd进程和至少一个 SQL 节点来访问集群存储的数据,但为了清楚起见,图中省略了这些。

图 21.2 具有两个节点组的 NDB Cluster

内容在周围的文字中描述。

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

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

  • Partition 1存放在其他节点组(node group 1)上;这个分区的主分片副本在节点 3 上,它的备份分片副本在节点 4 上。

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

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

这对于 NDB Cluster 的持续运行意味着:只要参与集群的每个节点组都有至少一个节点在运行,集群就会拥有所有数据的完整副本并保持活力。下图说明了这一点。

图 21.3 2x2 NDB Cluster 所需的节点

内容在周围的文字中描述。

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

在 NDB 7.5.4 及更高版本中,单个 NDB Cluster 实例支持的最大节点组数为 48(Bug#80845,Bug#22996305)。