17.10. MySQL簇常见问题解答

·         使用簇与使用复制的区别是什么?

在复制设置中,主MySQL服务器负责更新1个或多个从服务器。事务按顺序提交,较慢的事务会导致从服务器滞后于主服务器。这意味着,如果主服务器失败,从服务器可能无法记录最近的少数事务。如果使用了事务安全引擎,如InnoDB,要末是在从服务器上完成事务,要末是根本就不记录事务,但复制不保证主服务器和从服务器上的所有数据在任何时候都是一致的。在MySQL簇中,所有的数据节点保持同步,任何一个数据节点提交的事务将被提交给所有的数据节点。当某一数据节点失败时,所有剩余的数据节点仍能保持一致的状态。

简而言之,尽管标准的MySQL复制是异步的,但MySQL簇是同步的。

我们计划在MySQL 5.1中为簇实现(异步)复制功能。包括在两个簇之间,以及MySQL簇和非簇类MySQL服务器之间的复制能力。

·         为了运行簇,我是否需要进行特殊的组网呢?(簇中的计算机是如何通信的?)

MySQL簇是为高带宽环境下的使用而设计的,计算机通过TCP/IP相连。其性能直接取决于簇计算机之间的连接速度。对于簇,最低连接要求包括:典型的100MB以太网网络或等效网络。如果可能,建议使用GB以太网。

也支持更快的SCI 协议,但需要特殊硬件。关于SCI的更多信息,请参见17.7节,“使用与MySQL簇的高速互连”

·         运行簇需要多少台计算机?为什么?

要想运行可行的簇,最少需要3台计算机。但在MySQL簇中,推荐的最低计算机数目为41台负责运行管理节点,1台负责运行SQL节点,2台用作存储节点。使用2个数据节点的目的是为了提供冗余性,管理节点必须运行在单独的机器上,这样,当1个数据节点失败时,仍能保证连续的仲裁服务。

·         簇中不同计算机所负责的任务是什么?

MySQL簇包含物理和逻辑结构,计算机是其物理部件。簇的逻辑或功能部件称为节点,容纳簇节点的计算机有时也称为簇主机。在理想情况下,每台簇主机将有1个节点,但在单个簇主机上可运行多个节点。簇中有三种节点,每一种节点均对应特定的角色。它们是:

1.    管理节点(MGM节点):为整个簇提供管理服务,包括启动、停止、备份、以及为其他节点配置数据。管理节点服务器是作为应用程序ndb_mgmd实现的,用于通过MGM节点控制MySQL簇的管理客户端是ndb_mgm

2.    数据节点:保存和复制数据。数据节点的功能由NDB数据节点进程ndbd的实例负责处理。

3.    SQL节点:这是用“--ndb-cluster”选项启动的MySQL服务器(mysqld)的一个实例。

·         用什么操作系统才能使用簇呢?

MySQL 5.1中,在LinuxMac OS XSolaris平台上均正式支持MySQL簇。我们正在努力为其他平台增加簇支持,包括Windows,我们的目标是,最终在支持MySQL本身的所有平台上实现MySQL簇。

在其他操作系统上运行簇也是可能的。用户告诉我们,他们在FreeBSD平台上超过运行了簇。但是,除了前面介绍的三种操作系统外,在其他平台上运行的簇应被视为alpha软件(最好情况),不保证在生产环境下的可靠性,而且不被MySQL AB支持

·         运行MySQL簇的硬件要求是什么?

在簇运行的任何平台上,应具有具备NDB功能的二进制文件。显而易见,更快的CPU和更多的内存能够改善性能,64CPU的效率很可能高于32位处理器。在用于数据节点的机器上必须有足够的内存,以便容纳各节点共享的数据库部分。(更多信息,请参见我需要多少内存?)。节点能通过标准的TCP/IP网络和硬件进行通信。对于SCI支持,需要特殊的组网硬件。

·         由于MySQL簇使用了TCP/IP,这是否意味着我能在Internet上运行1个或多个节点位于远程位置的簇?

请记住,在MySQL簇中,节点间的通信并不安全,这点极其重要,这类通信未加密,也未采用任何防护机制。对于簇,最安全的配置是位于防火墙后的专用网络,不能从外部直接访问任何簇数据或管理节点(对于SQL节点,应采取相同的防护措施,就像在MySQL服务器的其他实例中那样)。

