21.1.1 NDB 群集核心概念

NDBCLUSTER(也称为NDB)是一种内存存储引擎,提供高可用性和数据持久性功能。

NDBCLUSTER存储引擎可以配置有一系列故障转移和负载平衡选项,但是最容易从集群级别的存储引擎开始。 NDB 群集的NDB存储引擎包含一组完整的数据,仅依赖于群集本身内的其他数据。

NDB 群集的“群集”部分的配置独立于 MySQL 服务器。在 NDB 群集中,群集的每个部分都被视为一个节点。

Note

在许多情况下,术语“节点”用于 table 示计算机,但是在讨论 NDB 群集时,它 table 示* process *。可以在一台计算机上运行多个节点。对于运行一个或多个群集节点的计算机,我们使用术语群集主机。

共有三种类型的群集节点,并且在最小的 NDB 群集配置中,将至少有三个节点,这些类型之一:

NDB 群集 table 通常完全存储在内存中,而不是磁盘上(这就是为什么我们将 NDB 群集称为内存数据库)。但是,某些 NDB 群集数据可以存储在磁盘上。有关更多信息,请参见第 21.5.10 节“ NDB 群集磁盘数据 table”

  • SQL 节点:这是访问群集数据的节点。对于 NDB 群集,SQL 节点是使用NDBCLUSTER存储引擎的传统 MySQL 服务器。 SQL 节点是一个以--ndbcluster--ndb-connectstring选项开头的mysqld进程,本章其他地方对此进行了说明,并可能还带有其他 MySQL 服务器选项。

SQL 节点实际上只是 API 节点的一种特殊类型,它指定访问 NDB 群集数据的任何应用程序。 API 节点的另一个示例是ndb_restoreUtil,该 Util 用于还原群集备份。可以使用 NDB API 编写此类应用程序。有关 NDB API 的基本信息,请参见NDB API 入门

Important

期望在生产环境中采用三节点设置是不现实的。这样的配置没有冗余。要利用 NDB Cluster 的高可用性功能,必须使用多个数据和 SQL 节点。强烈建议使用多个 Management 节点。

有关 NDB 群集中节点,节点组,副本和分区之间的关系的简要介绍,请参见第 21.1.2 节“ NDB 群集节点,节点组,副本和分区”

群集的配置涉及配置群集中的每个单独节点以及在节点之间构建单独的通信链接。当前,NDB Cluster 的设计目的是使数据节点在处理器能力,内存空间和带宽方面是同质的。另外,为了提供单点配置,整个集群的所有配置数据都位于一个配置文件中。

Management 服务器 Management 集群配置文件和集群日志。群集中的每个节点都从 Management 服务器检索配置数据,因此需要一种确定 Management 服务器所在位置的方法。当数据节点中发生有趣的事件时,节点会将有关这些事件的信息传输到 Management 服务器,然后 Management 服务器将信息写入群集日志。

此外,可以有任意数量的群集 Client 端进程或应用程序。这些包括标准的 MySQLClient 端,特定于NDB的 API 程序和 ManagementClient 端。这些将在接下来的几段中进行描述。

标准的 MySQLClient 端. NDB 群集可以与以 PHP,Perl,C,C,Java,Python,Ruby 等编写的现有 MySQL 应用程序一起使用。这样的 Client 端应用程序向充当 NDB 群集 SQL 节点的 MySQL 服务器发送 SQL 语句并从中接收响应,与它们与独立 MySQL 服务器进行交互的方式几乎相同。

可以修改将 NDB 群集用作数据源的 MySQLClient 端,以利用与多个 MySQL 服务器连接的能力来实现负载平衡和故障转移。例如,使用 Connector/J 5.0.6 和更高版本的 JavaClient 端可以使用jdbc:mysql:loadbalance:// URL(在 Connector/J 5.1.7 中进行了改进)来透明地实现负载平衡;有关将 Connector/J 与 NDB 群集一起使用的更多信息,请参见在 NDB 群集中使用 Connector/J

NDBClient 端程序. 可以编写 Client 端程序,使用 NDB API(高级 C API)直接从NDBCLUSTER存储引擎访问 NDB 群集数据,绕过任何可能连接到群集的 MySQL 服务器。对于不需要数据的 SQL 接口的特殊用途,此类应用程序可能有用。有关更多信息,请参见NDB API

