27

我有一个运行 LAMP 的网络应用程序。我们最近增加了负载,现在正在寻找可扩展的解决方案。扩展 apache 非常简单,我们只需让多台机器托管它并循环传入流量。

但是,每个 apache 实例都会与 MySQL 对话,最终 MySQL 会超载。如何在此设置中跨多台机器扩展 MySQL?我已经看过这个,但特别是我们需要立即使用数据库中的更新,所以我认为复制在这里不是一个好策略?也希望这可以通过最少的代码更改来完成。

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

4

4 回答 4

24

只有两种策略:复制和分片。当您的写入流量较少而读取流量较多时,复制通常会到位,因此您可以将读取重定向到许多从属服务器,但随着时间的推移和不一致的可能性会出现大量复制流量的陷阱。

通过分片,您可以在多台机器上对数据库表进行分片(称为功能分片),这使得连接变得更加困难。如果这不再适合,您还需要在多台机器上对行进行分片,但这并不有趣,并且取决于在您的应用程序和数据库之间实现的分片层。

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

于 2009-04-24T14:45:41.493 回答
2

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

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

于 2014-04-27T20:28:46.353 回答
1

你应该看看MySQL 性能博客。也许你会发现一些有用的东西。

于 2009-04-24T14:47:02.880 回答
0

嗯……祝你好运,将所有这些写入扩展到真正的大规模。数据库引擎成为瓶颈,太多的锁和缓冲区管理和东西......

我发现真正有效的唯一方法是横向扩展,分片,不幸的是,没有为 MySQL “开箱即用”提供分片(就像在某些 NoSQL 中,如 Mongo 一样)。ScaleBase(免责声明:我在那里工作)是一个完整的横向扩展解决方案的制造商,如果你愿意的话,它是一个“自动分片机”。ScaleBae 分析您的数据和 SQL 流,在 DB 节点之间拆分数据,路由命令并在运行时聚合结果——因此您不必这样做!

于 2014-05-20T21:31:14.160 回答