Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  MySQL 8.4 Frequently Asked Questions  /  MySQL 8.4 FAQ: NDB Cluster

A.10 MySQL 8.4 常见问题解答:NDB 集群

在以下部分,我们回答了关于 MySQL NDB 集群和 NDB 存储引擎的常见问题。

A.10.1. 哪些版本的 MySQL 软件支持 NDB 集群?我是否需要从源代码编译?
A.10.2. “NDB” 和 “NDBCLUSTER” 是什么意思?
A.10.3. 使用 NDB 集群与使用 MySQL 复制有什么区别?
A.10.4. 我是否需要特殊的网络来运行 NDB 集群?集群中的计算机如何通信?
A.10.5. 我需要多少台计算机来运行 NDB 集群,为什么?
A.10.6. NDB 集群中的不同计算机有什么作用?
A.10.7. 当我在 NDB 集群管理客户端中运行 SHOW 命令时,我看到一行输出,看起来像这样:
A.10.8. 我可以使用哪些操作系统来使用 NDB 集群?
A.10.9. 运行 NDB 集群需要什么硬件要求?
A.10.10. 我需要多少 RAM 来使用 NDB 集群?是否可以使用磁盘内存?
A.10.11. 我可以使用哪些文件系统与 NDB 集群?关于网络文件系统或网络共享呢?
A.10.12. 我可以在虚拟机(例如 VMware、VirtualBox、Parallels 或 Xen 创建的虚拟机)中运行 NDB 集群节点吗?
A.10.13. 我正在尝试填充 NDB 集群数据库。加载过程提前终止,我收到类似这样的错误消息:
A.10.14. NDB 集群使用 TCP/IP。这是否意味着我可以在互联网上运行它,具有一个或多个远程位置的节点?
A.10.15. 我是否需要学习新的编程或查询语言来使用 NDB 集群?
A.10.16. NDB 集群支持哪些编程语言和 API?
A.10.17. NDB 集群是否包括任何管理工具?
A.10.18. 我如何找到 NDB 集群中的错误或警告消息的含义?
A.10.19. NDB 集群是否事务安全?支持哪些隔离级别?
A.10.20. NDB 集群支持哪些存储引擎?
A.10.21. 如果发生灾难性故障——例如,整个城市断电,我的 UPS 失败——我是否会丢失所有数据?
A.10.22. 是否可以使用 FULLTEXT 索引与 NDB 集群?
A.10.23. 我可以在一台计算机上运行多个节点吗?
A.10.24. 我可以在不重新启动的情况下将数据节点添加到 NDB 集群中吗?
A.10.25. 使用 NDB 集群时,我需要注意哪些限制?
A.10.26. NDB 集群是否支持外键?
A.10.27. 我如何将现有的 MySQL 数据库导入 NDB 集群?
A.10.28. NDB 集群节点如何相互通信?
A.10.29. 仲裁器是什么?
A.10.30. NDB 集群支持哪些数据类型?
A.10.31. 我如何启动和停止 NDB 集群?
A.10.32. 当 NDB 集群关闭时,数据会发生什么变化?
A.10.33. 是否建议为 NDB 集群拥有多个管理节点?
A.10.34. 我可以在一个 NDB 集群中混合使用不同的硬件和操作系统吗?
A.10.35. 我可以在一台主机上运行两个数据节点?两个 SQL 节点?
A.10.36. 我可以使用主机名与 NDB 集群吗?
A.10.37. NDB 集群是否支持 IPv6?
A.10.38. 如何在 NDB 集群中处理多个 MySQL 服务器的用户?
A.10.39. 如果一个 SQL 节点失败,我如何继续发送查询?
A.10.40. 如何备份和恢复 NDB 集群?
A.10.41. 什么是“angel 进程”?

A.10.1.

哪些版本的 MySQL 软件支持 NDB 集群?我需要从源代码编译吗?