无论是任何情况,在这类条件下簇的可靠运行十分令人怀疑,这是因为设计和实施MySQL簇时,假定它运行在能保证专用高速连通性的条件下,如使用100MBGB以太网的LAN中(更倾向于后者)。对于低于该要求的任何环境,我们未作任何测试,也不保证其性能。

·         要想使用簇,我是否不得不学习新的编程语言或查询语言?

不。尽管使用了一些专用命令来管理和配置簇本身,但对于下述操作,仅需要标准的(My)SQL查询和命令:

o        创建、更改和撤销表。

o        插入、更新和删除表数据。

o        创建、更改和撤销主索引和唯一索引。

o        配置和管理SQL节点(MySQL服务器)。

·         使用簇时,如何了解错误或警告消息的含义呢?

有两种完成它的方式:

1.    出现错误或告警状况时,在MySQL监视器内,立刻使用SHOW ERRORSSHOW WARNINGS。也能在MySQL Query Browser(查询浏览器)中显示它们。

2.    在系统shell提示符下,使用perror --ndb error_code

·         MySQL簇是事务安全的吗?支持什么隔离级别?

。对于用NDB存储引擎创建的表,支持事务。MySQL 5.1中,簇仅支持READ_COMMITTED事务隔离级别。

·         簇支持的表类型是什么?

NDB是仅有的支持簇功能的MySQL存储引擎。

(能够使用其他存储引擎在用于簇的MySQL服务器上创建表,如MyISAMInnoDB,但这类非NDB表不在簇中)。

·         NDB”的含义是什么?

它是“Network Database”(网络数据库)的缩写。

·         哪些版本的MySQL软件支持簇?我必须从源码编译吗?

5.1系列的所有MySQL-max二进制版本中均支持簇,但下面介绍的除外。使用命令SHOW VARIABLES LIKE 'have_%';SHOW ENGINES;,可检查你的服务器是否支持NDB(更多信息,请参见5.1.2节,“mysqld-max扩展MySQL服务器”)。

Linux用户请注意,NDB未包含在标准的MySQL服务器RPM中。对于NDB存储引擎以及所附的管理工具和其他工具,有单独的RPM软件包。请参见MySQL 5.1下载页上的NDB RPM下载部分(以前,你必须使用以.tar.gz档案方式提供的“-max”二进制文件。目前仍能这样,但却不是必须的,如果愿意,可使用Linux分发版的RPM管理器)。通过从源码编译-max二进制文件,也能获得NDB支持,但使用MySQL簇时,不需要这样。要想只下载最新的MySQL 5.1系列的二进制版本、RPM、或源码分发版,请访问http://dev.mysql.com/downloads/mysql/5.1.html

·         我需要多少RAM?是否能全部使用磁盘内存?

在目前,簇是仅“内存中”的。这意味着所有的表数据(包括索引)均保存在RAM中。因此,如果你的数据占用了1GB的空间,而且打算在簇中将它复制1次,需要2GB的内存。还应加上操作系统以及在簇计算机上运行的应用程序所需的内存。

可以使用下述公司粗略估计簇中每个数据节点所需的RAM量:

(SizeofDatabase * NumberOfReplicas * 1.1 ) / NumberOfDataNodes

要想更准确地计算内存需求量,需要为簇数据库中的每个表确定每行所需的存储空间(详情请参见11.5节,“列类型存储需求”),然后乘以占行数。还必须对列索引进行计算,方式如下:

o        对于为NDB簇表创建的每个主键索引或哈希索引,每记录需要21-25字节。这类索引使用IndexMemory(索引内存)。

o        每个有序索引每记录需要10字节的存储空间,使用DataMemory(数据内存)。

o        创建主键或唯一索引时,还会创建1个有序索引,除非该索引是使用USING HASH创建的。换句话讲,如果未使用USING HASH创建它们,对于簇表上的每个键多因或唯一索引,在MySQL 5.1中,每记录占用31-35字节。

注意,使用USING HASH为所有主键和唯一索引创建MySQL簇表时,通常还能使表的更新速度更快。这是因为,它需要较少的内存(因未创建有序索引),对CPU的占用也较低(仅需读取或更新较少的索引)。

请记住,所有的MySQL簇表必须有主键,这点极其重要。如果未定义,NDB存储引擎将自动创建主键,而且该主键是在未使用USING HASH的条件下创建的。

很难准确确定簇索引在任何给定时间用于存储的内存量,但是,当可用DataMemory/IndexMemory的使用率到达80%时,会将警告消息写入簇日志,到达80%、90%等时,也会写入簇日志。

