MySQL集群常见问答(2)

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

11. 【问答原文MySQL集群可以使用什么样的文件系统?能不能使用网络文件系统或网络共享?

通常, MySQL集群应当可以很好地兼容于主机操作系统的任何本地文件系统。如果你发现某个给定的文件系统在MySQL集群中的性能非常好(或者不是特别好),我们邀请你在MySQL集群技术论坛中讨论你的发现。

对于Windows来说,我们建议你为MySQL集群选用NTFS文件系统,正如我们对标准MySQL的建议一样。我们没有为MySQL集群测试FAT或VFAT文件系统。因为这个原因,我们不建议MySQL或MySQL集群使用这些文件系统。

MySQL集群是一种无共享解决方案的实现。隐藏在这种无共享之后的构想便是:如果单个硬件发生故障,那么不应当导致多个集群节点发生故障,甚至不应当导致作为一个整体的集群发生故障。因此之故,MySQL集群不支持使用网络共享或网络文件系统。这种限制也适用于诸如SAN的共享存储设备。

12. 【问答原文我可以在虚拟机(例如,VMWare、Parallels或Xen)中运行MySQL集群么?

从MySQL集群的NDB 7.2版本开始,MySQL集群便支持在虚拟机中使用。我们当前已经在Oracle VM中通过测试。

某些MySQL集群的用户已经使用其他的虚拟化产品成功部署了MySQL集群。在这种情况下,Oracle可以提供对MySQL集群的支持,但是虚拟化环境的特定问题必须咨询虚拟化产品的制造商。

13. 【问答原文我正在尝试填充一个MySQL集群数据库。加载过程过早地中止,我看到的错误消息如下所述:
ERROR 1114: “my_cluster_table”表已满。
为什么会出现这种错误?

造成这个问题的原因很有可能是你没有为所有的表数据和所有的索引配置足够的内存。这些索引包括NDB存储引擎所必需的主键索引,如果你没有在表定义中明确定义一个主键,那么集群会在事件中自动创建一个主键。

还有一点需要注意,所有的数据节点应当具有相同的内存容量,因为集群中的每个数据节点能够使用的内存容量不会大于它们当中内存容量最小的那个成员。例如,若集群中有四台计算机用于承载数据节点,其中的三个数据节点拥有3GB的内存可用于存储集群数据,而另外一个数据节点只有1GB的内存,那么集群中的每个数据节点实际上最多只能使用1GB的内存来存储MySQL集群的数据和索引。

在某些情况中,你有可能会在MySQL客户端应用程序中看到“表已满”的错误消息,即使ndb_mgm -e “ALL REPORT MEMORYUSAGE”命令明确地提示还有空闲的数据内存(DataMemory)。你可以强迫NDB为MySQL集群的表创建额外的分区,从而可以使用更多内存来存储散列索引,这些散列索引是由CREATE TABLE语句的MAX_ROWS选项创建的。通常,将MAX_ROWS选项的值设置为你预期的数据库表存储行数的两倍应当就足够了。

出于类似的原因,当数据节点重新启动时,你有时也会遇到由于这个节点的数据负载过重而导致发生问题。在MySQL集群的NDB 7.1和更新的版本中,已经增加了MinFreePct参数,这个参数会将一部分(默认为5%)的数据内存(DataMemory)索引内存(IndexMemory)保留给节点重启时使用。这部分保留的内存不能用于存储NDB的表或数据。

14. 【问答原文MySQL集群使用TCP/IP协议。这是不是意味着我可以在互联网上运行MySQL集群,将一个或多个节点部署在远程区域中?

想要在这种环境中可靠地运行MySQL集群是不大可能的,因为MySQL集群是在一个假定环境的基础上设计和实现的,这个环境能够确保MySQL集群的各个节点能够通过专用的高速链路实现互相通信,通常使用100Mbps或1000Mbps速率的以太网(后者更好)。我们没有在更慢的环境中进行测试,也不保证在这些环境中的性能。

另外,有一点请务必要牢记在心,MySQL集群节点之间的通信是不安全的,它们没有使用任何加密算法,也没有使用任何其他的安全保护机制。一个集群最安全的配置便是将其部署在隐藏于防火墙之后的私有网络中,任何人都无法从外部直接访问集群的任何数据节点和管理节点。(对于SQL节点,你应当采取和任何其他的MySQL服务器实例相同的预防措施。)若要了解更多信息,请参考《MySQL集群的安全问题》。