NDB 集群不支持标准的 MySQL 服务器版本。相反,MySQL NDB 集群作为一个单独的产品提供。可用的 NDB 集群版本系列包括以下:

  • NDB 集群 7.3 / NDB 集群 7.4.  这两个系列不再维护或支持新的部署。使用 NDB 集群 7.3 或 7.4 的用户应该尽快升级到 NDB 7.5 或更高版本。我们建议新的部署使用最新的 NDB 集群 8.0 版本。

  • NDB 集群 7.5.  这个系列是 NDB 集群的前一个通用可用性(GA)版本,仍然可用于生产环境,尽管我们建议新的部署使用最新的 NDB 集群 8.0 版本。最新的 NDB 集群 7.5 版本可以从 https://dev.mysql.com/downloads/cluster/ 获取。

  • NDB 集群 7.6.  这个系列是 NDB 集群的前一个通用可用性(GA)版本,仍然可用于生产环境,尽管我们建议新的部署使用最新的 NDB 集群 8.0 版本。最新的 NDB 集群 7.6 版本可以从 https://dev.mysql.com/downloads/cluster/ 获取。

  • NDB 集群 8.0.  这个系列是最新的通用可用性(GA)版本的 NDB 集群,基于 NDB 存储引擎和 MySQL 服务器 8.0。NDB 集群 8.0 可用于生产环境;新的部署应该使用最新的 GA 版本,在这个系列中,当前是 NDB 集群 8.0.35。你可以从 https://dev.mysql.com/downloads/cluster/ 获取最新的 NDB 集群 8.0 版本。关于这个系列中的新功能和其他重要更改,请参阅 MySQL NDB 集群 8.0 中的新功能

你可以从源代码编译 NDB 集群(见 第 25.3.1.4 节,“在 Linux 上从源代码构建 NDB 集群”第 25.3.2.2 节,“在 Windows 上从源代码编译和安装 NDB 集群”),但对于大多数情况,我们建议使用 Oracle 提供的适合你的操作平台和情况的安装程序:

安装包也可能来自你的平台的包管理系统。

你可以使用以下语句确定你的 MySQL 服务器是否支持 NDBSHOW VARIABLES LIKE 'have_%'SHOW ENGINESSHOW PLUGINS

A.10.2.

什么是 NDBNDBCLUSTER

NDB 代表 网络 数据NDBNDBCLUSTER 都是 MySQL 中支持集群的存储引擎的名称。NDB 是首选,但任何名称都是正确的。

A.10.3.

使用 NDB 集群与使用 MySQL 复制有什么区别?

在传统的 MySQL 复制中,一个源 MySQL 服务器更新一个或多个副本。事务是顺序提交的,一个慢事务可能会导致副本落后于源。如果源失败,可能副本没有记录最后几个事务。如果使用事务安全引擎,如 InnoDB,事务要么在副本上完成,要么不应用,但复制不保证源和副本的数据在任何时候保持一致。在 NDB Cluster 中,所有数据节点保持同步,任何一个数据节点提交的事务对所有数据节点都是提交的。如果数据节点失败,所有剩余的数据节点保持一致状态。

简言之,标准的 MySQL 复制是 异步的,而 NDB Cluster 是 同步的。

NDB Cluster 也支持异步复制。NDB Cluster 复制(有时也称为 地理复制)包括在两个 NDB Cluster 之间和从 NDB Cluster 到非 Cluster MySQL 服务器之间复制的能力。见 第 25.7 节,“NDB Cluster 复制”

A.10.4.

我需要特殊的网络来运行 NDB Cluster 吗?集群中的计算机如何通信?

NDB Cluster旨在高带宽环境中使用,计算机使用 TCP/IP 连接。其性能直接取决于集群中的计算机之间的连接速度。NDB Cluster 的最低连接要求包括典型的 100 兆比特以太网或等效的网络。我们建议您使用 gigabit 以太网,尽可能使用。

A.10.5.

我需要多少台计算机来运行 NDB Cluster,为什么?

至少需要三台计算机来运行可行的集群。然而,NDB Cluster 的最低 推荐计算机数量是四台:一台管理节点和 SQL 节点各一台,两台数据节点。两个数据节点的目的是提供冗余;管理节点必须在单独的机器上运行,以确保在一个数据节点失败时继续仲裁服务。

为了提供更高的吞吐量和高可用性,您应该使用多个 SQL 节点(连接到集群的 MySQL 服务器)。也可以(虽然不是严格必要的)运行多个管理服务器。

A.10.6.

NDB Cluster 中的不同计算机做什么?

NDB Cluster 既有物理组织,也有逻辑组织,计算机是物理元素。集群的逻辑或功能元素称为 节点,集群主机也称为 集群主机。有三种类型的节点,每种对应集群中的特定角色。这些是:

A.10.7.

当我在 NDB 集群管理客户端中运行 SHOW 命令时,我看到一个输出行,看起来像这样:

id=2    @10.100.10.32  (Version: 8.0.35-ndb-8.0.35 Nodegroup: 0, *)

星号(*)是什么意思?这个节点与其他节点有什么不同?

最简单的答案是:这不是您需要控制或担忧的事情,除非您是一名软件工程师,正在编写或分析 NDB 集群源代码”

如果您不满足这个答案,这里有一个更长、更技术性的版本:

NDB 集群中的许多机制需要在数据节点之间进行分布式协调。这些分布式算法和协议包括全局检查点、DDL(模式)更改和节点重新启动处理。为了使协调变得更简单,数据节点“选举”其中一个节点作为领导者。没有用户面向的机制来影响这个选择,这完全是自动的;事实上,这是 NDB 集群内部架构的关键部分。

