MySQL集群常见问答(1)

原文链接:Appendix B MySQL 5.6 FAQ: MySQL Cluster

1. 【问答原文哪个版本的MySQL支持集群?我必须从源代码编译么?

标准的MySQL服务器(发行版本为5.6)并不支持MySQL集群。相反,MySQL集群是一个独立的产品。现在,你可以在生产环境中使用下列发行版系列的MySQL集群:

  • MySQL Cluster NDB 7.2:这个系列是MySQL集群的一个一般可用性版本。它仍然可以在生产环境中使用,虽然我们推荐新部署的系统最好使用最新的MySQL集群的NDB 7.3发行版本。最新的MySQL集群的NDB 7.2发行版本可以从 http://dev.mysql.com/downloads/cluster/ 获取。

  • MySQL Cluster NDB 7.3:这个系列是MySQL集群的一个一般可用性版本。它仍然可以在生产环境中使用,虽然我们推荐新部署的系统最好使用最新的MySQL集群的NDB 7.4发行版本。最新的MySQL集群的NDB 7.3发行版本可以从 http://dev.mysql.com/downloads/cluster/ 获取。

  • MySQL Cluster NDB 7.4:这个系列是MySQL集群的一个一般可用性版本。它基于7.4版本的NDB存储引擎和5.6版本的MySQL服务器。最新的MySQL集群的NDB 7.4发行版本可以从 http://dev.mysql.com/downloads/cluster/ 获取。

    若想要大致了解MySQL集群的NDB 7.4版本的改善之处,请查看 MySQL Cluster Development in MySQL Cluster NDB 7.4

你应当在新部署的系统中使用MySQL集群的NDB 7.3版本或NDB 7.4版本。如果你正在使用一个较老版本的MySQL集群,你应当尽快升级至上述的两个较新版本。若想要大致了解MySQL集群的NDB 7.4版本的改善之处,请查看 MySQL Cluster Development in MySQL Cluster NDB 7.4。若想要大致了解MySQL集群的NDB 7.3版本的改善之处,请查看 MySQL Cluster Development in MySQL Cluster NDB 7.3

你可以通过SHOW VARIABLES LIKE 'have_%'语句、SHOW ENGINES语句或SHOW PLUGINS语句,确定你的MySQL服务器是否支持NDB存储引擎。

2. 【问答原文“NDB”和“NDBCLUSTER”的意思是什么?

“NDB”是“网络数据库(Network Database)”的缩写。NDB和NDBCLUSTER都是一种存储引擎的名称,它使得MySQL具有组建集群的能力。这两个名称都是正确的,但NDB更加常用一些。

3. 【问答原文MySQL集群(MySQL Cluster)和MySQL复制(MySQL Replication)的的用法有什么差别?

在传统的MySQL复制中,一个作为主机的MySQL服务器会更新一个或多个从机。事务是按顺序提交的,一个较慢的事务可能会导致从机迟滞于主机。这就意味着,如果主机发生故障,从机就很有可能没有记录最近的几次事务。如果你使用一种事务安全的存储引擎(例如InnoDB),那么每个事务要么彻底执行完成,要么根本不会产生任何作用,但是复制不能保证主机和从机的所有数据始终都是保持一致的。在MySQL集群中,所有的数据节点都是保持同步的,任何一个数据节点提交的事务,都会提交至所有的数据节点。如果某个数据节点发生故障,所有剩余的数据节点都能保持处于一个一致性状态。

简而言之,MySQL集群是同步的,而标准的MySQL复制则是异步的。

在MySQL集群中也可以使用异步的复制。MySQL集群复制(MySQL Cluster Replication)(有时候也被称为“异地复制”)具有在两个MySQL集群之间进行复制,或者在MySQL集群和非集群的MySQL服务器之间进行复制的功能。请参考《MySQL集群复制》。

4. 【问答原文我需要任何特殊的网络才能运行MySQL集群么?集群中的计算机是如何通信的?

应当确保在一个高带宽的环境中使用MySQL集群,计算机之间通过TCP/IP协议进行通信。它的性能直接依赖于集群计算机之间的网络连接的速率。MySQL集群对于网络连接的最小需求包括通用的100Mbps速率以太网网络,或者其他等价的网络。只要条件允许,我们建议你使用千兆以太网。

