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