我们经常遇到用户通报的下述问题,当他们视图填充簇数据库时,加载进程提前终止,并显示下述错误消息:

错误1114:表'my_cluster_table'已满。

出现该情况时,很可能是因为在你的设置中未为所有的表数据和索引提供足够的RAM包括NDB存储引擎所需的主键,以及表定义中不包含主键定义时自动创建的主键。

此外还应注意,所有的数据节点应具有相同的RAM量,这是因为,簇中任何数据节点所能使用的内存均不超过任意单独数据节点的最低可用内存。换句话讲,如果有三台运行簇数据节点的计算机,在其中两台计算机上,有3GB用于保存簇数据的RAM,另一台计算机只有1GB RAM,那么每个数据节点仅能为簇贡献1GB

·         出现灾难性故障时,例如整个城市断电而且我的UPS也出现故障,我会丢失所有的数据吗?

所有已提交的事务将被记录。因此,在出现灾难的情况下,某些数据可能会丢失,但相当有限。通过减少每事务的操作数,能够进一步减少数据损失(在任何情形下,在每事务上执行大量操作都不是一个好主意)。

·         能够与簇一起使用FULLTEXT索引吗?

FULLTEXT索引功能目前不被NDB存储引擎支持,也不被除MyISAM之外的任何存储引擎支持。我们打算在未来的版本中增加该功能。

·         我能在一台计算机上运行多个节点吗?

可以,但不建议这样。运行簇的主要原因之一是提供冗余,为了获得冗余性的全部优点,每个节点应位于单独的计算机上。如果将多个节点置于同一台机器,当该机器出现故障时,所有节点均将丢失。考虑到MySQL簇能运行在常见的硬件上并利用廉价的操作系统(或不需费用),为了确保任务关键型数据的安全,值得为额外的机器户花费开销。此外还须注意,对运行管理节点的簇主机的要求最低,使用200 MHz Pentium CPU,操作系统所需的足够RAM,以及用于ndb_mgmdndb_mgm进程的少量开销,就能完成该任务。

·         我能在不重启的情况下为簇增加节点吗?

目前不行。对于在簇中添加新的MGMSQL节点来说,简单的重启就是所需的一切。添加数据节点时,进程略微复杂些,需要采取下述步骤:

o        对所有簇数据进行完整备份。

o        彻底关闭簇和所有的簇节点进程。

o        使用“—initial”启动选项重启簇。

o        从备份中恢复所有簇数据。

在未来的MySQL簇版本中,我们希望为MySQL簇实现“热”重配置功能,以便能够将添加新节点时重启簇的要求降至最低(如果不能消除的话)。

·         使用簇时有需要我了解的限制吗?

MySQL中的NDB表服从下述限制:

o        并非所有的字符集和校对均被支持。

o        不支持FULLTEXT索引和前缀索引。只能为完整的列设置索引。不支持第19章:MySQL中的空间扩展中介绍的空间扩展。

o        仅支持对事务的完整回滚。不支持部分回滚以及回滚至保存点。

o        每表允许的最大属性数为128,而且属性名称不得超过31个字符。对于每个表,表和数据库名称的最大组合长度为122个字符。

o        表行的最大大小为8KB,不包括BLOB。对于每表中的行数没有限制,表的大小限制取决于多种因素,尤其是每个数据节点可用的RAM量。

o        NDB引擎不支持外键约束。就像MyISAM表一样,这些约束将被忽略。

o        不支持查询高速缓冲功能。

关于簇限制的更多信息,请参见17.8节,“MySQL簇的已知限制”

·         怎样将已有的MySQL数据库导入到簇中?

可以将数据库导入到MySQL簇中,就像用其他版本的MySQL那样。除了前一问题所提到的限制外,仅有的特殊要求是,准备包含到簇中的任何表必须使用NDB存储引擎。这意味着,表必须是用ENGINE=NDBENGINE=NDBCLUSTER创建的。使用ALTER TABLE,能够将使用其他存储引擎的现有表转换为NDB簇表,但需要采取额外避规措施,详情请参见17.8节,“MySQL簇的已知限制”

·         簇节点是怎样彼此通信的?

簇节点能够通过下述三种协议中的任何一种进行通信:TCP/IPSHM(共享内存)和SCI(规模可扩展的计算机连接接口)。在适用的场合,对于位于相同簇主机上的节点间通信,默认协议为SHMSCI是高速(每秒1GB或更高)、高可用性协议,用于创建可扩展的多处理器系统,它需要特殊硬件和驱动。关于使用SCI作为簇中传输机制的更多信息,请参见17.7节,“使用与MySQL簇的高速互连”

