本节讨论 NDB 集群如何将数据分区和复制以便存储。
以下几段讨论了几个关键概念,以便理解这个主题。
数据节点。 一个 ndbd 或 ndbmtd 进程,它存储一个或多个 碎片副本 —— 也就是分配给该节点组的 分区 的副本(在本节后面讨论)。
每个数据节点应该位于单独的计算机上。虽然也可以在单个计算机上托管多个数据节点进程,但这种配置通常不被推荐。
术语 "节点" 和 "数据节点" 通常可以互换使用,指的是 ndbd 或 ndbmtd 进程;在本讨论中,如果提到管理节点(ndb_mgmd 进程)和 SQL 节点(mysqld 进程),将明确指定。
节点组。 一个节点组由一个或多个节点组成,存储分区或碎片副本集(见下一项)。
NDB 集群中的节点组数量不能直接配置;它是数据节点数量和碎片副本数量(NoOfReplicas
配置参数)的函数,如下所示:
[# of node groups] = [# of data nodes] / NoOfReplicas
因此,具有 4 个数据节点的 NDB 集群如果在 config.ini
文件中将 NoOfReplicas
设置为 1,将有 4 个节点组;如果将其设置为 2,将有 2 个节点组;如果将其设置为 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数据节点进程时,设置线程数对 LDM 线程数没有影响(因为线程数
] * [节点组数
]ThreadConfig
仅适用于ndbmtd); 在这种情况下,可以将该值视为 1,以便进行计算。请参阅第 25.5.3 节,“ndbmtd — NDB 集群数据节点守护进程(多线程)”,以获取更多信息。
有关 NDB 集群和用户定义分区的更多信息,请参阅第 25.2.7 节,“NDB 集群的已知限制”和第 26.6.2 节,“存储引擎相关的分区限制”。
碎片副本。 这是集群分区的副本。每个节点组中的每个节点都存储一个碎片副本。也称为分区副本。碎片副本的数量等于每个节点组中的节点数量。
碎片副本完全属于单个节点;一个节点可以(通常)存储多个碎片副本。
以下图表显示了一个 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 集群实例支持的最大节点组数为 48。