当一个节点充当领导者时,它通常是活动的协调点,其他节点充当“跟随者”,按照领导者的指令执行活动。如果领导者节点失败,那么剩余的节点将选举一个新的领导者。在进度中的任务可能会失败或由新的领导者继续,具体取决于实际机制。

可能有多个不同的机制和协议选择不同的领导者节点,但通常情况下,同一个领导者节点被选择用于所有这些机制。管理客户端中 SHOW 命令的输出中显示的领导者节点被内部称为 DICT 管理器,负责协调 DDL 和元数据活动。

NDB 集群被设计成这样,领导者的选择对集群外部没有明显的影响。例如,当前领导者节点的 CPU 或资源使用量与其他数据节点没有明显的差异,领导者节点的失败对集群的影响与其他数据节点的失败没有明显的差异。

A.10.8.

我可以在哪些操作系统上使用 NDB 集群?

NDB 集群支持大多数 Unix-like 操作系统。NDB 集群也支持 Microsoft Windows 操作系统的生产环境。

有关 NDB 集群在不同操作系统版本、操作系统发行版和硬件平台上的支持级别的详细信息,请参阅 https://www.mysql.com/support/supportedplatforms/cluster.html

A.10.9.

运行 NDB 集群需要什么硬件要求?

NDB 集群应该在任何平台上运行,其中 NDB-enabled 二进制文件可用。对于数据节点和 API 节点,较快的 CPU 和更多的内存可能会提高性能,64 位 CPU 可能比 32 位处理器更有效。机器上必须有足够的内存来容纳每个节点的数据库份额(请参阅 我需要多少 RAM? 以获取更多信息)。对于仅用于运行 NDB 集群管理服务器的计算机,要求很小;一台普通的桌面 PC(或等效的)通常足以完成这项任务。节点可以通过标准的 TCP/IP 网络和硬件进行通信。它们也可以使用高速 SCI 协议;然而,需要特殊的网络硬件和软件来使用 SCI(请参阅 第 25.4.4 节,“使用 NDB 集群的高速互连”)。

A.10.10.

我需要多少 RAM 来使用 NDB 集群?是否可以使用磁盘内存?

NDB 集群最初是作为内存 only 实现的,但所有当前版本也提供了将 NDB 集群存储在磁盘上的能力。请参阅 第 25.6.11 节,“NDB 集群磁盘数据表”,以获取更多信息。

对于内存 NDB 表,可以使用以下公式来估算每个数据节点在集群中的 RAM 需求:

(SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes

要精确计算内存需求,需要确定每个表在集群数据库中的存储空间需求(请参阅 第 13.7 节,“数据类型存储需求”,以获取详细信息),然后将其乘以行数。您还必须记住为每个列索引分配空间,如下所示:

  • 每个主键或哈希索引创建的 NDBCLUSTER 表需要 21-25 字节的记录空间。这些索引使用 IndexMemory

  • 每个有序索引需要 10 字节的存储空间,每个记录使用 DataMemory

  • 创建主键或唯一索引也创建了一个有序索引,除非该索引是使用 USING HASH 创建的。换言之:

    • Cluster 表上的主键或唯一索引通常需要 31 到 35 字节的记录空间。

    • 然而,如果主键或唯一索引是使用 USING HASH 创建的,那么它只需要 21 到 25 字节的记录空间。

使用 USING HASH 创建所有主键和唯一索引的 NDB 集群表通常使表更新运行得更快——在某些情况下,速度可以提高 20 到 30%。这是因为需要的内存较少(因为没有有序索引被创建),并且需要的 CPU 资源较少(因为需要读取和更新的索引较少)。然而,这也意味着查询可能需要使用其他方式来满足,因为范围扫描不能被使用,这可能会导致选择速度变慢。

在计算集群内存需求时,您可能会发现 ndb_size.pl 实用程序非常有用,该实用程序连接到当前(非集群)MySQL 数据库,并创建一个报告,说明该数据库如果使用 NDBCLUSTER 存储引擎所需的空间。请参阅 第 25.5.29 节,“ndb_size.pl — NDBCLUSTER 大小需求估算器”,以获取更多信息。

请牢记 每个 NDB 集群表必须有一个主键NDB 存储引擎会自动创建一个主键,如果没有定义;该主键是没有 USING HASH 创建的。

您可以使用 REPORT MEMORYUSAGE 命令在 ndb_mgm 客户端中确定 NDB 集群数据和索引的内存使用情况;见 第 25.6.1 节,“NDB 集群管理客户端中的命令”,以获取更多信息。此外,当可用 数据内存 或(在 NDB 7.6 之前)索引内存 的 80% 被使用时,集群日志中将写入警告,接着在使用率达到 90%、99% 和 100% 时也将写入警告。

A.10.11.

我可以使用哪些文件系统与 NDB 集群?关于网络文件系统或网络共享呢?

一般来说,任何本机操作系统的文件系统都应该与 NDB 集群配合良好。如果您发现某个文件系统与 NDB 集群配合特别好(或不太好),我们邀请您在 NDB 集群论坛 中讨论您的发现。

对于 Windows,我们建议使用 NTFS 文件系统与 NDB 集群,正如我们对标准 MySQL 所做的那样。我们不测试 NDB 集群与 FATVFAT 文件系统。因此,我们不建议使用它们与 MySQL 或 NDB 集群。

NDB 集群作为一个共享无thing 解决方案实现;其背后的想法是,单个硬件的故障不应该导致多个集群节点的故障,或者可能导致整个集群的故障。因此,我们不支持使用网络共享或网络文件系统与 NDB 集群。这也适用于共享存储设备,如 SAN。

A.10.12.

我可以在虚拟机(如 VMWare、VirtualBox、Parallels 或 Xen 创建的虚拟机)中运行 NDB 集群节点吗?

NDB 集群支持在虚拟机中使用。我们当前支持和测试使用 Oracle VM

一些 NDB 集群用户已经成功地使用其他虚拟化产品部署 NDB 集群;在这种情况下,Oracle 可以提供 NDB 集群支持,但虚拟环境中的问题必须转交给该产品的供应商。

A.10.13.

我正在尝试填充 NDB 集群数据库。加载过程提前终止,我收到了类似以下的错误消息:

错误 1114: 表 'my_cluster_table' 已满

这是为什么?

很可能是因为您的设置没有为所有表数据和所有索引提供足够的 RAM,包括由 NDB 存储引擎自动创建的主键

还值得注意的是,所有数据节点都应该具有相同的 RAM,因为集群中的任何数据节点都不能使用超过最少可用 RAM 的内存。例如,如果有四台计算机托管集群数据节点,其中三台计算机有 3GB 的 RAM 可用于存储集群数据,而剩下的数据节点只有 1GB 的 RAM,那么每个数据节点最多只能将 1GB 用于 NDB 集群数据和索引。

在某些情况下,即使 ndb_mgm -e "ALL REPORT MEMORYUSAGE" 显示有足够的可用 数据内存,您仍可能在 MySQL 客户端应用程序中遇到 表已满 错误。在这种情况下,您可以使用 MAX_ROWS 选项来强制 NDB 为 NDB 集群表创建额外的分区,从而为哈希索引提供更多的内存。通常,将 MAX_ROWS 设置为预期存储在表中的行数的两倍应该足够。

出于类似的原因,您也可能会在数据节点重启时遇到问题,特别是在节点上加载了大量数据的情况下。 MinFreePct 参数可以帮助解决这个问题,通过保留一部分(默认为 5%)的 数据内存 和(在 NDB 7.6 之前)索引内存 用于重启时使用。这些保留的内存不可用于存储 NDB 表或数据。

A.10.14.

NDB 集群使用 TCP/IP。这是否意味着我可以在 Internet 上运行它,具有一个或多个远程位置的节点?

在这种条件下,集群的性能非常不确定,因为 NDB 集群是设计和实现的,假设它将在具有高速连接性的 LAN 设置中运行,例如使用 100 Mbps 或千兆以太网 - 最好是后者。我们既不测试也不保证其在任何速度较慢的网络中的性能。

此外,非常重要的是要记住,集群节点之间的通信既不加密也不受任何保护机制的保护。集群的最安全配置是在防火墙后的私有网络中,没有直接从外部访问集群数据或管理节点的权限。(对于 SQL 节点,您应该采取与其他 MySQL 服务器实例相同的预防措施。)有关更多信息,请参阅 第 25.6.21 节,“NDB 集群安全问题”

A.10.15.

我是否需要学习新的编程或查询语言来使用 NDB 集群?

。尽管有一些专门的命令用于管理和配置集群本身,但只需要标准的(My)SQL 语句来执行以下操作:

  • 创建、更改和删除表

  • 插入、更新和删除表数据

  • 创建、更改和删除主键和唯一索引

一些专门的配置参数和文件是用于设置 NDB 集群的 - 请参阅 第 25.4.3 节,“NDB 集群配置文件”,以获取有关这些的信息。

一些简单的命令用于 NDB 集群管理客户端(ndb_mgm)以执行任务,例如启动和停止集群节点。请参阅 第 25.6.1 节,“NDB 集群管理客户端命令”

A.10.16.

NDB 集群支持哪些编程语言和 API?

NDB 集群支持标准 MySQL 服务器的相同编程 API 和语言,包括 ODBC、.Net、MySQL C API 以及流行脚本语言的驱动程序,例如 PHP、Perl 和 Python。使用这些 API 编写的 NDB 集群应用程序的行为与其他 MySQL 应用程序相似;它们将 SQL 语句传输到 MySQL 服务器(在 NDB 集群的情况下,是 SQL 节点),并接收包含数据行的响应。有关这些 API 的更多信息,请参阅 第 31 章,《连接器和 API》

NDB 集群还支持使用 NDB API 进行应用程序编程,该 API 提供了一个低级 C++ 接口,用于访问 NDB 集群数据,而不需要通过 MySQL 服务器。请参阅 NDB API。此外,许多 NDBCLUSTER 管理函数通过 C 语言的 MGM API 暴露;请参阅 MGM API,以获取更多信息。

NDB 集群还支持使用 ClusterJ 进行 Java 应用程序编程,该 API 支持使用会话和事务的域对象模型。请参阅 Java 和 NDB 集群,以获取更多信息。

NDB 集群 8.0 也包括支持 NoSQL 应用程序的适配器,使用 Node.js 编写,NDB 集群作为数据存储。请参阅 MySQL NoSQL Connector for JavaScript,以获取更多信息。

A.10.17.

NDB 集群是否包括任何管理工具?

NDB 集群包括一个命令行客户端,用于执行基本管理功能。请参阅 第 25.5.5 节,“ndb_mgm — NDB 集群管理客户端”,和 第 25.6.1 节,“NDB 集群管理客户端中的命令”

NDB 集群还支持 MySQL 集群管理器,一个单独的产品,提供了一个高级命令行界面,可以自动执行许多 NDB 集群管理任务,例如滚动重新启动和配置更改。有关 MySQL 集群管理器的更多信息,请参阅 MySQL 集群管理器 8.4.0 用户手册

A.10.18.

如何在使用 NDB 集群时查找错误或警告消息的含义?

有两种方法可以实现这一点:

  • mysql 客户端中,使用 SHOW ERRORSSHOW WARNINGS,立即在收到错误或警告条件时。

  • 从系统 shell 提示符下,使用 perror --ndb error_code

A.10.19.

NDB 集群是否支持事务?支持哪些隔离级别?

。对于使用 NDB 存储引擎创建的表,事务是支持的。目前,NDB 集群仅支持 READ COMMITTED 事务隔离级别。

A.10.20.

NDB 集群支持哪些存储引擎?

NDB 集群需要 NDB 存储引擎。也就是说,要使表在 NDB 集群的节点之间共享,表必须使用 ENGINE=NDB(或等效选项 ENGINE=NDBCLUSTER)创建。

可以在 MySQL 服务器上使用其他存储引擎(例如 InnoDBMyISAM)创建表,但这些表不使用 NDB,因此它们不参与集群;每个这样的表都是严格局部的 MySQL 服务器实例上创建的。

NDB 集群与 InnoDB 集群在架构、要求和实现方面有很大不同;尽管它们的名称相似,但它们不兼容。有关 InnoDB 集群的更多信息,请参阅 MySQL AdminAPI。另请参阅 第 25.2.6 节,“使用 InnoDB 的 MySQL 服务器与 NDB 集群比较”,以获取 NDBInnoDB 存储引擎之间的差异信息。

A.10.21.

如果发生灾难性故障—例如,整个城市断电 并且 我的 UPS 故障—我会失去所有数据吗?

所有已提交的事务都被记录。因此,虽然灾难可能会导致一些数据丢失,但这应该是非常有限的。数据丢失可以通过最小化每个事务中的操作数量来减少。(在任何情况下都不应该执行大量操作的事务。)

A.10.22.

是否可以使用 FULLTEXT 索引与 NDB 集群?

FULLTEXT 索引目前仅支持 InnoDBMyISAM 存储引擎。请参阅 第 14.9 节,“全文搜索函数”,以获取更多信息。

A.10.23.

是否可以在单个计算机上运行多个节点?

这可能但不总是明智的。其中一个主要原因是运行集群是为了提供冗余性。要获得这种冗余性的全部益处,每个节点应该驻留在单独的机器上。如果您在单个机器上放置多个节点,而该机器失败,您将失去所有这些节点。因此,如果您在单个机器上运行多个数据节点,那么非常重要的是它们被设置为这样,即该机器的失败不会导致给定节点组中的所有数据节点的丢失。

鉴于NDB Cluster可以在低成本(或无成本)的操作系统上运行在普通硬件上,额外机器或两台机器的费用是值得的,以保护关键任务数据。此外,运行管理节点的主机的要求也很小。这项任务可以使用300 MHz Pentium或等效CPU和操作系统所需的RAM,以及ndb_mgmdndb_mgm进程的一些开销。

在具有多个CPU、核心或两者的主机上运行多个集群数据节点是可以接受的。NDB Cluster发行版还提供了一个多线程版本的数据节点二进制文件,旨在用于这些系统。有关更多信息,请参阅第 25.5.3 节,“ndbmtd — NDB 集群数据节点守护进程(多线程)”

在某些情况下,也可以在同一台机器上同时运行数据节点和SQL节点;这种安排的性能取决于多个因素,如核心数、CPU数、磁盘和内存可用性等,您必须在规划这种配置时考虑这些因素。

A.10.24.

可以在不关闭集群的情况下添加数据节点到 NDB 集群吗?

可以在不关闭集群的情况下添加新数据节点到 NDB 集群。有关更多信息,请参阅第 25.6.7 节,“在线添加 NDB 集群数据节点”

对于其他类型的 NDB 集群节点,只需要滚动重新启动(参阅第 25.6.5 节,“执行 NDB 集群滚动重新启动”)。

A.10.25.

使用 NDB 集群时需要注意哪些限制?

使用 NDB 集群时的限制包括:

  • 临时表不支持;使用 ENGINE=NDBENGINE=NDBCLUSTERCREATE TEMPORARY TABLE 语句将失败并显示错误。

  • 仅支持 KEYLINEAR KEY 类型的用户定义分区对于 NDBCLUSTER 表。尝试使用其他分区类型创建 NDB 表将失败并显示错误。

  • FULLTEXT 索引不支持。

  • 索引前缀不支持。只能对完整列进行索引。

  • 空间索引不支持(尽管可以使用空间列)。参阅第 13.4 节,“空间数据类型”

  • 对部分事务和部分回滚的支持与其他事务存储引擎(如InnoDB)类似,可以回滚单个语句。

  • 每个表的最大属性数为 512。属性名称不能超过 31 个字符。对于每个表,表名和数据库名的最大组合长度为 122 个字符。

  • 在 NDB 8.0 之前,每个表行的最大大小为 14 千字节,不包括BLOB 值。在 NDB 8.0 中,该最大值增加到 30000 字节。有关更多信息,请参阅第 25.2.7.5 节,“NDB 集群中的数据库对象限制”

    没有设置 NDB 表的行数限制。表大小限制取决于多个因素,特别是每个数据节点可用的 RAM 数量。

对于 NDB 集群的完整限制列表,请参阅 第 25.2.7 节,“NDB 集群已知限制”。另请参阅 第 25.2.7.11 节,“NDB 集群 8.4 中解决的以前问题”

A.10.26.

NDB 集群是否支持外键?

NDB 集群提供了与 InnoDB 存储引擎相似的外键约束支持;请参阅 第 1.7.3.2 节,“FOREIGN KEY 约束”,以获取更多详细信息,以及 第 15.1.20.5 节,“FOREIGN KEY 约束”。需要外键支持的应用程序应该使用 NDB 集群 7.3、7.4、7.5 或更高版本。

A.10.27.

如何将现有的 MySQL 数据库导入 NDB 集群?

您可以像使用任何其他 MySQL 版本一样将数据库导入 NDB 集群。除了本 FAQ 中提到的其他限制外,唯一的特殊要求是要将要包含在集群中的表使用 NDB 存储引擎。这意味着表必须使用 ENGINE=NDBENGINE=NDBCLUSTER 创建。

您也可以使用一个或多个 ALTER TABLE 语句将使用其他存储引擎的现有表转换为 NDBCLUSTER。但是,在进行转换之前,表的定义必须与 NDBCLUSTER 存储引擎兼容。在 MySQL 8.4 中,还需要一个额外的解决方法;请参阅 第 25.2.7 节,“NDB 集群已知限制”,以获取详细信息。

A.10.28.

NDB 集群节点如何相互通信?

集群节点可以通过三种不同的传输机制进行通信:TCP/IP、SHM(共享内存)和 SCI(Scalable Coherent Interface)。在同一集群主机上,默认情况下使用 SHM;但是,这被认为是实验性的。SCI 是一种高速(每秒 1 吉字节以上)、高可用性协议,用于构建可扩展的多处理器系统;它需要特殊的硬件和驱动程序。请参阅 第 25.4.4 节,“使用 NDB 集群的高速互连”,以获取关于使用 SCI 作为 NDB 集群传输机制的更多信息。

A.10.29.

什么是仲裁器?

如果集群中的一个或多个数据节点失败,可能会出现这种情况:不是所有的数据节点都可以“看到”彼此。实际上,可能会出现两个数据节点集群被隔离的情况,也称为“脑裂”场景。在这种情况下,仲裁器用于决定哪个数据节点集群是正确的。

当至少一个节点组中的所有数据节点都活跃时,不会出现网络分区问题,因为没有单个子集可以单独形成一个功能完整的集群。真正的问题出现在没有单个节点组拥有所有活跃节点的情况下,这时网络分区(“脑裂”场景)就可能发生。在这种情况下,需要仲裁器。所有集群节点都认识同一个节点作为仲裁器,通常是管理服务器;但是,也可以配置集群中的任何 MySQL 服务器来充当仲裁器。仲裁器接受第一个联系它的集群节点集,并告诉剩余的集群节点关闭。仲裁器的选择由 MySQL 服务器和管理服务器节点的 ArbitrationRank 配置参数控制。您也可以使用 ArbitrationRank 配置参数来控制仲裁器选择过程。有关这些参数的更多信息,请参阅 第 25.4.3.5 节,“定义 NDB 集群管理服务器”

仲裁器的角色本身并不对主机施加太高的要求,因此仲裁器主机不需要特别快或具有额外的内存。

A.10.30.

NDB 集群支持哪些数据类型?

NDB 集群支持所有通常的 MySQL 数据类型,包括与 MySQL 的空间扩展相关的数据类型;然而,NDB 存储引擎不支持空间索引。(空间索引仅由 MyISAM 支持;见 第 13.4 节,“空间数据类型”,以获取更多信息。)此外,当使用 NDB 表时,还有一些索引相关的差异。

注意

NDB 集群磁盘数据表(即使用 TABLESPACE ... STORAGE DISK ENGINE=NDBTABLESPACE ... STORAGE DISK ENGINE=NDBCLUSTER 创建的表)只有固定宽度的行。这意味着(例如)每个磁盘数据表记录包含一个 VARCHAR(255) 列,需要为字符集和排序规则分配 255 个字符的空间,不管实际存储的字符数目是多少。

第 25.2.7 节,“NDB 集群的已知限制”,以获取更多关于这些问题的信息。

A.10.31.

如何启动和停止 NDB 集群?

需要分别启动集群中的每个节点,按照以下顺序:

  1. 使用 ndb_mgmd 命令启动管理节点。

    在第一次启动集群时,必须包含 -f--config-file 选项,以告诉管理节点其配置文件的位置。

  2. 使用 ndbd 命令启动每个数据节点。

    每个数据节点必须使用 -c--ndb-connectstring 选项,以便数据节点知道如何连接到管理服务器。

  3. 使用您喜欢的启动脚本,例如 mysqld_safe,启动每个 MySQL 服务器(SQL 节点)。

    每个 MySQL 服务器必须使用 --ndbcluster--ndb-connectstring 选项启动。这些选项使 mysqld 启用 NDBCLUSTER 存储引擎支持,并指定如何连接到管理服务器。

每个命令都必须从系统 shell 中的相应机器上运行。(您不需要亲自在机器上出现—远程登录 shell 可以用于此目的。)您可以通过启动 NDB 管理客户端 ndb_mgm 在管理节点机器上,并发出 SHOWALL STATUS 命令来验证集群是否正在运行。

要关闭正在运行的集群,请在管理客户端中发出 SHUTDOWN 命令。或者,您可以在系统 shell 中输入以下命令:

$> ndb_mgm -e "SHUTDOWN"

(在这个示例中,引号是可选的,因为命令字符串中没有空格;此外,管理客户端命令,如 SHUTDOWN 命令,不区分大小写。)

无论哪个命令都将导致ndb_mgmndb_mgm和任何ndbd进程以优雅的方式终止。 MySQL 服务器作为 SQL 节点可以使用mysqladmin shutdown停止。

有关更多信息,请参阅第 25.6.1 节,“NDB 集群管理客户端中的命令”第 25.3.6 节,“NDB 集群的安全关闭和重启”

MySQL 集群管理器提供了其他方式来处理 NDB 集群节点的启动和停止。请参阅MySQL 集群管理器 8.4.0 用户手册,以获取有关该工具的更多信息。

A.10.32.

当集群关闭时,NDB 集群数据会发生什么变化?

集群的数据节点在内存中的数据将被写入磁盘,并在下一次启动集群时重新加载到内存中。

A.10.33.

对于 NDB 集群,拥有多个管理节点是一个好主意吗?

这可以作为一个故障安全措施。只有一个管理节点可以控制集群,但可以配置一个主要管理节点,并且可以配置一个或多个辅助管理节点,以便在主要管理节点失败时接管。

请参阅第 25.4.3 节,“NDB 集群配置文件”,以获取有关配置 NDB 集群管理节点的信息。

A.10.34.

可以在一个 NDB 集群中混合使用不同的硬件和操作系统吗?

可以,只要所有机器和操作系统具有相同的“endianness”(所有大端或所有小端)。

也可以在不同的 NDB 集群版本上使用软件。但是,我们仅支持在滚动升级过程中使用这种方法(请参阅第 25.6.5 节,“NDB 集群的滚动重启”)。

A.10.35.

可以在单个主机上运行两个数据节点?两个 SQL 节点?

可以。在数据节点的情况下,建议(但不是必需的)每个节点使用不同的数据目录。如果您想在一台机器上运行多个 SQL 节点,每个实例的mysqld必须使用不同的 TCP/IP 端口。

在同一主机上运行数据节点和 SQL 节点是可能的,但您应该注意ndbdndbmtd进程可能与mysqld竞争内存。

A.10.36.

可以使用主机名与 NDB 集群?

可以使用 DNS 和 DHCP 来管理集群主机。但是,如果您的应用程序需要“五个九”可用性,您应该使用固定(数字)IP 地址,因为使用 DNS 和 DHCP 服务会引入额外的潜在故障点。

A.10.37.

NDB 集群是否支持 IPv6?

IPv6 支持 SQL 节点(MySQL 服务器)之间的连接,但所有其他类型的 NDB 集群节点之间的连接必须使用 IPv4。

实际上,这意味着您可以使用 IPv6 进行 NDB 集群之间的复制,但同一个 NDB 集群中的节点之间的连接必须使用 IPv4。有关更多信息,请参阅第 25.7.3 节,“NDB 集群复制中的已知问题”

A.10.38.

在具有多个 MySQL 服务器的 NDB 集群中如何处理 MySQL 用户?

MySQL 用户账户和权限通常不会在访问同一个 NDB 集群的不同 MySQL 服务器之间自动传播。MySQL NDB 集群提供了使用 NDB_STORED_USER 权限的共享和同步用户和权限的支持;请参阅 分布式权限使用共享授权表,以获取更多信息。你应该知道,这个实现是在 NDB 8.0 中引入的,并且与 NDB 集群早期版本中的共享权限机制不兼容。早期的实现在 NDB 8.0 中不再支持。

A.10.39.

如果一个 SQL 节点失败,我如何继续发送查询?

MySQL NDB 集群不提供 SQL 节点之间的自动故障转移。你的应用程序必须准备好处理 SQL 节点的损失,并在它们之间进行故障转移。

A.10.40.

如何备份和恢复 NDB 集群?

你可以使用 NDB 集群本机备份和恢复功能,在 NDB 管理客户端和 ndb_restore 程序中。请参阅 第 25.6.8 节,“NDB 集群的在线备份”,和 第 25.5.23 节,“ndb_restore — Restore an NDB Cluster Backup”

你也可以使用 mysqldump 和 MySQL 服务器提供的传统备份功能。请参阅 第 6.5.4 节,“mysqldump — A Database Backup Program”,以获取更多信息。

A.10.41.

什么是 “天使进程”

这个进程监视并尝试重新启动数据节点进程。如果你在启动 ndbd 后检查系统上的活动进程列表,你可以看到实际上有两个进程在运行,正如这里所示(我们省略了 ndb_mgmdndbd 的输出,以便简洁):

$> ./ndb_mgmd

$> ps aux | grep ndb
me      23002  0.0  0.0 122948  3104 ?        Ssl  14:14   0:00 ./ndb_mgmd
me      23025  0.0  0.0   5284   820 pts/2    S+   14:14   0:00 grep ndb

$> ./ndbd -c 127.0.0.1 --initial

$> ps aux | grep ndb
me      23002  0.0  0.0 123080  3356 ?        Ssl  14:14   0:00 ./ndb_mgmd
me      23096  0.0  0.0  35876  2036 ?        Ss   14:14   0:00 ./ndbmtd -c 127.0.0.1 --initial
me      23097  1.0  2.4 524116 91096 ?        Sl   14:14   0:00 ./ndbmtd -c 127.0.0.1 --initial
me      23168  0.0  0.0   5284   812 pts/2    R+   14:15   0:00 grep ndb

显示 0.0 的内存和 CPU 使用率的 ndbd 进程是天使进程(尽管它实际上使用了非常小的内存和 CPU)。这个进程只是检查主 ndbdndbmtd 进程(实际处理数据的主数据节点进程)是否正在运行。如果允许这样做(例如,如果 StopOnError 配置参数设置为 false),天使进程将尝试重新启动主数据节点进程。