Rails 3应用程序的MySQL集群(NDB)与MySQL复制(InnoDB):优缺点?

Rails 3应用程序的MySQL集群(NDB)与MySQL复制(InnoDB):优缺点?,mysql,ruby-on-rails,Mysql,Ruby On Rails,我们正在对当前系统进行概述,试图找出是否可以提高性能和可靠性 目前,我们运行一系列内部Rails应用程序和基于Rails的网站。有些已经是Rails 3,有些正在转换为Rails 3。它们都连接到以下MySQL设置 mysql01(主服务器)=>mysql02(从服务器)=>(每天将数据库备份到驱动器,每天、每周、每月和半年备份一次) 所有写操作都发生在mysql01上,大多数短读操作也会进入mysql01,一些“更消耗资源的读操作”(如运行并将数据转储到csv或备份中需要3-10分钟的月报/周

我们正在对当前系统进行概述,试图找出是否可以提高性能和可靠性

目前,我们运行一系列内部Rails应用程序和基于Rails的网站。有些已经是Rails 3,有些正在转换为Rails 3。它们都连接到以下MySQL设置

mysql01(主服务器)=>mysql02(从服务器)
=>(每天将数据库备份到驱动器,每天、每周、每月和半年备份一次)

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

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


因此,我们正在对系统进行审查,有人建议切换到
MySQL集群(NDB)
setup。我在理论上知道它,但从未实际运行过。那么,有过it经验的人是否知道与我们当前的设置相比有什么优点/缺点,以及在涉及Ruby/Rails应用程序时有什么特别的注意事项?

最近发布到文档中的InnoDB和MySQL Cluster(ndb)有一个很好的比较……值得一看:

集群体系结构由应用程序访问的MySQL服务器池组成;这些MySQL服务器实际上并不存储集群数据,数据是通过下面的数据节点池进行分区的。每个MySQL服务器都可以访问所有数据节点中的数据。如果一台MySQL服务器更改了一段数据,那么其他所有MySQL服务器都可以立即看到该数据

显然,这种体系结构使扩展数据库变得非常容易。与分片不同,应用程序不需要知道数据存放在哪里——它只需要在所有可用的MySQL服务器之间实现负载平衡。与使用MySQL向外扩展不同,复制群集允许您扩展写入和读取。可以将新的数据节点或MySQL服务器添加到现有集群,而不会丢失应用程序的服务

MySQL集群的无共享架构意味着它可以提供极高的可用性(99.999%+)。每次更改数据时,数据都会同步复制到第二个数据节点;如果一个数据节点出现故障,则备份数据节点将自动处理应用程序的读写请求

由于MySQL集群的分布式特性,有些操作可能会比较慢(例如,有数千个临时结果的连接-尽管有一个原型解决方案可以解决这个问题),但其他操作可能非常快,并且可以非常好地扩展(例如主键读写)。您可以选择将表(甚至列)存储在内存或磁盘上,通过选择内存选项(将更改检查点设置为backgoround中的磁盘),事务可以非常快速

MySQL集群的设置可能比单个MySQL服务器更复杂,但它可以防止您必须在应用程序中实现分片或读/写拆分。秋千和回旋处

为了获得MySQL集群的最佳性能和可伸缩性,您可能需要调整您的应用程序(请参阅集群性能调整白皮书:)。如果您拥有该应用程序,这通常不是什么大问题,但如果您使用的是其他人的应用程序,您无法修改,那么这可能是一个问题


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

谢谢-回答得非常透彻。这是最有价值的回答。