2009-04-24 26 views
24

我有一个运行LAMP的web应用程序。我们最近增加了负载,现在正在寻求解决方案。缩放apache非常简单,我们只需要拥有多台主机并循环传入流量。如何用多台机器扩展MySQL?

但是,apache的每个实例都会与MySQL进行通信,最终MySQL将被重载。如何在此设置中跨多台机器扩展MySQL?我已经看过this,但具体而言,我们需要立即提供数据库的更新,所以我不认为复制是一个很好的策略吗?也希望这可以用最少的代码更改来完成。

PS。我们有1:1的读写比率。

回答

21

只有两种策略:复制和分片。当您的写入和读取流量较少时,通常会进行复制,因此您可以将读取重定向到多个从属设备,但复制流量存在大量时间和不一致的可能性。

随着分片分割你的数据库表跨多台机器(称为功能分片),这使得特别是加入更加困难。如果这再适合你,你也需要在多台机器上分割你的行,但这并不好玩,并且依赖于应用程序和数据库之间实现的分层。

面向文档的数据库或列存储为您完成这项工作,但它们目前针对OLAP进行了优化,而不针对OLTP进行优化。

5

您可能不认为复制不是最佳策略,但请看这link,它提供了一个相当简单和直接的提示,使用复制来帮助平衡多台机器间的负载。

+0

链接已损坏。 – sunnyrjuneja 2012-10-17 18:44:06

0

取决于应用程序后端(即如何处理PK,事务和插入ID),可以考虑使用不同auto_increment设置的MASTER-MASTER复制。这可能很棘手,需要经过彻底测试,但它可以工作。

此外,在新的MySQL 5.6中有一个GTID(全局事务标识符),通常可以帮助保持复制同步,特别是在这种情况下。

0

那么......好运将所有这些写入到一个真正的大规模。数据库引擎成为瓶颈,太多的锁和缓冲管理和东西...

我发现真正有效的唯一方法是向外扩展,分片,不幸的是没有为MySQL“开箱即用”提供分片(就像Mongo等NoSQL一样)。 ScaleBase(免责声明:我在那里工作)是一个完全横向扩展解决方案的制造商,如果你愿意,你可以使用“自动分片机”。 ScaleBae分析您的数据和SQL流,在数据库节点之间分割数据,路由命令并在运行时汇总结果 - 所以您不必!