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

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


**A.10.1. **
哪个版本的 MySQL 软件支持 NDB 群集?我必须从源代码编译吗?
标准 MySQL Server 5.7 版本不支持 NDB Cluster。相反,MySQL NDB Cluster 是作为单独的产品提供的。可用的 NDB Cluster 版本系列包括以下内容:
**NDB Cluster 7.2. ** 本系列不再受新部署或维护的支持。 NDB Cluster 7.2 的用户应尽快升级到较新的发行系列。我们建议新的部署使用最新的 NDB Cluster 8.0 版本。
**NDB Cluster 7.3. ** 本系列是 NDB Cluster 的以前的一般可用性(GA)版本,仍然可供生产使用,尽管我们建议新的部署使用最新的 NDB Cluster 8.0 版本。可以从https://dev.mysql.com/downloads/cluster/获得最新的 NDB Cluster 7.3 版本。
**NDB Cluster 7.4. ** 本系列是 NDB Cluster 的以前的一般可用性(GA)版本,仍可用于生产环境,尽管我们建议新的部署使用最新的 NDB Cluster 8.0 版本。可以从https://dev.mysql.com/downloads/cluster/获得最新的 NDB Cluster 7.4 版本。
**NDB Cluster 7.5. ** 本系列是 NDB Cluster 的以前的一般可用性(GA)版本,仍可用于生产环境,尽管我们建议新的部署使用最新的 NDB Cluster 7.6 版本。可以从https://dev.mysql.com/downloads/cluster/获得最新的 NDB Cluster 7.5 版本。
**NDB Cluster 7.6. ** 本系列是 NDB Cluster 的以前的一般可用性(GA)版本,仍可用于生产,尽管我们建议新的部署使用最新的 NDB Cluster 8.0 版本。可以从https://dev.mysql.com/downloads/cluster/获得最新的 NDB Cluster 7.6 版本。
**NDB Cluster 8.0. ** 本系列是 NDB Cluster 的最新通用版本(GA),基于NDB存储引擎的 8.0 版本和 MySQL Server 8.0. NDB Cluster 8.0 可供生产使用。用于生产的新部署应使用本系列中的最新 GA 版本,即当前的 NDB Cluster 8.0.22. 您可以从https://dev.mysql.com/downloads/cluster/获得最新的 NDB Cluster 8.0 版本。有关本系列中的新功能和其他重要更改的信息,请参见NDB 群集中的新增功能
您可以从源代码获取并编译 NDB Cluster(请参阅第 21.2.3.4 节“在 Linux 上从源代码构建 NDB 集群”第 21.2.4.2 节“在 Windows 上从源代码编译和安装 NDB 群集”),但是对于除最特殊情况以外的所有情况,我们建议使用 Oracle 提供的以下适合于您的操作平台和环境的安装程序之一:
基于网络的NDB 群集自动安装程序(适用于NDB支持的所有平台)
Linux binary release(tar.gz文件)
Linux RPM package
Linux .deb file
Windows 二进制“无安装”版本
Windows MSI Installer
也可以从平台的软件包 Management 系统中获得安装软件包。
您可以使用语句SHOW VARIABLES LIKE 'have_%'SHOW ENGINESSHOW PLUGINS之一来确定 MySQL Server 是否具有NDB支持。

**A.10.2. **
“ NDB”和“ NDBCLUSTER”是什么意思?
“ NDB”代 table“ N 工作 D ata **** ”。 NDBNDBCLUSTER都是用于启用 MySQL 群集支持的存储引擎的名称。首选NDB,但任何一个名称都是正确的。

**A.10.3. **
使用 NDB 群集与使用 MySQL 复制之间有什么区别?
在传统的 MySQL 复制中,主 MySQL 服务器会更新一个或多个从服务器。事务是按 Sequences 提交的,而缓慢的事务可能导致从机落后于主机。这意味着,如果主服务器发生故障,则从服务器可能没有记录最近的几个事务。如果使用了诸如InnoDB之类的事务安全引擎,则事务将在从服务器上完成或完全不应用,但是复制不能保证主服务器和从服务器上的所有数据始终保持一致。在 NDB 群集中,所有数据节点保持同步,并且任何一个数据节点提交的事务都将提交给所有数据节点。在数据节点发生故障的情况下,所有剩余的数据节点均保持一致状态。
简而言之,虽然标准 MySQL 复制是异步的,但 NDB 群集是同步的。
NDB 群集中也可以使用异步复制。 NDB 群集复制(有时也称为“地理复制”)具有在两个 NDB 群集之间以及从 NDB 群集复制到非群集 MySQL 服务器的功能。参见第 21.6 节“ NDB 群集复制”