5. 【问答原文我需要多少台计算机才能运行MySQL集群?为什么?

最少需要三台计算机才能运行一个可维持的集群。然而,我们建议你在MySQL集群中至少使用四台计算机:管理节点和SQL节点分别需要使用一台计算机,数据节点需要使用两台计算机。使用两个数据节点的目的是提供冗余性;管理节点必须要在一台独立的机器上运行,当某个数据节点发生故障时,可以确保仲裁服务不会中断。

若要提高吞吐量和高可用性,你就应当使用多个SQL节点(也就是连接至集群的MySQL服务器)。同样,你还可以运行多个管理节点(虽然没有严格的必要性)。

6. 【问答原文MySQL集群中不同的计算机分别有什么作用?

MySQL集群既有物理组织结构,又有逻辑组织结构,而计算机则是物理组件。集群的逻辑或功能组件被称为节点,被用于承载集群节点的计算机有时候被称为集群主机。集群具有三种类型的节点,每种节点在集群中都具有不同的角色。它们是:

注意

API节点是任何能够直接使用集群数据节点进行数据存储和查询的应用程序。因此,SQL节点在某种程度上也可以被认为是某种类型的API节点,它使用MySQL服务器向外界提供访问集群的SQL接口。你可以使用NDB API编写这样的应用程序(不依赖于MySQL服务器),它可以提供一种对MySQL集群数据直接进行面向对象化的事务和扫描操作接口。若要了解更多信息,请参考《MySQL集群API概述:NDB API》。

7. 【问答原文当我在MySQL集群的管理客户端中运行SHOW命令时,我看见有一行输出信息如下所示:
id=2 @10.100.10.32 (Version: 5.6.27-ndb-7.3.12 Nodegroup: 0, *)
其中的*符号有什么意义?这个节点和其他相比有什么不同?

最简单的回答就是“这并不是你能够控制的事情,总之你不需要关心这些,除非你是一个正在编写或分析MySQL集群源代码的软件工程师”。

如果你对这个答案不满意,下面的答案则是一个更长且更加技术化的版本:

MySQL集群中的许多机制都需要数据节点之间的分布式协调。这些分布式算法和协议包括全局检查点(GCP)、DDL(模式)修改和节点重启处理,等等。为了使这种协调更加简单,所有数据节点会“选举”一个节点作为它们的“领导者”。(这个节点曾经被称为“主节点”,但是,为了防止和MySQL复制中的“主服务器”产生混淆,这个术语现在已经被废弃了。)用户无法影响这个选举的过程,这是完全自动化的。事实上,这种自动化过程是MySQL集群的内部架构的重要组成部分。

当某个节点作为任何这些机制的“领导者”时,它通常是这些活动的协调点,而其他节点则作为“追随者”,在领导者的指示下执行由它们负责的那部分活动。如果作为领导者的节点发生故障,那么剩余的节点将会选举出一个新的领导者。如果由老的领导者所协调的任务正在执行中,那么这个任务有可能失败,也有可能由新的领导者继续协调执行,这取决于实际涉及的机制。

这些不同的机制和协议有时候可能拥有不同的领导者节点,但是总的来说,它们会选择相同的领导者节点。在管理客户端的SHOW命令的输出信息中,领导者节点会通过*符号标识,它也是集群内部的DICT管理员,(若要了解更详细的信息,请参考《MySQL集群API开发者指南》中的《DBDICT块》),负责协调DDL和元数据的活动。

MySQL集群的设计方式能够确保领导者节点的选择不会在集群外界产生明显影响。例如,当前领导者节点的CPU或其他资源的使用率,不会明显高于其他数据节点;当领导者节点发生故障时,对集群产生的影响不应当和其他数据节点发生故障时有明显的不同。

8. 【问答原文我应当使用什么操作系统才能运行MySQL集群?

大多数的类Unix操作系统都支持MySQL集群。在基于微软Windows操作系统的生产配置中也可以使用MySQL集群。

