1

我正在与一个小团队合作运行一个使用 PHP 5.3.9、MySQL 5.0.77 运行的内部网站。所有文件和数据库都托管在具有以下配置的专用 Linux 机器上:

Intel Xeon E5450 8 CPU cores @3.00GHz, 2992.498 MHz, Cache 6148 KB, Cent OS – Red Hat Enterprise Linux Server 5.4 版

我们从小开始,然后数据库变得更大,现在网站性能显着下降。我们经常遇到服务器空间溢出、mysql 因调用过多而过载等问题。我们没有太多处理这些问题的经验。我们最近得到了另一台服务器,我们正在考虑使用它来提高性能。由于它具有更好的配置,我们中的一些人希望将所有东西完全转移到新机器上。但我试图找出我们如何利用这两台机器来优化性能。我找到了诸如 MySQL 集群、负载均衡器等选项。我想知道是否可以针对这种情况获得任何建议“如何在短期内利用两台机器以获得最佳性能”,那太好了。从短期来看,我们正在寻找可以在一个月左右部署的东西。

在此先感谢您的时间。

4

3 回答 3

3

使网站在具有某种负载平衡的两台服务器上运行比您预期的要困难得多......

我解决这个问题的方法是让团队中的某个人调查与数据库相关的问题,例如慢速查询(MySQL 可以配置为记录任何花费超过一定时间才能完成的查询),然后检查原因(使用 MySQL EXPLAIN)。很少有索引可以解决关键故障点,让您有时间提出可靠的长期解决方案。如果数据库的优化非常糟糕,这甚至可以消除现在做任何其他事情的需要!

您可以将 MySQL 移动到同一网络中的另一台机器上,这样您就可以分离 Web 服务器负载和 DB 负载。

考虑缓存一些不经常更改但在网站上的每个请求上加载的数据部分。Memcached、redis 缓存、文件缓存,什么都可以。

另一个短期解决方案(与开发人员的时间相比更便宜)是用 SSD 替换 HDD,特别是如果您有磁盘需要大量查找的查询。根据我的个人经验,这可能会产生巨大的影响。

于 2012-11-21T23:08:51.453 回答
1
  • 您使用的是 2009 年 1 月发布的 MySQL 5.0.77。MySQL 的性能和可扩展性有了很大的改进。您应该升级到当前版本,即撰写本文时的 5.5.28。仅此一项就应该会给您带来很多性能改进。

  • 您应该分析您的查询以确保您有精心选择的索引。这是提高性能的关键步骤。请参阅我的演示文稿如何设计索引,真正了解如何做到这一点的一些技巧。

  • 在现代版本的 MySQL 中,InnoDB 几乎总是比 MyISAM 更好的存储引擎选择。始终进行测试以确保,因为在某些极端情况下 MyISAM 可能仍然运行得更快。尽管 InnoDB 有更多的调优参数,但设置好它们很重要,因为默认值太低而无法获得良好的性能。您可以在我的演示MySQL 5.5 Guide to InnoDB Status中获得一些关于调整 InnoDB 配置参数的见解。

  • 您应该将数据库放在与您的应用程序分开的专用服务器上。对性能的最佳单一改进通常是增加您投入的内存量innodb_buffer_pool_size(假设您使用 InnoDB 存储引擎)。

  • 正如@Veseliq 建议的那样,为您的数据目录升级到 SSD 驱动器是提高性能的好方法。

  • 也配置 MySQLtmpdir以使用您的 SSD 驱动器。

  • 如果您无法获得 SSD 驱动器,那么下一个最好的选择是带有回写缓存的 RAID 控制器。

  • 设置 MySQL 配置skip_name_resolve以消除应用程序连接时对 DNS 反向查找的依赖。如果这样做,则需要通过 IP 地址而不是主机名授予 SQL 权限。

  • 其他各种 Linux 调优改进:

    • 在您的数据目录上使用XFS文件系统,而不是 Linux 默认的 ext3。
    • 使用noatime选项挂载文件系统。
    • 使用截止日期磁盘 I/O 调度程序,而不是 Linux 默认的 cfq。
于 2012-11-21T23:28:52.340 回答
0

最简单的第一步是将数据库和前端应用程序进程分开,将它们放在不同的机器上。mysqld这通常使您可以通过修改设置为进程分配更多内存my.cnf

与往常一样,更新到最新版本的堆栈和后端,以确保最大限度地利用硬件。

密切注意系统上运行的数据库调用,看看是否有任何方法可以加快这些调用。EXAMINE例如,通常可以显示任何给定调用的执行策略SELECT,并且会揭示您缺少索引的位置,这通常是最大的性能拖累。如果您遇到“表扫描”或“使用文件排序”的问题,那么您在大型数据集上基本上就死定了。您需要索引或不同的架构。

第二步是添加更多的前端应用服务器,并添加某种负载均衡器。这为您提供了额外的前端容量以更好地处理负载,但也会使您的数据库负载更多。

第三步是确保您在通话JOIN过程中没有进行任何不必要的操作。SELECT非常仔细地检查您需要从数据库中获取的内容,并尝试一次从一张表中获取所有内容。战术反规范化通常是这里的解决方案,但如果您不小心正确地执行此操作,则会出现同步问题。当你这样做时要密切注意,并确保你有广泛的测试覆盖率。

第四步通常是通过使用像Memcached这样的缓存来缓冲数据库上的大量读取活动,以避免经常访问数据库。请记住,最快的数据库调用是您不调用的。

没有灵丹妙药,但如果你按照这个顺序做事,你应该有一个战斗的机会。

于 2012-11-21T23:33:05.203 回答