NDBCLUSTER
(也称为 NDB
)是一个内存存储引擎,提供高可用性和数据持久性功能。
可以将 NDBCLUSTER
存储引擎配置为各种故障转移和负载均衡选项,但最简单的方法是从集群级别的存储引擎开始。NDB 集群的 NDB
存储引擎包含完整的数据集,只依赖于集群内部的其他数据。
NDB 集群的“集群”部分独立于 MySQL 服务器配置。在 NDB 集群中,每个集群部分被认为是一个 节点。
在许多上下文中,术语““节点””用于指代计算机,但是在讨论 NDB 集群时,它指的是一个 进程。可以在单个计算机上运行多个节点;对于运行一个或多个集群节点的计算机,我们使用术语 集群主机。
有三种类型的集群节点,在最小的 NDB 集群配置中至少有三个节点,每种类型一个:
-
管理节点:该类型节点的角色是管理集群中的其他节点,执行诸如提供配置数据、启动和停止节点、运行备份等功能。由于该节点类型管理其他节点的配置,因此应该首先启动该节点,然后再启动其他节点。管理节点使用命令 ndb_mgmd 启动。
-
数据节点:该类型节点存储集群数据。有多少个数据节点取决于碎片副本的数量和碎片的数量(见 第 25.2.2 节,“NDB 集群节点、节点组、碎片副本和分区”)。例如,具有两个碎片副本,每个碎片副本有两个碎片,则需要四个数据节点。一个碎片副本足以存储数据,但不提供冗余性;因此,建议至少有两个(或更多)碎片副本以提供高可用性。数据节点使用命令 ndbd(见 第 25.5.1 节,“ndbd — NDB 集群数据节点守护进程”)或 ndbmtd(见 第 25.5.3 节,“ndbmtd — NDB 集群数据节点守护进程(多线程)”)启动。
NDB 集群表通常完全存储在内存中,而不是在磁盘上(这就是我们将 NDB 集群称为 内存 数据库的原因)。然而,一些 NDB 集群数据可以存储在磁盘上;见 第 25.6.11 节,“NDB 集群磁盘数据表”,以获取更多信息。
-
SQL 节点:这是一个访问集群数据的节点。在 NDB 集群的情况下,SQL 节点是一个传统的 MySQL 服务器,它使用
NDBCLUSTER
存储引擎。SQL 节点是一个 mysqld 进程,使用--ndbcluster
和--ndb-connectstring
选项启动,可能还需要其他 MySQL 服务器选项。SQL 节点实际上只是一个特殊类型的 API 节点,它指定了任何访问 NDB 集群数据的应用程序。另一个 API 节点示例是 ndb_restore 实用程序,该实用程序用于恢复集群备份。可以使用 NDB API 编写这样的应用程序。有关 NDB API 的基本信息,请参阅 使用 NDB API 入门。
在生产环境中使用三个节点设置是不现实的。这种配置不提供冗余性;要从 NDB 集群的高可用性功能中受益,您必须使用多个数据和 SQL 节点。同时,使用多个管理节点也是非常推荐的。
有关 NDB 集群中的节点、节点组、碎片副本和分区之间的关系的简要介绍,请参阅 第 25.2.2 节,“NDB 集群节点、节点组、碎片副本和分区”。
集群配置涉及到每个单独节点的配置和设置节点之间的单独通信链接。NDB 集群当前的设计意图是,使数据节点在处理器功率、内存空间和带宽方面是同质的。此外,为提供单点配置,整个集群的配置数据都位于一个配置文件中。
管理服务器管理集群配置文件和集群日志。每个节点在集群中都从管理服务器检索配置数据,因此需要一种方法来确定管理服务器的位置。当数据节点中发生有趣的事件时,节点将事件信息传输到管理服务器,然后管理服务器将信息写入集群日志。
此外,还可以有任意数量的集群客户端进程或应用程序。这些包括标准 MySQL 客户端、NDB
-specific API 程序和管理客户端。这些将在下面几段中描述。
标准 MySQL 客户端。 NDB 集群可以与使用 PHP、Perl、C、C++、Java、Python 等语言编写的现有 MySQL 应用程序一起使用。这些客户端应用程序将 SQL 语句发送到并从 MySQL 服务器(作为 NDB 集群 SQL 节点)接收响应,方式与它们与独立 MySQL 服务器交互相同。
使用 NDB 集群作为数据源的 MySQL 客户端可以修改以利用连接多个 MySQL 服务器以实现负载平衡和故障转移的能力。例如,使用 Connector/J 5.0.6 及更高版本的 Java 客户端可以使用 jdbc:mysql:loadbalance://
URL(在 Connector/J 5.1.7 中改进)以实现透明的负载平衡;有关使用 Connector/J 与 NDB 集群的更多信息,请参阅 使用 Connector/J 与 NDB 集群。
NDB 客户端程序。 客户端程序可以直接从 NDBCLUSTER
存储引擎访问 NDB 集群数据,绕过任何连接到集群的 MySQL 服务器,使用 NDB API,一个高级 C++ API。这样的应用程序可能对特殊目的很有用,例如不需要 SQL 接口的数据。有关更多信息,请参阅 NDB API。
NDB
-specific Java 应用程序也可以使用 NDB 集群 Connector for Java 编写,用于 NDB 集群。该 NDB 集群 Connector 包括 ClusterJ,一个高级数据库 API,类似于对象关系映射持久性框架,如 Hibernate 和 JPA,它直接连接到 NDBCLUSTER
,因此不需要访问 MySQL 服务器。请参阅 Java 和 NDB 集群,和 ClusterJ API 和数据对象模型,以获取更多信息。
NDB 集群还支持使用 Node.js 编写的 JavaScript 应用程序。MySQL Connector for JavaScript 包括对 NDB
存储引擎的直接访问适配器,以及对 MySQL 服务器的适配器。使用该 Connector 的应用程序通常是事件驱动的,并使用一个域对象模型,类似于 ClusterJ 所使用的模型。有关更多信息,请参阅 MySQL NoSQL Connector for JavaScript。
管理客户端。 这些客户端连接到管理服务器,并提供命令以启动和停止节点,启动和停止消息跟踪(调试版本仅),显示节点版本和状态,启动和停止备份等。例如,NDB 集群管理客户端 ndb_mgm(见 第 25.5.5 节,“ndb_mgm — NDB 集群管理客户端”)。这些应用程序可以使用 MGM API 编写,该 API 是一种 C 语言 API,直接与一个或多个 NDB 集群管理服务器通信。有关更多信息,请参阅 MGM API。
Oracle 还提供了 MySQL 集群管理器,该工具提供了一个高级命令行界面,简化了许多复杂的 NDB 集群管理任务,例如重新启动具有大量节点的 NDB 集群。MySQL 集群管理器客户端还支持获取和设置大多数节点配置参数的值,以及 mysqld 服务器选项和变量相关的 NDB 集群。请参阅 MySQL 集群管理器 8.3.0 用户手册,以获取更多信息。
事件日志。 NDB 集群根据类别(启动、关闭、错误、检查点等)、优先级和严重性记录事件。所有可报告事件的完整列表可以在 第 25.6.3 节,“NDB 集群生成的事件报告” 中找到。事件日志有两种类型:
-
集群日志:记录集群整体的所有所需报告事件。
-
节点日志:每个单独节点的单独日志。
在正常情况下,只需要保留和检查集群日志。节点日志仅在应用程序开发和调试目的下需要检查。
检查点。 一般来说,当数据保存到磁盘时,我们说达到了检查点。对于 NDB 集群,检查点是指所有提交的事务被存储到磁盘的时间点。对于 NDB
存储引擎,有两种类型的检查点,它们共同维护集群数据的一致性视图。这些检查点如下所示:
-
本地检查点 (LCP):这是一个特定于单个节点的检查点;然而,LCP 在所有节点上几乎同时发生。LCP 通常每隔几分钟发生一次,具体间隔取决于节点存储的数据量、集群活动水平和其他因素。
NDB 8.3 支持部分 LCP,这可以在某些情况下显著改善性能。请参阅
EnablePartialLcp
和RecoveryWork
配置参数的描述,它们启用部分 LCP 并控制其使用的存储量。 -
全局检查点 (GCP):GCP 每隔几秒钟发生一次,当所有节点的事务被同步并 redo-log 被刷新到磁盘时。
有关本地检查点和全局检查点创建的文件和目录的更多信息,请参阅 NDB 集群数据节点文件系统目录。
传输器。 我们使用术语 传输器 来描述 NDB 集群之间的数据传输机制。MySQL NDB 集群 8.3 支持以下三种传输器:
-
TCP/IP over Ethernet。请参阅 第 25.4.3.10 节,“NDB 集群 TCP/IP 连接”。
-
Direct TCP/IP。使用机器到机器连接。请参阅 第 25.4.3.11 节,“NDB 集群 TCP/IP 连接使用 Direct 连接”。
尽管这两种传输器使用相同的 TCP/IP 协议,但它们需要不同的硬件设置和配置,因此被认为是 NDB 集群的独立传输机制。
-
共享内存(SHM)。见 第 25.4.3.12 节,“NDB 集群共享内存连接”。
由于它无处不在,大多数用户使用以太网上的 TCP/IP 进行 NDB 集群。
无论使用什么传输器,NDB
都尝试确保数据节点进程之间的通信使用尽可能大的块,因为这对所有类型的数据传输都是有益的。