2011-03-14 56 views
31

我们正在对我们当前的系统进行概述,试图弄清楚我们是否可以提高性能&的可靠性。MySQL集群(NDB)与MySQL复制(InnoDB)for Rails 3应用程序:优点/缺点?

目前我们运行了一堆内部Rails应用程序和我们基于Rails的网站。有些已经是Rails 3,有些正在转换为Rails 3.它们都连接到下面的MySQL安装程序。

mysql01 (master server) => mysql02 (slave) =>(每日数据库备份到驱动器,每日,每周,每月&每半年备份一次)。

所有的写操作都发生在mysql01上,大部分的短读操作也是如此,一些“更耗费资源的读操作”(比如每月/每周报告需要3-10分钟才能运行并将数据转储到csv或备份)转到mysql02服务器。我们每天大约有3-5,000次访问我们的网站,并且有大约20-30名内部用户,每天使用各种应用程序进行库存,订单处理等。因此,除了这些报告之外,这些服务器并不特别承受重负。无论如何,奴隶的运行。

所有服务器都在Debian Lenny虚拟机上的virtualized XEN池中运行。

因此,我们正在对系统进行审查,并且有人提出了切换到MySQL Cluster (NDB)设置的建议。我理论上知道它,但从未真正运行过它。那么有没有经验的人知道任何pro/cons与我们当前的设置,以及涉及Ruby/Rails应用程序时的任何特定警告?

回答

69

有InnoDB和MySQL集群(NDB)最近发布的文档......一个很好的比较值得考虑看看:http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-compared.html

的集群架构由两个被访问的MySQL服务器池的(多个)应用;这些MySQL服务器实际上并不存储群集数据,数据通过下面的数据节点池进行分区。每个MySQL服务器都可以访问所有数据节点中的数据。如果一台MySQL服务器更改了一段数据,那么它对所有其他MySQL服务器即时可见。

显然,这种架构使得扩展数据库非常容易。与分片不同,应用程序不需要知道数据的保存位置 - 它只能在所有可用的MySQL服务器之间进行负载平衡。与使用MySQL复制进行扩展不同,集群允许您像读取一样扩展写入。新的数据节点或MySQL服务器可以添加到现有的群集中,而不会对应用程序造成任何服务中断。

MySQL集群的无共享体系结构意味着它可以提供极高的可用性(99.999%+)。每次更改数据时,都会同步复制到第二个数据节点;如果一个数据节点出现故障,则应用程序读取请求将由备份数据节点自动处理。由于MySQL Cluster的分布式特性,一些操作可能会比较慢(例如JOIN有数千个中间结果 - 虽然有一个可用的原型解决方案可以解决这个问题),但其他操作可能非常快并且可以极大地扩展好(如主键读写)。您可以选择在内存或磁盘中存储表(甚至是列),并且通过选择内存选项(在backgoround中将检查点设置为磁盘),事务处理可以快速地为非常简短

MySQL集群可能比单个MySQL服务器更复杂,但它可以防止您在应用程序中实施分片或读/写分割。秋千和环岛。

为了获得MySQL Cluster的最佳性能和可伸缩性,您可能需要调整您的应用程序(请参阅集群性能调整白皮书:http://www.mysql.com/why-mysql/white-papers/mysql_wp_cluster_perfomance.php)。如果你拥有应用程序,这通常不是什么大问题,但是如果你使用别人的应用程序,而你不能修改,那么这可能是一个问题。

最后需要注意的是,它不需要全部或全部 - 您可以选择将某些表存储在群集中,还可以选择使用其他存储引擎,这是每个表的选项。您也可以在群集和其他存储引擎之间进行复制(例如,将Cluster用于运行时数据库,然后复制到InnoDB以生成复杂的报告)。

+0

谢谢 - 非常全面的答案。 – konung 2011-03-16 14:50:24