MySQL集群常见问答(3)

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

21. 【问答原文如果发生一次灾难性的故障 —— 例如,整个城市断电,并且我的UPS已经失效 —— 我会丢失所有的数据么?

所有已提交的事务都会记录日志。因此,虽然发生灾难性故障时,有可能会丢失一些数据,但是丢失的数据是极其有限的。如果尽量减少每次事务执行的操作数量,那么还能进一步减少数据丢失。(无论如何,在每个事务中执行大量的操作并不是一个好主意。)

22. 【问答原文MySQL集群可以使用全文(FULLTEXT)索引么?

当前只有InnoDB(MySQL 5.6.4和更新版本)和MyISAM存储引擎才支持全文(FULLTEXT)索引。若要了解更多信息,请参考《全文搜索功能》。

23. 【问答原文我可以在单台计算机上运行多个节点么?

这是可以实现的,但是并不建议这样做。使用MySQL集群是为了获得数据冗余性,这是不建议这样做的原因之一。要获得这种冗余性的全部好处,每个节点都应当驻留在一台独立的机器之中。如果你在一台独立的机器中放置多个节点,而这台机器又有可能发生故障,那么你就有可能损失所有的这些节点。因此之故,如果你确实需要在一台独立的机器上运行多个数据节点,那么你的MySQL集群的部署方式必须确保当这台机器发生故障时,不会导致它所属的节点分组损失所有的数据节点。

考虑到MySQL集群可以在商用硬件和低成本(甚至无成本)操作系统上运行,一两台额外机器的花费用于保障任务关键数据是非常值得的。还有一点值得注意,用于运行集群管理节点的主机的需求是最小的。使用一个速率为300 MHz的Pentium处理器(或其他等价处理器)和足够的内存就能够满足管理节点的硬件需求了,ndb_mgmdndb_mgm进程只会消耗少量的开销。

MySQL集群允许在一台具有多个CPU或处理器核心的独立主机上运行多个集群数据节点。MySQL集群的NDB 7.0和更新版本还提供一种多线程版本的数据节点二进制文件,你可以在上述的系统中运行这种数据节点。若要了解更多信息,请参考《ndbmtd —— MySQL集群数据节点守护程序(多线程版本)》。

有时候还有可能在相同的机器上同时运行数据节点和SQL节点。这种部署方式的性能表现取决于一系列的因素,例如数据节点和SQL节点进程可用的处理器核心和CPU的数量、磁盘总量、内存总量等等,当你规划这种配置方式时,你必须将这些因素纳入考虑。

24. 【问答原文当使用MySQL集群时,我应当注意有什么限制条件么?

MySQL集群的NDB 7.3和更新版本对NDB存储引擎的表具有以下限制条件:

  • 不支持临时表,带有ENGINE=NDBENGINE=NDBCLUSTER选项的CREATE TEMPORARY TABLE语句将会执行失败,并且返回一条错误消息。

  • NDBCLUSTER存储引擎的表支持的用户自定义分区类型只有KEY和LINEAR KEY。在创建一个NDB表时,如果使用任何其他类型的分区类型,那么创建语句将会执行失败,并且返回一条错误消息。

  • 不支持全文(FULLTEXT)索引。

  • 不支持前缀索引。只能为完整的列建立索引。

  • 不支持空间索引(虽然可以使用空间列)。请参考《空间数据扩展》。

  • NDBCLUSTER存储引擎和其他支持单条语句回滚的事务性存储引擎(例如InnoDB)相比,只支持部分事务和部分回滚。

  • 每张表能够包含的最大属性数量是512个。属性名称的长度不能大于31个字符。对于每张表来说,表名和数据库名的组合长度最大不能超过122个字符。

  • 表中每行的最大尺寸不能超过14 KB,不包括BLOB值。

    每张NDB存储引擎的表都没有设置行数的限制。有很多因素会限制表的尺寸,尤其是每个数据节点的可用内存总量。

若要了解MySQL集群限制条件的完整列表,请参考《MySQL集群的已知限制》。还可以参考《在MySQL集群的NDB 7.3版本中解决的历史问题》。

25. 【问答原文MySQL集群支持外键么?

MySQL集群的NDB 7.3版本添加对外键约束的支持,类似于InnoDB存储引擎。若要了解更详细的信息,请参考《外键约束》和《使用外键约束》。需要外键支持的应用程序应当使用MySQL集群的NDB 7.3和NDB 7.4版本,或更新的版本。

26. 【问答原文我该如何将一个已有的MySQL数据库导入一个MySQL集群?

你可以导入数据库至MySQL集群中,过程差不多就像你在任何其他版本的MySQL上操作一样。除了在这个FAQ的其他地方提到的限制之外,对于需要在集群中存储的所有表的唯一特殊限制就是它们必须使用NDB存储引擎。创建表时必须使用ENGINE=NDBENGINE=NDBCLUSTER选项。

你还可以使用一条或多条ALTER TABLE语句,将使用其他存储引擎的表转换为NDBCLUSTER存储引擎。但是,在进行转换之前,必须保证表的定义和NDBCLUSTER相兼容。在MySQL 5.6中,还需要进行额外的工作。若要了解详细信息,请参考《MySQL集群的已知限制》。