**A.10.4. **
我需要任何特殊的网络来运行 NDB Cluster 吗?群集中的计算机如何通信?
NDB 群集旨在用于高带宽环境中,并且计算机使用 TCP/IP 连接。它的性能直接取决于群集计算机之间的连接速度。 NDB 群集的最低连接要求包括一个典型的 100 兆以太网或等效的以太网。我们建议您尽可能使用千兆以太网。

**A.10.5. **
运行 NDB 群集需要多少台计算机,为什么?
运行可行的集群至少需要三台计算机。但是,NDB 群集中的最少*“推荐”计算机数量为四:一台用于运行 Management 和 SQL 节点的计算机,以及两台用作数据节点的计算机。这两个数据节点的目的是提供冗余。如果数据节点之一发生故障,Management 节点必须在单独的计算机上运行以保证持续的仲裁服务。
为了提供更高的吞吐量和高可用性,您应该使用多个 SQL 节点(连接到群集的 MySQL 服务器)。也可以(尽管并非绝对必要)运行多个 Management 服务器。

**A.10.6. **
NDB 群集中的不同计算机做什么?
NDB 群集具有物理和逻辑组织,计算机是物理元素。群集的逻辑或功能元素称为节点,而包含群集节点的计算机有时称为群集主机。有三种类型的节点,每种类型对应于集群中的特定角色。这些是:
Management 节点. 该节点为整个集群提供 Management 服务,包括其他节点的启动,关闭,备份和配置数据。Management 节点服务器被实现为应用程序ndb_mgmd;用于控制 NDB 群集的 ManagementClient 端为ndb_mgm。有关这些程序的信息,请参见第 21.4.4 节“ ndb_mgmd-NDB 群集 Management 服务器守护程序”第 21.4.5 节“ ndb_mgm — NDB 群集 ManagementClient 端”
数据节点. 这种类型的节点存储和复制数据。数据节点功能由NDB数据节点进程ndbd的实例处理。有关更多信息,请参见第 21.4.1 节“ ndbd-NDB 群集数据节点守护程序”
SQL 节点. 这只是 MySQL Server(mysqld)的实例,该实例是通过对NDBCLUSTER存储引擎的支持而构建的,并以--ndb-cluster选项启动以启用引擎,并以--ndb-connectstring选项启动以使其能够连接到 NDB。集群 Management 服务器。有关这些选项的更多信息,请参见第 21.3.3.9.1 节“ NDB 群集的 MySQL 服务器选项”

Note





API 节点是直接使用群集数据节点进行数据存储和检索的任何应用程序。因此,可以将 SQL 节点视为一种 API 节点,它使用 MySQL 服务器为群集提供 SQL 接口。您可以使用 NDB API 编写此类应用程序(不依赖于 MySQL Server),该 API 为 NDB Cluster 数据提供直接的,面向对象的事务和扫描接口。有关更多信息,请参见NDB 群集 API 概述:NDB API



|
|

> A.10.7. ** |当我在 NDB 群集 ManagementClient 端中运行SHOW命令时,我看到一行输出,如下所示:

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

> *是什么意思?此节点与其他节点有何不同?
||最简单的答案是,“这不是您可以控制的,在任何情况下都无需担心,除非您是编写或分析 NDB Cluster 源代码的软件工程师”。

> 如果您找不到满意的答案,请使用更长,技术含量更高的版本:

> NDB 群集中的许多机制要求在数据节点之间进行分布式协调。这些分布式算法和协议包括全局检查点,DDL(模式)更改和节点重新启动处理。为了使这种协调更简单,数据节点“选举”其中一个作为领导者。 (该节点曾经被称为“主节点”,但是为了避免与 MySQL 复制中的主服务器混淆,删除了该术语.)没有影响该选择的面向用户的机制,这是完全自动的。它是自动的,这是 NDB Cluster 内部体系结构的关键部分。

> 当一个节点充当这些机制中任何一个的“领导者”时,通常是活动的协调点,而其他节点则充当“跟随者”,按照领导者的指示执行其活动的一部分。如果充当领导者的节点发生故障,则其余节点将选举新的领导者。由旧领导者协调的正在进行的任务可能会失败,也可能会由新领导者 continue 执行,具体取决于所涉及的实际机制。

> 这些不同的机制和协议中的某些可能具有不同的领导者节点,但通常为所有它们选择相同的领导者。在 ManagementClient 端中被指示为SHOW输出中的领导者的节点在内部被称为DICTManagement 器(有关更多信息,请参见
NDB Cluster API 开发人员指南
中的DBDICT 块),负责协调 DDL 和元数据活动。