若要了解各种操作系统版本、操作系统发行版和硬件平台对MySQL集群支持程度的更加详细的信息,请参考http://www.mysql.com/support/supportedplatforms/cluster.html。

9. 【问答原文运行MySQL集群有什么样的硬件需求?

MySQL集群可以在任何支持NDB存储引擎的平台上运行。对于数据节点和API节点来说,CPU速率越快、内存容量越大,性能也就会越好,而且64位处理器的性能要明显强于32位处理器。作为数据节点的机器必须具有足够的内存,这样每个结点才能承载各自的共享数据库(若要了解更多信息,请参考《我需要多少内存?》)。对于仅仅运行MySQL集群管理节点的机器来说,硬件需求是最小的,使用普通的桌面级PC(或其他等价的机器)就已经足够了。节点通过标准的TCP/IP网络和硬件即可展开相互通信。MySQL集群还可以使用高速的SCI协议。然而,需要专用的网络硬件和软件才能使用SCI(请参考《MySQL集群的高速互连网络》)。

10. 【问答原文使用MySQL集群需要多少内存?是否可以使用磁盘内存?

MySQL集群曾经只支持内存数据库。MySQL 5.1和更新的版本提供在磁盘上存储MySQL集群数据的能力。(注意,我们没有为老版本提供磁盘存储功能的计划。)若要了解更多信息,请参考《MySQL集群的磁盘数据表》。

对于NDB存储引擎的内存表来说,你可以使用下面的公式粗略估算集群中的每个数据节点需要的内存容量:

  1. (数据库尺寸 × 复制数量 × 1.1) / 数据节点数量

为了更加精确地计算内存需求,你需要确定集群数据库中的每张表的每个数据行所需要的存储空间(若要了解详情,请参考《数据类型的存储需求》),然后乘以这张表的总行数,便能计算得出这张表需要的存储空间了。你还必须记得计算任何列索引的存储空间,如下所述:

  • NDBCLUSTER类型的表创建的每个主键索引或散列索引在每条记录中需要占用21-25字节。这些索引使用IndexMemory。

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

  • 创建一个主键索引或唯一索引,同时也会创建一个有序索引,除非在创建这个索引时使用USING HASH语句。换句话说:

    ① 一张集群表中的每个主键索引或唯一索引通常会在每条记录中占用31-35字节的存储空间。

    ② 然而,如果在创建主键索引或唯一索引时使用USING HASH语句,则只会在每条记录中占用21-25字节的存储空间。

在创建MySQL集群的表时,若对所有的主键索引和唯一索引都使用USING HASH语句,则会导致表的更新操作会运行地更快一些 —— 在某些情况下,会比没有对主键索引和唯一索引使用USING HASH语句的表的更新操作要快20%-30%。这是由于需要使用的内存减少了(因为创建的是无序索引),并且CPU的利用率也会降低(因为必须读取和可能更新的索引更少了)。然而,这就意味着需要通过其他手段实现可能需要使用范围扫描的查询操作,这样可能会导致select操作变慢。

当计算集群的内存需求时,你可能会发现ndb_size.pl工具非常有用,这个工具在最近的MySQL 5.6发行版本中可以找到。这个Perl脚本会连接至当前使用的(非集群)MySQL数据库,然后创建一个报告,估算若使用NDBCLUSTER存储引擎,数据库将需要使用的存储空间大小。若要了解更多信息,请参考《ndb_size.pl —— NDBCLUSTER存储需求估算工具》。

每个MySQL集群表都必须具有一个主键,这是尤其重要的概念,必须牢记在心。如果你没有指定主键,那么NDB存储引擎会自动创建一个主键,创建这个主键时没有使用USING HASH语句。

通过ndb_mgm客户端程序的REPORT MEMORYUSAGE命令,你可以在任意给定的时间内确定存储MySQL集群的数据和索引需要使用的内存容量。若要了解更多信息,请参考《MySQL集群管理客户端程序中的命令》。另外,若数据内存(DataMemory)索引内存(IndexMemory)的使用率达到80%、85%、90%(以此类推)时,便会将警告信息输出至集群日志中。