NDBCLUSTER
(也称为 NDB
)是一种内存存储引擎,提供高可用性和数据持久性功能。
NDBCLUSTER
存储引擎可以配置一系列故障转移和负载均衡选项,但最简单的起点是在集群级别使用该存储引擎。NDB 集群的 NDB
存储引擎包含一组完整的数据,仅依赖于集群本身内的其他数据。
NDB 集群的““集群””部分的配置独立于 MySQL 服务器。在 NDB 集群中,集群的每个部分都被视为一个 节点。
在许多情况下,““节点””一词用于表示计算机,但在讨论 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 节点是使用
NDBCLUSTER
存储引擎的传统 MySQL 服务器。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
特定的 API 程序和管理客户端。接下来的几段将对这些内容进行描述。
标准 MySQL 客户端。 NDB 集群可以与用 PHP、Perl、C、C++、Java、Python 等编写的现有 MySQL 应用程序一起使用。此类客户端应用程序以与它们与独立 MySQL 服务器交互的方式大致相同的方式向充当 NDB 集群 SQL 节点的 MySQL 服务器发送 SQL 语句并接收响应。
可以使用 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 客户端程序。 可以编写客户端程序,使用 NDB API(一种高级 C++ API)直接从 NDBCLUSTER
存储引擎访问 NDB 集群数据,绕过可能连接到集群的任何 MySQL 服务器。此类应用程序可能适用于不需要数据的 SQL 接口的特殊目的。有关更多信息,请参见 NDB API。
还可以使用 NDB 集群 Java 连接器 为 NDB 集群编写 NDB
特定的 Java 应用程序。此 NDB 集群连接器包括 ClusterJ,这是一种类似于 Hibernate 和 JPA 等对象关系映射持久性框架的高级数据库 API,可以直接连接到 NDBCLUSTER
,因此不需要访问 MySQL 服务器。有关更多信息,请参见 Java 和 NDB 集群,以及 ClusterJ API 和数据对象模型。
NDB 集群对使用 Node.js 编写的 JavaScript 应用程序的支持已弃用,但在 NDB 9.0 中仍然受支持。有关更多信息,请参见 适用于 JavaScript 的 MySQL NoSQL 连接器。
管理客户端。 这些客户端连接到管理服务器,并提供用于正常启动和停止节点、启动和停止消息跟踪(仅限调试版本)、显示节点版本和状态、启动和停止备份等的命令。此类程序的一个示例是 NDB 集群提供的 ndb_mgm 管理客户端(请参见 第 25.5.5 节“ndb_mgm — NDB 集群管理客户端”)。可以使用 MGM API(一种直接与一个或多个 NDB 集群管理服务器通信的 C 语言 API)编写此类应用程序。有关更多信息,请参见 MGM API。
Oracle 还提供 MySQL 集群管理器,它提供了一个高级命令行界面,简化了许多复杂的 NDB 集群管理任务,例如重启具有大量节点的 NDB 集群。MySQL 集群管理器客户端还支持用于获取和设置大多数节点配置参数的值以及与 NDB 集群相关的 mysqld 服务器选项和变量的命令。有关更多信息,请参见 MySQL 集群管理器 9.0.0 用户手册。
事件日志。 NDB 集群按类别(启动、关闭、错误、检查点等)、优先级和严重性记录事件。有关所有可报告事件的完整列表,请参见 第 25.6.3 节“NDB 集群中生成的事件报告”。事件日志有以下两种类型
集群日志:记录整个集群的所有所需可报告事件。
节点日志:还为每个节点保留一个单独的日志。
在正常情况下,仅保留和检查集群日志是必要且充分的。节点日志仅需要在应用程序开发和调试目的下进行查阅。
检查点。 一般来说,当数据保存到磁盘时,就表示已达到 检查点。更具体地说,对于 NDB 集群,检查点是指所有已提交的事务都存储在磁盘上的时间点。对于 NDB
存储引擎,有两种类型的检查点协同工作,以确保维护集群数据的一致视图。这些如下所示
本地检查点 (LCP):这是特定于单个节点的检查点;但是,集群中的所有节点都会或多或少地同时进行 LCP。LCP 通常每隔几分钟发生一次;确切的间隔会有所不同,具体取决于节点存储的数据量、集群活动级别和其他因素。
NDB 9.0 支持部分 LCP,这可以在某些条件下显著提高性能。请参阅
EnablePartialLcp
和RecoveryWork
配置参数的说明,这些参数用于启用部分 LCP 并控制它们使用的存储空间量。全局检查点 (GCP):GCP 每隔几秒发生一次,此时所有节点的事务都已同步,并且重做日志已刷新到磁盘。
有关本地检查点和全局检查点创建的文件和目录的更多信息,请参阅 NDB 集群数据节点文件系统目录。
传输器。我们将术语 传输器 用于数据节点之间使用的数据传输机制。MySQL NDB 集群 9.0 支持其中三种,如下所示
以太网上的 TCP/IP。请参阅 第 25.4.3.10 节“NDB 集群 TCP/IP 连接”。
直接 TCP/IP。使用机器到机器的连接。请参阅 第 25.4.3.11 节“NDB 集群 TCP/IP 连接使用直接连接”。
尽管此传输器使用与前一项中提到的相同的 TCP/IP 协议,但它需要以不同的方式设置硬件,并且配置方式也不同。因此,它被认为是 NDB 集群的单独传输机制。
共享内存 (SHM)。请参阅 第 25.4.3.12 节“NDB 集群共享内存连接”。
因为无处不在,所以大多数用户对 NDB 集群使用以太网上的 TCP/IP。
无论使用哪种传输器,NDB
都会尝试确保使用尽可能大的块来执行数据节点进程之间的通信,因为这有利于所有类型的数据传输。