15. 【问答原文我需要学习一门新的编程语言或查询语言才能使用MySQL集群么?

不需要。虽然确实有一些专用命令可用于管理和配置集群本身,但进行下列操作时,只需要使用标准的MySQL语句即可:

  • 创建、转换和删除表
  • 插入、更新和删除表数据
  • 创建、修改和删除主键索引和唯一索引

当配置MySQL集群时,需要用到一些专用的配置参数和文件。若要了解更多信息,请参考《MySQL集群的配置文件》。

你可以在MySQL集群的管理客户端(ndb_mgm)中执行一些简单的命令,这样便能执行诸如启动和停止集群节点等管理任务。请参考《MySQL集群管理客户端程序中的命令》。

16. 【问答原文MySQL集群支持何种编程语言和API?

MySQL集群和标准的MySQL服务器支持的编程语言和API是相同的,包括ODBC、.NET、MySQL C API等等,以及为数众多的用于主流脚本语言的驱动程序,包括PHP、Perl和Python等等。使用这些API编写的MySQL集群应用程序的行为类似于其他的MySQL应用程序,它们会将SQL语句发送至MySQL服务器(若使用MySQL集群,则发送至SQL节点),然后接受包含数据行的响应。若要了解关于这些API的更多信息,请参考《连接器和API》。

MySQL集群还支持使用NDB API编写的应用程序,NDB API提供一个底层的C++接口,通过这个接口便能直接访问MySQL集群的数据,而不需要通过MySQL服务器去查询。请参考《NDB API》。另外,基于C语言的MGM API会向开发者公开很多NDBCLUSTER管理函数。若要了解更多信息,请参考《MGM API》。

MySQL集群(NDB 7.1和更新版本)还支持使用ClusterJ编写的Java应用程序,它支持使用会话和事务的数据域对象模型。若要了解更多信息,请参考《Java和MySQL集群》。

MySQL集群(NDB 7.2和更新版本)还支持memcached,开发者可以通过memcached的接口访问存储在MySQL集群中的数据。若要了解更多信息,请参考《用于MySQL集群的ndbmemcache—Memcache API》。

MySQL集群的NDB 7.3版本添加新的适配器,它们支持使用Node.js编写的NoSQL应用程序,这些应用程序将MySQL集群用作数据存储器。若要了解更多信息,请参考《MySQL的用于JavaScript的NoSQL连接器》。

17. 【问答原文MySQL集群包含任何管理工具么?

MySQL集群包含一个命令行客户端,可以用于执行基本的管理功能。请参考《ndb_mgm —— MySQL集群管理客户端》和《MySQL集群管理客户端程序中的命令》。

MySQL集群管理器还支持MySQL集群的NDB 7.0和更新的版本,它是一个独立的产品,能够提供一个高级的命令行接口,使得很多MySQL集群的管理任务能够自动化执行,例如滚动重启和配置修改。若要了解关于MySQL集群管理器的更多信息,请参考《MySQL集群管理器1.3.6用户手册》。

MySQL集群的NDB 7.3版本引入一个图形化的、基于浏览器的自动安装器,可用于设置和部署MySQL集群,它是MySQL集群软件发行版的一部分。若要了解更多信息,请参考《MySQL集群自动安装器》。

18. 【问答原文当我使用MySQL集群时,我该如何找出一个错误或警告消息的意思?

有两种方法可以用于查询此类消息:

  • 在MySQL客户端中,使用SHOW ERRORSSHOW WARNINGS命令会立即提示错误或警告发生的条件。

  • 在系统命令提示符中,使用perror --ndb <error_code>命令。

19. 【问答原文MySQL集群是事务安全的么?它支持哪种隔离级别?

是的。对于使用NDB存储引擎创建的表来说,MySQL集群是支持事务的。现在,MySQL集群仅支持读提交(READ COMMITTED)事务隔离级别。

20. 【问答原文MySQL集群支持哪种存储引擎?

MySQL集群只支持NDB存储引擎。也就是说,为了使一张表能够在MySQL集群的数据节点之间共享,创建这张表时必须使用ENGINE=NDB选项(或者等价的ENGINE=NDBCLUSTER选项)。

你也可以在MySQL服务器上使用其他的存储引擎创建表(例如,InnoDBMyISAM),但是由于这些表没有使用NDB存储引擎,它们就不能在集群中共享。使用非NDB存储引擎创建的表只能在创建它的单台MySQL服务器中使用。