27. 【问答原文MySQL集群的节点是如何相互通信的?

集群节点之间的相互通信可以通过以下三种不同的传输机制之一实现:TCP/IP、SHM(共享内存)和SCI(可扩展一致性接口)。如果有的话,寄宿在同一台集群主机内部的多个节点之间,默认会通过SHM相互通信,但是,这种情况被认为是实验性的。SCI是一种高速率(每秒钟千兆位,甚至更高)、高可用性的通信协议,用于构建可扩展的多处理器系统,它需要专用的硬件和驱动程序。若要了解如何使用SCI作为MySQL集群的通信媒介,请参考《使用高速互连的MySQL集群》。

28. 【问答原文仲裁器是什么?

如果集群中的一个或多个数据节点发生故障,那么就有可能导致不是所有的数据节点都能够相互“看到”对方。事实上,一次网络划分有可能会形成两组相互独立的数据节点,这种情况也被称为“分裂大脑”场景。这种类型的情况是不可取的,因为每组数据节点都会试图表现为好像它就是整个集群。这时就需要一个仲裁器在两组相互竞争的数据节点之间作出决策。

当至少一个节点分组中的所有数据节点都是存活的时,网络划分并不会导致问题,因为集群中的任何一个子集都不能形成一个功能集群。真正的问题是,当任何节点分组中的所有节点不一定全部都存活时,网络划分(“分裂大脑”场景)就有可能发生。这是就需要一个仲裁器。所有的集群节点都会承认相同的节点作为仲裁器,通常它就是管理服务器。然而,你可以将集群中的任意MySQL服务器配置作为仲裁器。仲裁器会接受第一组与其通信的集群节点,然后通知另一组节点停止运行。仲裁器的选择受到ArbitrationRank配置参数的控制,集群中的MySQL服务器节点和管理服务器节点都具有这个参数。在MySQL集群的NDB 7.0.7和更新版本中,你还可以使用ArbitrationRank配置参数来控制仲裁器选择的过程。若要了解这些参数的更多信息,请参考《指定MySQL集群的管理服务器》。

仲裁器的角色并不会给承载其服务的主机造成任何繁重的压力。因此,作为仲裁器的主机不需要特别快速的处理器,也不需要特别大的内存容量,就完全可以胜任集群的仲裁任务。

29. 【问答原文MySQL集群支持何种数据类型?

MySQL集群支持所有常用的MySQL数据类型,包括和MySQL的空间扩展相关的数据类型。但是,NDB存储引擎并不支持空间索引。(只有MyISAM存储引擎才支持空间索引,若要了解更多信息,请参考《空间数据扩展》。)另外,当使用NDB表时,关于索引的使用还有一些不同之处。

注意

MySQL集群的磁盘数据表(也就是说,使用TABLESPACE ... STORAGE DISK ENGINE=NDBTABLESPACE ... STORAGE DISK ENGINE=NDBCLUSTER语句创建的表)只有固定宽度的行。这就意味着,包含一个VARCHAR(255)列的磁盘数据表的记录需要255个字符的存储空间(取决于这个表使用的字符集和排序规则),并不关心在这个列中实际存储的字符数量。

若要了解更多关于这些问题的详细信息,请参考《MySQL集群的已知限制》。

30. 【问答原文我该如何启动和停止MySQL集群?

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

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

    你必须包含-f–config-file选项,告诉管理节点在何处能够找到它的配置文件。

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

    每个数据节点都必须使用-c–ndb-connectstring选项启动,这样数据节点才知道如何连接至管理服务器。

  3. 启动每个MySQL服务器(SQL节点),使用你偏好的启动脚本,例如mysqld_safe

    每个MySQL服务器都必须使用–ndbcluster–ndb-connectstring选项启动。这些选项会使得mysqld开启对NDBCLUSTER存储引擎的支持,并且使其能够连接至管理服务器。

这些命令中的每一条都必须在承载相应节点的机器的系统命令提示符中运行。(你不必直接在这些机器上登录 —— 通过远程登录的命令提示符就可以完成这些工作。)在承载管理节点的机器上,你可以启动NDB管理客户端ndb_mgm程序,然后运行SHOWALL STATUS命令,这样你就能验证集群是否正在运行。

若要关闭一个正在运行的集群,你可以在管理客户端程序中运行SHUTDOWN命令。或者,你可以在系统的命令提示符中输入以下命令:

  1. shell> ndb_mgm -e "SHUTDOWN"

(这个示例中的引号是可选的,因为-e选项之后的命令字符串是没有空格的。另外,SHUTDOWN命令和其他管理客户端的命令一样,也是不区分大小写的。)

这些命令都不会使得ndb_mgm和任意ndbd进程正常终止。作为SQL节点运行的MySQL服务器可以通过mysqladmin shutdown命令停止。

若要了解更多信息,请参考《MySQL集群管理客户端中的命令》和《安全停止和重启MySQL集群》。