> NDB 群集的设计方式是,领导者的选择在群集本身之外没有明显的影响。例如,当前的领导者没有比其他数据节点明显更高的 CPU 或资源使用率,并且领导者的失败对集群的影响不应与任何其他数据节点的失败有明显不同。
|

> **A.10.8. ** |我可以在哪些 os 上使用 NDB 群集?|
|| NDB Cluster 在大多数类似 Unix 的 os 上受支持。 Microsoft Windowsos 上的生产设置也支持 NDB Cluster。

> 有关 NDB Cluster 在各种 os 版本,os 发行版和硬件平台上提供的支持级别的更多详细信息,请参阅https://www.mysql.com/support/supportedplatforms/cluster.html
|

> **A.10.9. ** |运行 NDB 群集的硬件要求是什么?|
|| NDB 群集应在启用NDB的二进制文件可用的任何平台上运行。对于数据节点和 API 节点,更快的 CPU 和更多的内存可能会提高性能,而 64 位 CPU 可能比 32 位处理器更有效。用于数据节点的计算机上必须有足够的内存来保存每个节点在数据库中的份额(有关更多信息,请参阅我需要多少 RAM?)。对于仅用于运行 NDB 群集 Management 服务器的计算机,要求最低。通常,一台普通台式 PC(或等效台式 PC)足以完成此任务。节点可以通过标准的 TCP/IP 网络和硬件进行通信。他们还可以使用高速 SCI 协议。但是,使用 SCI 需要特殊的网络硬件和软件(请参见第 21.3.4 节“使用与 NDB 群集的高速互连”)。
|

> **A.10.10. ** |使用 NDB 群集需要多少内存?可以完全使用磁盘存储器吗?
|| NDB Cluster 最初仅是作为内存实现的,但是当前可用的所有版本还提供了将 NDB Cluster 存储在磁盘上的功能。有关更多信息,请参见第 21.5.10 节“ NDB 群集磁盘数据 table”

> 对于内存中的NDBtable,可以使用以下公式来粗略估计群集中每个数据节点需要多少 RAM:

> (SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes

> 要更精确地计算内存需求,需要为群集数据库中的每个 table 确定每行所需的存储空间(有关详细信息,请参见第 11.7 节“数据类型存储要求”),然后将其乘以行数。您还必须记住要考虑所有列索引,如下所示:

> 为NDBCLUSTERtable 创建的每个主键或哈希索引每个记录需要 21-25 字节。这些索引使用IndexMemory

> 每个有序索引需要使用DataMemory来存储每条记录 10 个字节。

> 创建主键或唯一索引也会创建有序索引,除非使用USING HASH创建该索引。换一种说法:

> 群集 table 上的主键或唯一索引通常每条记录占用 31 到 35 个字节。

> 但是,如果主键或唯一索引是使用USING HASH创建的,则每个记录仅需要 21 到 25 个字节。

> 使用所有主键和唯一索引的USING HASH创建 NDB 群集 table 通常会使 table 更新运行得更快-在某些情况下,比不使用USING HASH创建主键和唯一键的 table 更新快 20%到 30% 。这是由于以下事实:需要较少的内存(因为未创建有序索引),并且必须使用较少的 CPU(因为必须读取并可能更新较少的索引)。但是,这也意味着必须使用其他方式来满足可以使用范围扫描的查询,这可能会导致选择速度变慢。

> 在计算群集内存需求时,您可能会发现有用的ndb_size.plUtil 在最新的 MySQL 5.7 版本中可用。这个 Perl 脚本连接到当前的(非集群)MySQL 数据库,并创建一个报告,说明如果数据库使用NDBCLUSTER存储引擎,它将需要多少空间。有关更多信息,请参见第 21.4.29 节,“ ndb_size.pl — NDBCLUSTER 大小需求估计器”

> 请记住,每个 NDB 群集 table 都必须具有主键,这一点尤其重要。 NDB存储引擎会自动创建一个主键(如果未定义);创建此主键时没有USING HASH

> 您可以使用ndb_mgmClient 端中的REPORT MEMORYUSAGE命令来确定在任何给定时间正在使用多少内存来存储 NDB 群集数据和索引。有关更多信息,请参见第 21.5.1 节“ NDB 群集 ManagementClient 端中的命令”。此外,在使用 80%的可用DataMemory或(在 NDB 7.6 之前)IndexMemory时,以及在使用率达到 90%,99%和 100%时,也会将警告写入群集日志。
|

> **A.10.11. ** | NDB 群集可以使用哪些文件系统?网络文件系统或网络共享呢?
||通常,主机 os 本地的任何文件系统都应与 NDB Cluster 配合良好。如果您发现给定的文件系统与 NDB Cluster 配合使用特别好(或不太特别),我们邀请您在NDB 集群论坛中讨论您的发现。

> 对于 Windows,我们建议您将NTFS文件系统用于 NDB 群集,就像使用标准 MySQL 一样。我们不使用FATVFAT文件系统测试 NDB 群集。因此,我们不建议将它们与 MySQL 或 NDB Cluster 一起使用。

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

> **A.10.12. ** |我可以在虚拟机(例如 VMWare,VirtualBox,Parallels 或 Xen 创建的虚拟机)中运行 NDB Cluster 节点吗?|
|| NDB 群集支持在虚拟机中使用。我们目前使用Oracle VM支持和测试。

> 一些 NDB Cluster 用户已使用其他虚拟化产品成功部署了 NDB Cluster。在这种情况下,Oracle 可以提供 NDB 群集支持,但是特定于虚拟环境的问题必须交给该产品的供应商。
|

> **A.10.13. ** |我正在尝试填充 NDB 群集数据库。加载过程过早终止,我收到一条错误消息,如下所示:

> ERROR 1114: The table 'my_cluster_table' is full

> 为什么会这样?
||原因很可能是您的设置没有为所有 table 数据和所有索引提供足够的 RAM,包括NDB存储引擎所需的主键,并且在 table 定义不包含主键的情况下自动创建的主键主键的定义

> 还值得注意的是,所有数据节点都应具有相同数量的 RAM,因为群集中没有数据节点可以使用的内存多于任何单个数据节点可用的最少内存。例如,如果有四台计算机承载群集数据节点,其中三台计算机具有 3GB 的 RAM 可用于存储群集数据,而其余数据节点只有 1GB RAM,则每个数据节点最多可以将 1GB 的内存用于 NDB 群集数据,并且索引。

> 在某些情况下,即使ndb_mgm -e“所有报告内存”显示出很大的空闲DataMemory,也可能在 MySQLClient 端应用程序中获得 Table is full 错误。您可以通过为CREATE TABLE使用MAX_ROWS选项来强制NDB为 NDB 群集 table 创建额外的分区,从而为散列索引提供更多的内存。通常,将MAX_ROWS设置为您希望在 table 中存储的行数的两倍就足够了。

> 由于类似的原因,有时在数据负载很重的节点上,数据节点重新启动也会遇到问题。 MinFreePct参数可以保留一部分(默认情况下为 5%)DataMemory和(在 NDB 7.6 之前)IndexMemory以便重新启动,以解决此问题。此保留的内存不可用于存储NDB个 table 或数据。
|

> ** A.10.14. * | NDB 群集使用 TCP/IP。这是否意味着我可以在 Internet 上运行它,并且一个或多个节点位于远程位置?
||在这样的条件下,群集不太可能可靠运行,因为 NDB 群集的设计和实现是假设它可以在保证专用高速连接的条件下运行,例如在使用 LAN 设置的局域网中。 100 Mbps 或千兆以太网,最好是后者。我们既不测试也不保证其性能低于此速度。

> 另外,请记住 NDB 群集中节点之间的通信不安全,这一点非常重要。它们既未加密也未受任何其他保护机制的保护。群集的最安全配置是在防火墙后面的专用网络中,无法从外部直接访问任何群集数据或 Management 节点。 (对于 SQL 节点,应采取与其他任何 MySQL 服务器实例相同的预防措施.)有关更多信息,请参见第 21.5.17 节“ NDB 群集安全性问题”
|

> **A.10.15. ** |我必须学习一种新的编程或查询语言才能使用 NDB 群集吗?|
|| 。尽管使用一些专用命令来 Management 和配置群集本身,但是以下操作仅需要标准(My)SQL 语句:

> 创建,更改和删除 table

> 插入,更新和删除 table 数据

> 创建,更改和删除主索引和唯一索引

> 设置 NDB 群集需要一些专门的配置参数和文件-有关这些信息,请参阅第 21.3.3 节“ NDB 群集配置文件”

> NDB 群集 ManagementClient 端(ndb_mgm)中使用了一些简单的命令来执行诸如启动和停止群集节点之类的任务。参见第 21.5.1 节“ NDB 群集 ManagementClient 端中的命令”
|

> **A.10.16. ** | NDB 群集支持哪些编程语言和 API?
|| NDB Cluster 支持与标准 MySQL Server 相同的编程 API 和语言,包括 ODBC,.Net,MySQL C API 以及众多用于流行脚本语言(例如 PHP,Perl 和 Python)的驱动程序。使用这些 API 编写的 NDB Cluster 应用程序的行为类似于其他 MySQL 应用程序。它们将 SQL 语句传输到 MySQL 服务器(对于 NDB 群集,是 SQL 节点),并接收包含数据行的响应。有关这些 API 的更多信息,请参见第 27 章,连接器和 API

> NDB Cluster 还支持使用 NDB API 进行应用程序编程,该 API 为 NDB Cluster 数据提供了低级 C 接口,而无需通过 MySQL Server。参见NDB API。此外,C 语言 MGM API 公开了许多NDBCLUSTERManagement 功能;有关更多信息,请参见MGM API

> NDB Cluster 还支持使用 ClusterJ 的 Java 应用程序编程,该程序支持使用会话和事务处理数据的域对象模型。有关更多信息,请参见Java 和 NDB 集群

> 另外,NDB Cluster 提供了对memcached的支持,从而允许开发人员使用memcached接口访问存储在 NDB Cluster 中的数据。有关更多信息,请参见ndbmemcache-NDB 群集的 Memcache API

> NDB Cluster 还包括适配器,该适配器支持针对Node.js编写的 NoSQL 应用程序,并将 NDB Cluster 作为数据存储。有关更多信息,请参见适用于 JavaScript 的 MySQL NoSQL 连接器
|

> **A.10.17. ** | NDB 群集是否包括任何 Management 工具?|
|| NDB Cluster 包括用于执行基本 Management 功能的命令行 Client 端。参见第 21.4.5 节“ ndb_mgm — NDB 群集 ManagementClient 端”第 21.5.1 节“ NDB 群集 ManagementClient 端中的命令”

> NDB Cluster 7.6 和更早版本也受 MySQL Cluster Manager 的支持,这是一个单独的产品,提供了高级命令行界面,该界面可以自动执行许多 NDB ClusterManagement 任务,例如滚动重启和配置更改。从版本 1.4.8 开始,MySQL Cluster Manager 还提供了对 NDB Cluster 8.0 的实验性支持。有关 MySQL Cluster Manager 的更多信息,请参见MySQL™Cluster Manager 1.4.8 用户手册

> NDB Cluster 还提供了一个基于浏览器的图形化自动安装程序,用于设置和部署 NDB Cluster,这是 NDB Cluster 软件分发的一部分。有关更多信息,请参见第 21.2.1 节“ NDB 群集自动安装程序(NDB 7.5)”
|

> **A.10.18. ** |使用 NDB 群集时,如何找出错误或警告消息的含义?|
||有两种方法可以完成此操作:

> 在收到错误或警告情况通知后,请在mysqlClient 端中立即使用 SHOW ERRORSSHOW WARNINGS

> 在系统 Shell 程序提示符下,使用perror --ndb error_code
|

> **A.10.19. ** | NDB Cluster 事务安全吗?支持哪些隔离级别?
|| 。对于使用NDB存储引擎创建的 table,支持事务。当前,NDB Cluster 仅支持READ COMMITTED事务隔离级别。
|

> **A.10.20. ** | NDB 群集支持哪些存储引擎?|
|| NDB 群集需要NDB存储引擎。也就是说,为了在 NDB 群集中的节点之间共享 table,必须使用ENGINE=NDB(或等效的选项ENGINE=NDBCLUSTER)创建 table。

> 可以在与 NDB Cluster 一起使用的 MySQL 服务器上使用其他存储引擎(例如InnoDBMyISAM)创建 table,但是由于这些 table 不使用NDB,因此它们不参与集群。每个这样的 table 对于创建它的单个 MySQL 服务器实例都是严格本地的。

> NDB 群集在架构,要求和实现方面与InnoDB群集完全不同。尽管它们的名称有相似之处,但这两者是不兼容的。有关InnoDB群集的更多信息,请参见第 20 章,InnoDB 集群。有关NDBInnoDB存储引擎之间差异的信息,另请参见第 21.1.6 节“使用 InnoDB 和 NDB 群集的 MySQL 服务器”
|

> **A.10.21. ** |如果发生灾难性故障,例如整个城市断电*而我的 UPS 发生故障,我会丢失所有数据吗?|
||记录所有已提交的事务。因此,尽管在发生灾难时可能会丢失一些数据,但这应该是相当有限的。通过最小化每个事务的操作数量,可以进一步减少数据丢失。 (在任何情况下,每个事务都执行大量操作不是一个好主意.)|
|

> **A.10.22. ** |是否可以对 NDB 群集使用FULLTEXT索引?
||当前,只有InnoDBMyISAM存储引擎支持FULLTEXT索引。有关更多信息,请参见第 12.9 节“全文搜索功能”
|

> **A.10.23. ** |我可以在一台计算机上运行多个节点吗?|
||可能但并非总是明智的。运行集群的主要原因之一是提供冗余。为了获得此冗余的全部好处,每个节点应驻留在单独的计算机上。如果在单个计算机上放置多个节点而该计算机发生故障,则会丢失所有这些节点。因此,如果您确实要在一台计算机上运行多个数据节点,那么以一种非常重要的方式设置数据节点,使得该计算机的故障不会导致给定节点中所有数据节点的丢失,这是非常重要的。节点组。

> 鉴于 NDB 群集可以在装有低成本(甚至无成本)os 的商用硬件上运行,因此额外花费一两台机器来保护关键任务数据是非常值得的。还应注意,对运行 Management 节点的群集主机的要求最低。可以使用 300 MHz 奔腾或同等 CPU 和足够的 RAM 用于 os 来完成此任务,再加上ndb_mgmdndb_mgm进程的少量开销。

> 可以在具有多个 CPU,多个内核或两者都有的单个主机上运行多个群集数据节点。 NDB 群集发行版还提供了打算在此类系统上使用的数据节点二进制文件的多线程版本。有关更多信息,请参见第 21.4.3 节“ ndbmtd-NDB 群集数据节点守护程序(多线程)”

> 在某些情况下,还可以在同一台计算机上同时运行数据节点和 SQL 节点。这种安排的执行情况取决于许多因素,例如核心和 CPU 的数量以及数据节点和 SQL 节点进程可用的磁盘和内存量,并且在计划此类安排时必须考虑这些因素。配置。|
|

> **A.10.24. ** |是否可以在不重新启动 NDB 群集的情况下将数据节点添加到 NDB 群集?
||可以在不使群集脱机的情况下将新的数据节点添加到正在运行的 NDB 群集。有关更多信息,请参见第 21.5.7 节“在线添加 NDB 群集数据节点”

> 对于其他类型的 NDB 群集节点,只需滚动重启即可(请参阅第 21.5.5 节“执行 NDB 群集的滚动重启”)。
|

> **A.10.25. ** |使用 NDB 群集时我应该注意哪些限制?
|| MySQL NDB Cluster 中的NDBtable 的限制包括:

> 不支持临时 table;使用ENGINE=NDBENGINE=NDBCLUSTER创建临时 table语句失败,并显示错误。

> NDBCLUSTERtable 支持的用户定义分区的唯一类型是KEYLINEAR KEY。尝试使用任何其他分区类型创建NDBtable 失败,并显示错误。

> 不支持FULLTEXT个索引。

> 不支持索引前缀。只有完整的列可以被索引。

> 不支持空间索引(尽管可以使用空间列)。参见第 11.4 节“空间数据类型”

> 对部分事务和部分回滚的支持与可以回滚单个语句的其他事务存储引擎(例如InnoDB)相当。

> 每个 table 最多允许有 512 个属性。属性名称不能超过 31 个字符。对于每个 table,table 和数据库名称的最大组合长度为 122 个字符。

> 基于 NDB 8.0,table 行的最大大小为 14 KB,不包括BLOB值。在 NDB 8.0 中,此最大值增加到 30000 字节。有关更多信息,请参见第 21.1.7.5 节“与 NDB 群集中的数据库对象相关联的限制”

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

> 有关 NDB 群集中限制的完整列 table,请参见第 21.1.7 节“ NDB 群集的已知限制”。另请参见NDB Cluster 8.0 中解决的以前的 NDB Cluster 问题
|

> **A.10.26. ** | NDB 群集是否支持外键?|
|| NDB Cluster 提供了对外键约束的支持,该约束与InnoDB存储引擎中的约束相当;有关更多详细信息,请参见第 1.8.3.2 节“外键约束”,以及第 13.1.18.5 节“外键约束”。需要外键支持的应用程序应使用 NDB Cluster 7.3、7.4、7.5 或更高版本。
|

> **A.10.27. ** |如何将现有的 MySQL 数据库导入 NDB 群集?|
||您可以像使用其他任何版本的 MySQL 一样,将数据库导入 NDB Cluster。除了本常见问题解答中其他地方提到的限制外,唯一的其他特殊要求是群集中要包含的任何 table 都必须使用NDB存储引擎。这意味着必须使用ENGINE=NDBENGINE=NDBCLUSTER创建 table。

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

> **A.10.28. ** | NDB 群集节点如何相互通信?|
||集群节点可以通过三种不同的传输机制中的任何一种进行通信:TCP/IP,SHM(共享内存)和 SCI(可伸缩一致接口)。在可用的情况下,默认情况下,在同一群集主机上的节点之间使用 SHM。但是,这被认为是实验性的。 SCI 是用于构建可扩展的 multiprocessing 器系统的高速(每秒 1 GB 或更高)的高可用性协议。它需要特殊的硬件和驱动程序。有关将 SCI 用作 NDB 群集的传输机制的更多信息,请参见第 21.3.4 节“使用与 NDB 群集的高速互连”
|

> **A.10.29. ** |什么是仲裁员?|
||如果集群中的一个或多个数据节点发生故障,则可能并非所有集群数据节点都可以“看到”彼此。实际上,在网络分区(也称为“裂脑”方案)中,两组数据节点可能会变得彼此隔离。这种情况是不希望的,因为每组数据节点都试图 table 现得好像整个集群一样。要求仲裁员在竞争的数据节点集之间做出决定。

> 当至少一个节点组中的所有数据节点都处于活动状态时,网络分区就不成问题,因为集群的任何子集都无法自行形成功能集群。当没有单个节点组的所有节点都处于活动状态时,就会出现 true 的问题,在这种情况下,可以进行网络分区(“裂脑”方案)。然后需要一名仲裁员。所有群集节点都将同一节点识别为仲裁器,通常是 Management 服务器。但是,可以将群集中的任何 MySQL Server 配置为充当仲裁程序。仲裁程序接受第一组群集节点进行联系,并告诉其余组关闭。仲裁程序的选择由 MySQL 服务器和 Management 服务器节点的ArbitrationRank配置参数控制。您还可以使用ArbitrationRank配置参数来控制仲裁程序选择过程。有关这些参数的更多信息,请参见第 21.3.3.5 节,“定义 NDB 群集 Management 服务器”

> 仲裁者的角色本身并没有对这样指定的主机施加任何苛刻的要求,因此,仲裁者主机不需要特别快或为此目的而具有额外的内存。
|

> **A.10.30. ** | NDB 群集支持哪些数据类型?|
|| NDB Cluster 支持所有常用的 MySQL 数据类型,包括与 MySQL 的空间扩展相关的数据类型。但是NDB存储引擎不支持空间索引。 (空间索引仅由MyISAM支持;有关更多信息,请参见第 11.4 节“空间数据类型”。)此外,与NDBtable 一起使用时,索引之间存在一些差异。

> [!NOTE|label:Note]




NDB 群集磁盘数据 table(即使用TABLESPACE ... STORAGE DISK ENGINE=NDBTABLESPACE ... STORAGE DISK ENGINE=NDBCLUSTER创建的 table)仅具有固定宽度的行。这意味着(例如)每个包含VARCHAR(255)列的磁盘数据 table 记录都需要 255 个字符的空间(这是该 table 使用的字符集和排序规则所必需的),而不管其中存储的实际字符数如何。



有关这些问题的更多信息,请参见第 21.1.7 节“ NDB 群集的已知限制”
|
**A.10.31. ** |如何启动和停止 NDB 群集?|
||必须按以下 Sequences 分别启动集群中的每个节点:
使用ndb_mgmd命令启动 Management 节点。
您必须包括-f--config-file选项,以告诉 Management 节点可以在何处找到其配置文件。
使用ndbd命令启动每个数据节点。
必须使用-c--ndb-connectstring选项启动每个数据节点,以便该数据节点知道如何连接到 Management 服务器。
使用您喜欢的启动脚本(例如mysqld_safe)启动每个 MySQL Server(SQL 节点)。
每个 MySQL Server 必须以--ndbcluster--ndb-connectstring选项启动。这些选项使mysqld启用NDBCLUSTER存储引擎支持以及如何连接到 Management 服务器。
这些命令中的每一个都必须从装有受影响节点的计算机上的系统 Shell 运行。 (您不必在计算机上物理地存在-可以使用远程登录 Shell.)您可以通过在 Management 节点所在的计算机上启动NDBManagementClient 端ndb_mgm并发出该证书来验证集群是否正在运行。 SHOWALL STATUS命令。
要关闭正在运行的群集,请在 ManagementClient 端中发出命令SHUTDOWN。或者,您可以在系统 Shell 程序中 Importing 以下命令:
shell> ndb_mgm -e "SHUTDOWN"
(此示例中的引号是可选的,因为在-e选项后的命令字符串中没有空格;此外,与其他 ManagementClient 端命令一样,SHUTDOWN命令也不区分大小写.)
这些命令中的任何一个都会导致ndb_mgmndb_mgm和任何ndbd进程正常终止。可以使用mysqladmin shutdown停止作为 SQL 节点运行的 MySQL 服务器。
有关更多信息,请参见第 21.5.1 节“ NDB 群集 ManagementClient 端中的命令”第 21.2.8 节“安全关闭和重新启动 NDB 群集”
MySQL Cluster Manager 和 NDB Cluster Auto-Installer 提供了其他方法来处理 NDB Cluster 节点的启动和停止。有关这些工具的更多信息,请参见MySQL™Cluster Manager 1.4.8 用户手册第 21.2.2 节“ NDB 群集自动安装程序(NDB 7.6)”
|
**A.10.32. ** |当 NDB 群集关闭时,NDB 群集数据会怎样?
||由集群的数据节点保留在内存中的数据将写入磁盘,并在下次启动集群时重新加载到内存中。
|
**A.10.33. ** | NDB 群集具有多个 Management 节点是一个好主意吗?|
||作为故障保护很有用。在任何给定时间,只有一个 Management 节点控制集群,但是可以将一个 Management 节点配置为主节点,并且在主 Management 节点发生故障时可以接管一个或多个其他 Management 节点。
有关如何配置 NDB 群集 Management 节点的信息,请参见第 21.3.3 节“ NDB 群集配置文件”
|
**A.10.34. ** |我可以在一个 NDB 群集中混合使用不同种类的硬件和 os 吗?|
||是的,只要所有机器和 os 都具有相同的“字节序”(所有大字节序或所有小字节序)。
也可以在不同节点上使用来自不同 NDB Cluster 版本的软件。但是,我们仅在滚动升级过程中支持这种使用(请参阅第 21.5.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?|
|| SQL6 节点(MySQL 服务器)之间的连接支持 IPv6,但是所有其他类型的 NDB 群集节点之间的连接必须使用 IPv4.
实际上,这意味着您可以使用 IPv6 在 NDB 群集之间进行复制,但是同一 NDB 群集中的节点之间的连接必须使用 IPv4.有关更多信息,请参见第 21.6.3 节“ NDB 群集复制中的已知问题”
|
**A.10.38. ** |我如何处理具有多个 MySQL 服务器的 NDB 群集中的 MySQL 用户?
|| MySQL 用户帐户和特权通常不会在访问同一 NDB 群集的不同 MySQL 服务器之间自动传播。 MySQL NDB Cluster 提供了对分布式特权的支持,您可以按照文档中提供的步骤启用它。有关更多信息,请参见第 21.5.12 节,“使用共享授予 table 的分布式特权”

[!TIP|label:Important]




在 NDB 8.0 中,用于处理在 NDB Cluster SQL 节点之间分配或共享的用户的机制发生了显着变化。此实现与 NDB 7.6 及更早版本中的实现不兼容。有关详细信息,请参见使用 NDB_STORED_USER 的分布式 MySQL 特权



|
|

> **A.10.39. ** |如果其中一个 SQL 节点发生故障,如何 continue 发送查询?|
|| MySQL NDB Cluster 在 SQL 节点之间不提供任何类型的自动故障转移。您的应用程序必须准备好处理 SQL 节点的丢失并在它们之间进行故障转移。
|

> **A.10.40. ** |如何备份和还原 NDB 群集?|
||您可以在 NDBManagementClient 端和ndb_restore程序中使用 NDB Cluster 本机备份和还原功能。参见第 21.5.8 节“ NDB 群集的在线备份”第 21.4.24 节“ ndb_restore-还原 NDB 群集备份”

> 您也可以在mysqldump和 MySQL 服务器中使用为此目的提供的传统功能。有关更多信息,请参见第 4.5.4 节“ mysqldump-数据库备份程序”
|

> **A.10.41. ** |什么是“天使过程”?|
||此进程监视并在必要时尝试重新启动数据节点进程。如果您在启动ndbd之后检查系统上活动进程的列 table,则可以看到实际上有 2 个以该名称运行的进程,如下所示(为简便起见,我们省略了ndb_mgmdndbd的输出):

> shell> ./ndb_mgmd

> Shell> ps aux | grep ndb

> 我 23002 0.0 0.0 122948 3104 吗? Ssl 14:14 0:00 ./ndb_mgmd

> 我 23025 0.0 0.0 5284 820 pts/2 S 14:14 0:00 grep ndb

> shell> ./ndbd -c 127.0.0.1 --initial

> Shell> ps aux | grep ndb

> 我 23002 0.0 0.0 123080 3356 吗? Ssl 14:14 0:00 ./ndb_mgmd

> 我 23096 0.0 0.0 35876 2036 吗? Ss 14:14 0:00 ./ndbmtd -c 127.0.0.1 --initial

> 我 23097 1.0 2.4 524116 91096? Sl 14:14 0:00 ./ndbmtd -c 127.0.0.1 --initial

> 我 23168 0.0 0.0 5284 812 pts/2 R 14:15 0:00 grep ndb

> 显示0.0table 示内存和 CPU 使用率的ndbd进程是 angel 进程(尽管实际上每个进程使用的数量很少)。该进程仅检查主ndbdndbmtd进程(实际处理数据的主数据节点进程)是否在运行。如果允许这样做(例如,如果StopOnError配置参数设置为false),则 angel 进程将尝试重新启动主数据节点进程。