MySQL集群性能优化指南
作者:licqi 时间:2013-06-28阅读数:人阅读
MySQL集群是一款实时、可扩展的事务性数据库。其设计初衷在于为对实时性能要求较高的应用程序打造一套嵌入式电信数据库,并实现运营商级别的可用性。不过MySQL集群也可以通过扩展实现诸多企业级解决方案,例如移动支付系统、实时分析、数据流与分析以及内容管理等事务。MySQL集群的横向扩展能力足以满足密集型工作负载的需求,其集群架构如下图所示:
整信集群由三类节点构成:数据节点、应用程序节点以及管理节点。
表格中的各行将被拆分成多个区块,每个数据节点保留一个区块的主片段及另一个区块的次片段。
如果查询需要多次网络跳转,例如由服务器向数据节点或者在不同数据节点之间,那么性能与可扩展性都可能受到影响。因此,要想让MySQL集群获得最佳性能表现,我们必须尽量减少网络跳转次数。表格划分基于主键散列,但我们可以对其进行重写以提高性能。简单的访问模式是创建可扩展且高性能解决方案的关键。
网络跳转的必要次数取决于来自各分支结构的结果集与接合深度。如果表格的接合深度过大,那么指向数据节点的每一次跳转也将耗费更多时间。要想获得最佳性能,我们需要利用主键查找--其完成时间是恒定的,与数据库规模及数据节点数目没有关系。
使用AQL
通过使用AQL(即适应性查询本地化),性能改善将体现得更为明显。
AQL能够将查询由MySQL服务器指派向全部数据节点,且查询由本地数据副本负责执行。然后它会向MySQL服务器发回合并结果集,从而最终实现减少网络跳转、提高性能表现的目的。
AQ能帮助MySQL集群高效处理涉及大量复杂查询事务的用例。
为了获得更理想的使用效果,大家可以在变更表格模式(包括添加、删除索引或者执行其它重要变更)后在某一台MySQL服务器中运行OPTIMIZE TABLE <tab-name>。
在实际使用环境中的测试结果显示,AQL能够将大量查询事务的整体效率提升70倍。在测试中,一套网络内容存储管理系统中包含有十一套复杂表格,在对其进行正常查询时,整个流程需要耗时87秒。但在AQL的帮助下,整个流程的时耗被直接缩短至1.26秒。
在默认情况下,AQL受到全局变量ndb_join_pushdown的控制。为了能够让AQL切实起效,我们需要对其进行如下规则修改:
分区裁剪能够有效降低小型结果集的延迟状况,但对较大的结果集而言反倒会提高延迟表现。上图中的红色条形代表分区裁剪后的延迟数字。
在这种情况下,应用程序分布机制对于新增额外节点的识别能力就成了保证性能改善的关键。
使用连接池
MySQL集群在多个数据节点进行大量并行操作时的吞吐能力最强。有鉴于此,我们必须同时利用多台MySQL服务器且应用程序的各个线程全部接入这些服务器。要访问数据节点,mysqld进程会默认使用单独的NDB API连接。由于大量应用程序线程同时抢占这一条连接,我们需要设置一套互斥机制以避免吞吐操作发生冲突。
一种方案是让每个应用线程都使用其专用的mysqld进程,但这不仅浪费资源、同时也会增加应用程序的复杂性。
更为高效的方案是如上图所示,建立由mysqld进程向数据节点的多条NDB API连接。
为了使用连接池,每条(来自mysqld)连接都需要在config.ini文件中拥有自己的[mysqld]或者[api]分节号,然后在my.cnf文件中将ndbcluster-connection-pool值设置为大于1。另外,我们也绝不能在启动mysqld进程的同时将ndb-node-ida作为命令行选项。在我们的测试实例中,单一mysqld进程拥有四个NDB API连接。
上图显示了连接池所带来的性能提升。一般来说,应用程序的性能普遍能获得70%的提升,但在某些特殊情况下、其提升幅度可能超过150%。
添加节点以实现扩展
MySQL集群在设计思路中纳入了横向扩展考量。能够添加额外的MySQL服务器或者数据节点,大家可以显著提升整体性能。
我们还能够向处于运行状态的MySQL集群中添加新的MySQL服务器或者节点组。也就是说,我们完全不必关机并重新加载集群。现有表格中的数据将被重新划分到所有接入数据节点当中。最安全的处理方式是使用MySQL Cluster Manager。这款集群管理器能自动处理关于额外节点添加的所有事务,而且我们不必担心整个过程会造成任何服务丢失。
总结
在过去九年中(自2004年起),MySQL集群已经逐步成为一款成熟的解决方案,能够满足极端性能水平要求以及高达99.99%的严格正常运行标准。正如在文章开头所说,自适应查询本地化、参数调整以及分布感知等特性令MySQL集群在性能方面更上一层楼,从而有能力服务于更广泛的应用组合方案。作为数据库技术的核心要素,实时监控与报告功能的强化也帮助数据库开发人员及管理员们得以更好地在MySQl集群中扩展自己的用例。
原文链接:
http://www.agileload.com/agileload/blog/2013/03/11/optimizing-the-performance-of-mysql-cluster

- 数据节点通常负责数据访问与存储事务。
- 应用程序节点提供由应用程序逻辑层及应用API指向数据节点的链接。
- 管理节点在集群配置体系中的作用至关重要,并在网络分区环境下负责负载指派。
- 交易平台/系统;
- 支付网关;
- 用户配置管理;
- 多人网络游戏;
- IMS服务;
- DHCP宽带接入;
- VoIP及视频会议。



- 要加入的列必须使用同一种数据类型,包括VARCHAR长度列在内。
- 无法对指向BLOB或TEXT列的连接起效。
- 不支持显式封锁,但我们可以通过基于NDB存储引擎锁定的隐式行实现同等效果。
- 无法对明显由HASH或者RANGE进行划分的连接起效。



本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:licqi@yunshuaiweb.com
上一篇:MySQL主从配置的一些总结