我们有一个高流量的动态网站,每次请求都会生成大量数据库查询,为此配备了两到三台 Linux 服务器,现在我想减少服务器负载,我知道 Squid 反向缓存可以提供帮助,但这是否足够?我还有什么其他解决方案?
答案1
步骤1)修复该死的代码。
为什么每个请求都会产生这么多查询?在将更多移动部件投入到组合中之前,可以优化代码吗?安装 NewRelic 之类的东西来了解应用程序瓶颈在哪里。
步骤2)整理数据库。
您使用索引了吗?您使用得正确吗?
您是否使用了正确的 DB 引擎(MyISAM 与 INNODB)?
是否可以更有效地将内容存储在键值存储中?
步骤3)
缓存所有内容。
从最低级别开始:您的服务器在磁盘上是否有闪存缓存?
你的服务器是否有足够的内存来避免交换?
增加服务器上可用的 RAM 量,以便您可以:
- 使用 memcached 存储数据库查询结果(通常这也需要更改代码库)。
- 使用memcached存储预先生成的页面片段。
- 增加数据库内存限制,以便更多的查询结果存储在内存中。
- 安装 Varnish 反向代理,它将缓存大量页面数据,减轻后端的负载。
将服务器拆分为基于角色的集群。拥有主/从数据库对。编辑代码库,以便进行读/写拆分(读取到从服务器,写入到主服务器)。
答案2
前端缓存/负载平衡器可能会有所帮助。Nginx 和 Varnish 都是很好的选择(我个人觉得 NginX 更容易设置,Varnish 性能更高,但对于只有三个后端服务器来说,两者都足够了)。
但要真正发挥作用,您就需要攻击问题的根源。
由于您不是程序员,因此可以从分析数据库查询开始。MySQL 和 PostgreSQL 都具有“慢查询”日志选项。打开它并尝试获取几个小时(或几天)的实际流量。您可能会发现一些(2-10)非常相似的查询消耗了大部分时间。打开数据库管理控制台并运行EXPLAIN
它们。在大多数情况下,只需确定要添加的正确索引就可以使性能提高 100 倍。而且这无需触及代码!
答案3
我建议使用http://en.wikipedia.org/wiki/Nginx
这将处理缓存等事宜。
答案4
部署像 memcached 这样的集成缓存来减轻数据库的负载。