kon*_*ung 33 mysql ruby-on-rails
我们正在对当前系统进行概述,试图弄清楚我们是否可以提高性能和可靠性.
目前我们运行一堆内部Rails应用程序和基于Rails的网站.有些已经是Rails 3,有些正在转换为Rails 3.它们都连接到以下MySQL安装程序.
mysql01 ( master server) => mysql02 (slave) =>(每日数据库备份到驱动器,每天,每周,每月和每半年备份).
所有写入都发生在mysql01上,大多数短读取也会发生,一些"更耗资源的读取"(如每月/每周报告需要3-10分钟才能运行并将数据转储到csv或备份中)转到mysql02服务器.我们每天访问我们的网站大约3-5K,并且有大约20-30个内部用户,每天使用各种应用程序进行库存,订单处理等.因此,除了那些报告之外,这些服务器并不是特别重负荷.无论如何,奴隶的奔跑.
所有服务器都在virtualized XENDebian Lenny VM上的池中运行.
所以我们正在对系统进行审查,有人提出了切换到MySQL Cluster (NDB)设置的建议.我在理论上知道它,但从未实际运行它.任何有过这方面经验的人都知道任何赞成与我们当前的设置,以及涉及Ruby/Rails应用程序时的任何特别警告吗?
小智 73
最近发布到文档的InnoDB和MySQL Cluster(ndb)有一个很好的比较......值得一看:http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-compared. HTML
集群体系结构由应用程序访问的MySQL服务器池组成; 这些MySQL服务器实际上并不存储集群数据,数据是通过下面的数据节点池进行分区的.每个MySQL服务器都可以访问所有数据节点中的数据.如果一个MySQL服务器更改了一个数据,那么所有其他MySQL服务器都可以立即看到它.
显然,这种架构使得扩展数据库变得非常容易.与分片不同,应用程序不需要知道数据的保存位置 - 它可以在所有可用的MySQL服务器之间进行负载平衡.与使用MySQL复制扩展不同,Cluster允许您扩展写入以及读取.可以将新数据节点或MySQL服务器添加到现有群集,而不会丢失对应用程序的服务.
MySQL Cluster的无共享架构意味着它可以提供极高的可用性(99.999%+).每次更改数据时,它都会同步复制到第二个数据节点; 如果一个数据节点出现故障,那么应用程序读取和写入请求将由备份数据节点自动处理.
由于MySQL Cluster的分布式特性,一些操作可能会更慢(例如,具有数千个中间结果的JOIN - 尽管有一个原型解决方案可用于解决此问题)但其他操作可以非常快并且可以非常好地扩展(例如,主要密钥读写).您可以选择在内存或磁盘上存储表(甚至列),并选择内存选项(在backgoround中将更改检查点设置为磁盘)事务可以非常快.
MySQL Cluster可能比单个MySQL服务器更复杂,但它可以防止您在应用程序中实现分片或读/写分割.秋千和环形交叉路口.
要从MySQL Cluster中获得最佳性能和可伸缩性,您可能需要调整应用程序(请参阅群集性能调优白皮书:http://www.mysql.com/why-mysql/white-papers/mysql_wp_cluster_perfomance.php).如果您拥有该应用程序,这通常不是什么大问题,但如果您正在使用其他人无法修改的应用程序,则可能会出现问题.
最后要注意的是,它不需要全部或全部 - 您可以选择将一些表存储在Cluster中,一些表使用其他存储引擎,这是一个每表选项.您还可以在群集和其他存储引擎之间进行复制(例如,将Cluster用于运行时数据库,然后复制到InnoDB以生成复杂报告).