我们正在对当前的系统进行概述,试图弄清楚我们是否可以提高性能和;可靠性

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

mysql01 ( master server) => mysql02 (slave) => ( daily DB backups to a drive, that is backed up on a daily, weekly, monthly & semi-annual basis).

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

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

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

推荐答案

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

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

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

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

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

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

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

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

Ruby-on-rails相关问答推荐

form_with正在try 用错误的路径生成操作

刺激中的Rails 7和 bootstrap 错误-无法解析模块说明符 bootstrap

关系 fields_for 上不允许的参数

Rails 使用多个外键创建/构建

params.permit ruby​​3.2.1 更新后 Active::Record 的未定义方法=~

带有 simple_form 的按钮内的 HTML 代码

如何在 to_json 中获取回形针图像的 url

rails, activerecord, 获取当前连接规范

Rails 3.1 在开发模式下非常慢,因为assets资源 ,怎么办?

不允许请求来源:使用 Rails5 和 ActionCable 时的 http://localhost:3001

未选中时,如何使 check_box_tag 发布false或0参数?

如何将自定义路由添加到资源路由

遇到在早期版本的 Rails 中使用 attr_accessible 的情况时,Rails 4 中的禁止属性错误

导轨链接到:远程

Ruby on Rails - link_to 按钮 / css

在 Devise on Rails beta 3 中创建管理员用户

Heroku Postgres 错误:PGError:错误:关系组织不存在(ActiveRecord::StatementInvalid)

Rails 3 设计,current_user 在模型中不可访问?

如何在 rake 任务中强制 RAILS_ENV?

Rails:如何将日期时间字符串解析为特定时区