我有一个具有不同层的网络应用程序:
- 持久性数据库
- 一些 Web 服务器(mongrels)
- 负载均衡器
现在所有程序都在同一台主机上运行。但是我如何添加另一台服务器来处理更高的负载?
在进一步扩展之前我是否应该分离角色(数据库和网络)?
PS,让我们简化这个问题并忽略该问题中的高可用性问题。
PPS 数据库目前不是瓶颈。我真的想添加更多 Web 服务器,请帮忙
答案1
@gotts:扩展小型网站的规范方式如下所示:
第一的:拆分为 2 个服务器,一个运行 HTTP 服务器和 Web 应用程序代码 (webapp),另一个用于数据库。数据库服务器应针对数据库工作负载进行优化,即大量 RAM、快速磁盘 I/O、快速 CPU。
然后:将静态文件服务从 Web 应用服务器卸载到其他服务器或内容分发网络。考虑在 Web 应用服务器上禁用 HTTP KeepAlive。
然后:转移到至少有 4 个服务器的设置:
- 前端一个 HTTP 负载均衡器,使用基于源 IP 地址的一致性哈希算法。
- HTTP 负载均衡器后面有 2 个 webapp 服务器。
- 在webapps后面,有1个数据库服务器。
这Brad Fitzpatrick 的演讲展示了典型的进展在第一页。如果这一切对你来说都是新的,也许你应该考虑雇佣一个曾经做过这件事的系统管理员…… :-)
答案2
现在所有程序都在同一台主机上运行
愚蠢的想法,还是?我的意思是 - 如果只有一台主机,那么负载平衡器在列表中到底起什么作用?这是对我来说完全没有意义的一件事。
首先要区分角色。特别是因为需求有很大不同(较大的数据库需要更多的 IOPS,这意味着需要很多磁盘)。
然后重新编程,以便多个 Web 服务器可以轻松共存。
最后,如果需要,添加一个负载平衡器,或者使用 DNS 循环。
答案3
为了安全和性能,我倾向于将传入的 http 处理推入表示层(1 个或多个服务器)。静态内容可以在表示层中提供。此外,您的数据库/业务逻辑也不太容易受到攻击。