1 NDB Cluster介绍
NDB Cluster是一种能够在无共享系统中对内存数据库进行集群的技术。无共享架构使系统能够使用非常便宜的硬件,并且对硬件或软件的特定要求最低。
NDB Cluster 的设计目的是不存在任何单点故障。在无共享系统中,每个组件都应该有自己的内存和磁盘,并且不建议或不支持使用网络共享、网络文件系统和 SAN 等共享存储机制。
NDB集群集成了标准的MySQL服务器和一个名为NDB的内存集群存储引擎(它代表“网络数据库”)。NDB指的是特定于存储引擎的设置部分,而“MySQL NDB集群”指的是一个或多个MySQL服务器与NDB存储引擎的组合。
NDB Cluster 由一组称为 “主机”的计算机组成,每个计算机运行一个或多个进程。这些进程称为 节点,可能包括 MySQL 服务器(用于访问 NDB 数据)、数据节点(用于存储数据)、一个或多个管理服务器,以及可能的其他专用数据访问程序。NDB Cluster 中这些组件的关系如下所示:
所有这些程序一起工作形成一个NDB集群。当数据由NDB存储引擎存储时,表(和表数据)存储在数据节点中。这些表可以从集群中的所有其他MySQL服务器(SQL节点)直接访问。因此,在集群中存储数据的工资单应用程序中,如果一个应用程序更新了员工的工资,那么查询该数据的所有其他MySQL服务器都可以立即看到此更改。
尽管 NDB Cluster SQL 节点使用mysqld 服务器守护程序,但它在许多关键方面与 MySQL 8.2 发行版提供的mysqld二进制文件不同,并且两个版本的 mysqld不可互换。
此外,未连接到NDB Cluster的MySQL服务器无法使用NDB存储引擎,也无法访问任何NDB Cluster数据。
NDB Cluster的数据节点中存储的数据可以进行镜像;集群可以处理单个数据节点的故障,除了少数事务因丢失事务状态而中止之外,不会产生其他影响。由于事务应用程序需要处理事务失败,因此这不应成为问题的根源。
各个节点可以停止和重新启动,然后可以重新加入系统(集群)。滚动重新启动(其中所有节点依次重新启动)用于进行配置更改和软件升级。滚动重启也用作在线添加新数据节点过程的一部分。
NDB Cluster节点可以采用不同的传输机制进行节点间通信;大多数实际部署中都使用基于标准 100 Mbps 或更快以太网硬件的 TCP/IP。
2 NDB集群核心概念
NDBCLUSTER (也称为NDB)是一种内存存储引擎,提供高可用性和数据持久性功能。
存储NDBCLUSTER引擎可以配置一系列故障转移和负载平衡选项,但最简单的方法是从集群级别的存储引擎开始。NDB Cluster的NDB存储引擎包含一组完整的数据,仅依赖于集群本身内的其他数据。
NDB Cluster 的“ Cluster ” 部分独立于 MySQL 服务器进行配置。在 NDB Cluster 中,集群的每个部分都被视为一个 节点。
在NDB Cluster 中,节点意味着一个 进程。可以在一台计算机上运行多个节点;对于运行一个或多个集群节点的计算机,我们使用术语“集群主机”。
集群节点共有三种类型,在最小的 NDB Cluster 配置中,至少有三个节点,每种类型之一:
-
管理节点:此类节点的作用是管理NDB Cluster内的其他节点,执行提供配置数据、启动和停止节点以及运行备份等功能。由于此节点类型管理其他节点的配置,因此应先启动此类型的节点,然后再启动任何其他节点。管理节点使用命令ndb_mgmd启动。
-
数据节点:此类节点存储集群数据。数据节点的数量与片段副本的数量乘以片段的数量相同。例如,对于两个片段副本,每个副本有两个片段,您需要四个数据节点。一个分片副本足以存储数据,但不提供冗余;因此,建议有两个(或更多)片段副本以提供冗余,从而提供高可用性。数据节点使用命令ndbd 或 ndbmtd启动。
NDB Cluster 表通常完全存储在内存中而不是磁盘上(这就是我们将 NDB Cluster 称为 内存数据库的原因)。但是,一些 NDB Cluster 数据可以存储在磁盘上 -
SQL节点:这是访问集群数据的节点。在NDB集群中,SQL节点是使用NDBCLUSTER存储引擎的传统MySQL服务器。SQL节点是由
--ndbcluster
和--ndb-connectstring
选项启动的mysqld进程
SQL 节点实际上只是一种特殊类型的 API 节点,它指定访问 NDB Cluster 数据的任何应用程序
期望在生产环境中采用三节点设置是不现实的。这种配置不提供冗余;要受益于 NDB Cluster 的高可用性功能,您必须使用多个数据和 SQL节点。还强烈建议使用多个管理节点。
3NDB Cluster 节点、节点组、片段副本和分区
NDB Cluster 划分和复制数据进行存储的方式。
接下来的几段将讨论对于理解本主题至关重要的一些概念。
数据节点。 ndbd或ndbmtd进程,用于存储一个或多个片段副本,即 分配给节点所属节点组的分区 副本。
每个数据节点应位于单独的计算机上。虽然也可以在一台计算机上托管多个数据节点进程,但通常不建议采用这种配置。
当指代 ndbd或ndbmtd进程时 ,术语“节点”和“数据节点”通常可以互换使用;在提到的地方,管理节点(ndb_mgmd 进程)和SQL节点(mysqld进程)在本讨论中被指定。
节点组。 节点组由一个或多个节点组成,并存储分区或片段副本集。
NDB Cluster 中的节点组数量不可直接配置;它是数据节点数量和片段副本数量(NoOfReplicas 配置参数)的函数,如下所示:
[# of node groups] = [# of data nodes] / NoOfReplicas
因此, config.ini配置文件中具有 4 个数据节点的 NDB Cluster 如果 NoOfReplicas设置为 1 ,则有 4 个节点组;如果设置为 2,则有 2 个节点组; 如果设置为 4,则有 1 个节点组。
NDB Cluster 中的所有节点组必须具有相同数量的数据节点。
您可以在线添加新的节点组(以及新的数据节点)到正在运行的 NDB Cluster
分区。这是集群存储的数据的一部分。每个节点负责为集群保留分配给它的任何分区的至少一个副本(即至少一个片段副本)。
默认情况下,NDB Cluster使用的分区数量取决于数据节点的数量和数据节点使用的LDM线程的数量,如下所示:
[# of partitions] = [# of data nodes] * [# of LDM threads]
当使用运行ndbmtd的数据节点时,LDM线程的数量由MaxNoOfExecutionThreads的设置控制。当使用ndbd时,只有一个LDM线程,这意味着集群分区和参与集群的节点一样多。当使用ndbmtd并将MaxNoOfExecutionThreads设置为3或更少时也是如此。(LDM线程的数量随着该参数的值而增加,但不是严格的线性方式,并且在设置它时存在额外的约束)
NDB 和用户定义的分区。 NDB Cluster 通常 NDBCLUSTER会自动对表进行分区。但是,也可以对NDBCLUSTER表使用用户定义的分区。
分片副本。这是一个集群分区的副本。节点组中的每个节点存储一个分片副本,有时也称为分区副本。分片副本的数量等于每个节点组的节点数量。
分片副本完全属于单个节点;一个节点可以(通常也确实)存储多个片段副本。
下图展示了一个NDB集群,其中四个数据节点运行ndbd,被安排在两个节点组中,每个节点组中有两个节点;节点1和节点2属于节点组0,节点3和节点4属于节点组1。
集群存储的数据分为四个分区,编号为0、1、2和3。每个分区都以多个副本的形式存储在同一节点组上。分区存储在备用节点组上,如下所示:
-
分区0存储在节点组0上;主分片副本( 主副本)存储在节点 1 上, 备份分片副本 (分区的备份副本)存储在节点 2 上。
-
分区1存储在另一个节点组(节点组1)上;该分区的主碎片副本位于节点 3 上,其备份碎片副本位于节点 4 上。
-
分区 2存储在节点组0上,但其两个分片副本的放置位置与Partition 0相反;对于分区 2,主要碎片副本存储在节点 2 上,备份存储在节点 1 上。
-
分区 3 存储在节点组 1 上,其两个分片副本的位置与分区 1 的位置相反。即,其主分片副本位于节点 4 上,备份位于节点 3 上。
对于 NDB Cluster 的持续运行来说,这意味着:只要参与集群的每个节点组至少有一个节点在运行,集群就拥有所有数据的完整副本并保持可用。下图对此进行了说明。
集群由两个节点组组成,每个节点组由两个数据节点组成。每个数据节点都运行一个ndbd实例。节点组 0 中的至少一个节点和节点组 1 中的至少一个节点的任意组合足以保持集群“活动”。但是,如果单个节点组中的两个节点都发生故障,则由另一个节点组中的剩余两个节点组成的组合是不够的。在这种情况下,集群丢失了整个分区,因此无法再提供对所有 NDB Cluster 数据的完整集的访问。
单个 NDB Cluster 实例支持的最大节点组数为 48。