·         什么是“arbitrator”(仲裁程序)

如果簇中的1个或多个节点失败,并非所有的簇节点均不能彼此“看到”,这是可能的。事实上,能够在网络分区中将两个节点集合彼此隔离,也称为“分裂大脑”。这类情形并不受欢迎,这是因为,每一个节点集合都试图表现为代表整个簇。

当簇节点出现问题时,有两种可能性。如果剩余节点的50%以上能够彼此通信,那么这就是我们有时称之为的“多数支配”情形,该节点集合将被视为簇。当节点数均等时,仲裁程序将介入:在该情形下,仲裁程序所属的节点集合将被当作簇,不属于该节点集合的节点将被关闭。

上述描述略为简化,更完整的解释需要考虑下面介绍的节点组:

当至少一个节点组中的所有节点均有效时,网络分区不是问题,这是因为,簇中的任一个部分均不能构成1个功能性的簇。当没有一个节点组的所有成员均是有效的时,问题产生,在该情况下,网络分区(“分裂大脑”情形)成为可能。随后就需要仲裁程序。所有的簇节点将相同的节点视为仲裁程序,通常是管理服务器。但是,也能将簇中的任何MySQL服务器配置为仲裁程序。仲裁程序接受第一个与其接触的簇节点集合,并通知剩余的集合关闭。对于MySQL服务器和管理服务器节点,仲裁程序的选择是由ArbitrationRank配置参数控制的(详情请参见17.4.4.4节,“定义MySQL簇管理服务器”)。此外还应注意,仲裁程序不会对指定主机施加过多的要求,因此,仲裁程序主机不需要特别块或拥有用于该目的的额外内存。

·         MySQL簇支持的列类型是什么?

MySQL簇支持所有通常的MySQL列类型,但与MySQL空间扩展有关的例外(请参见第19章:MySQL中的空间扩展)。此外,对于索引,当与NDB表一起使用时存在一些差别。注释:MySQL簇表(即用ENGINE=NDBCLUSTER创建的表)仅有固定宽度列。这意味着(例如)含有VARCHAR(255)列的每一条记录需要256字节来保存列,无论列中保存的数据大小是多少。在未来的MySQL版本中,计划更正它。

关于这些方面的更多信息,请参见17.8节,“MySQL簇的已知限制”

·         如何启动和停止MySQL簇?

需要按照下述顺序分别启动簇中的每个节点:

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

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

3.    使用mysqld_safe --user=mysql &,启动每个MySQL服务器(SQL节点)。

对于这类命令中的每一个,必须在受影响节点所在机器上的系统shell中执行。在容纳MGM节点的机器上启动管理客户端ndb_mgm,可验证簇是否正在运行。

·         当簇关闭时,会对簇数据有什么影响?

由簇数据节点保存在内存中的数据将被写入磁盘,并在下一次启动簇时重新装入内存。

要想关闭簇,请在MGM节点所在的机器上、在shell下输入下述命令:

shell> ndb_mgm -e shutdown

这样就能恰当地中止ndb_mgmndb_mgm、以及任何ndbd进程。对于用作簇SQL节点的MySQL服务器,可使用mysqladmin shutdown停止它。

更多信息,请参见17.6.2节,“管理客户端”中的命令17.3.6节,“安全关闭和重启”

·         簇中有1个以上的管理节点是否有用?

对于可靠性来说它确有帮助。在任何给定的时间,仅需1MGM节点来控制簇,但能够将1MGM配置为主节点,并配置1个或多个额外的管理节点,以便在主MGM节点出现故障时取代它。

·         在簇中能混合使用不同的硬件和操作系统吗?

是。只要所有的机器和操作系统均是相同的endian。也能在不同的节点上使用不同的MySQL簇版本,但是,我们建议仅应将其作为滚动升级的一部分使用。

·         我能在单台主机上运行两个数据节点吗?两个SQL节点?

是,能够这样。在有多个数据节点的情况下,每个节点必须使用不同的数据目录。如果打算在一台机器上运行多个SQL节点,那么每个mysqld实例必须使用不同的TCP/IP端口。

·         我能与MySQL簇一起使用主机名吗?

是,对于簇主机,能够使用DNSDHCP。但是,如果你的应用程序要求“99.999%”的可用性,建议使用固定的IP地址。这是因为,依赖该服务的簇节点间的通信会引入额外的故障点,故障点越少越好。

关注编程学问公众号