还可使用 NDB Cluster Connector for Java 为 NDB Cluster 编写NDB特定的 Java 应用程序。这个 NDB 集群连接器包括 ClusterJ,这是一个高级数据库 API,类似于直接连接到NDBCLUSTER的对象关系 Map 持久性框架(例如 Hibernate 和 JPA),因此不需要访问 MySQL Server。有关更多信息,请参见Java 和 NDB 集群ClusterJ API 和数据对象模型

NDB Cluster 还支持使用 Node.js 用 JavaScript 编写的应用程序。用于 JavaScript 的 MySQL 连接器包括用于直接访问NDB存储引擎和 MySQL 服务器的适配器。使用此连接器的应用程序通常是事件驱动的,并且使用域对象模型,该域对象模型在许多方面与 ClusterJ 所采用的模型类似。有关更多信息,请参见适用于 JavaScript 的 MySQL NoSQL 连接器

用于 NDB 群集的 Memcache API,已实现为适用于 memcached 1.6 版和更高版本的可加载 ndbmemcache 存储引擎,可用于提供持久性 NDB Cluster 数据存储,可使用 memcache 协议进行访问。

NDB Cluster 7.5 发行版中包含标准的 memcached 缓存引擎。每个 memcached 服务器都可以直接访问存储在 NDB 群集中的数据,但是还可以在本地缓存数据并处理来自此本地缓存的(某些)请求。

有关更多信息,请参见ndbmemcache-NDB 群集的 Memcache API

ManagementClient 端. 这些 Client 端连接到 Management 服务器,并提供用于正常启动和停止节点,启动和停止消息跟踪(仅调试版本),显示节点版本和状态,启动和停止备份等命令。此类程序的一个示例是 NDB Cluster 随附的ndb_mgmManagementClient 端(请参阅第 21.4.5 节“ ndb_mgm — NDB 群集 ManagementClient 端”)。可以使用 MGM API(一种与一种或多种 NDB Cluster Management Server 直接通信的 C 语言 API)编写此类应用程序。有关更多信息,请参见MGM API

Oracle 还提供了 MySQL Cluster Manager,它提供了高级命令行界面,简化了许多复杂的 NDB ClusterManagement 任务,例如重新启动具有大量节点的 NDB Cluster。 MySQL Cluster ManagerClient 端还支持用于获取和设置大多数节点配置参数以及与 NDB Cluster 有关的mysqld服务器选项和变量的命令。有关更多信息,请参见MySQL™Cluster Manager 1.4.8 用户手册

事件日志. NDB 群集按类别(启动,关闭,错误,检查点等),优先级和严重性来记录事件。可以在第 21.5.3 节“ NDB 群集中生成的事件报告”中找到所有可报告事件的完整列 table。事件日志是此处列出的两种类型:

  • 群集日志:记录整个群集所需的所有可报告事件。

  • 节点日志:一个单独的日志,也为每个单独的节点保留。

Note

在正常情况下,仅保留和检查集群日志是必要且充分的。仅出于应用程序开发和调试目的,才需要查阅节点日志。

检查点. 一般而言,将数据保存到磁盘时,可以说已到达检查点。对于 NDB 群集更特定,检查点是所有提交的事务存储在磁盘上的时间点。关于NDB存储引擎,有两种类型的检查点可以协同工作,以确保维护群集数据的一致视图。这些显示在以下列 table 中:

  • 本地检查点(LCP):这是特定于单个节点的检查点。但是,对于群集中的所有节点,LCP 或多或少同时发生。 LCP 通常每隔几分钟发生一次。精确的时间间隔会有所不同,并且取决于节点存储的数据量,集群活动的级别以及其他因素。

在 NDB 7.6.4 之前,LCP 涉及将节点的所有数据保存到磁盘。 NDB 7.6.4 引入了对部分 LCP 的支持,这可以在某些情况下显着缩短恢复时间。有关更多信息,请参见第 21.1.4.2 节,“ NDB Cluster 7.6 的新增功能”,以及对EnablePartialLcpRecoveryWork配置参数的描述,这些参数启用部分 LCP 并控制它们使用的存储量。

  • 全局检查点(GCP):当所有节点的事务同步并且重做日志刷新到磁盘时,每隔几秒钟就会发生 GCP。

有关由本地检查点和全局检查点创建的文件和目录的更多信息,请参见NDB 群集数据节点文件系统目录