如何去扩展一个Web应用程序?

我主要是一个Web应用程序开发人员,对扩展/可伸缩性技术我不太了解。 我的应用程序是用Python编写的,使用Django; 一个相当标准的设置。

我目前使用Apache 2.2作为我的networking服务器,MySQL使用我的数据库服务器; 两个在同一个VPS上运行。

到目前为止,它基本上是一个原型,在任何时候只有15-30个并发用户。 所以我没有问题,但现在,因为我们将增加更多的用户,我们将有性能问题。

所以我的问题是如何去扩展我的networking应用程序? 我目前的计划如下:

  1. 现在我只有一个vps服务器运行,Apache + MySQL。
  2. 接下来,我打算添加另一个vps服务器,只运行MySQL,所以我将有一个networking服务器和一个数据库服务器。
  3. 接下来,我将添加memcache到networking服务器来caching数据,以减轻MySQL的负担。
  4. 接下来,另一个Web服务器为所有静态内容提供服务。
  5. 接下来,一个用于负载平衡的VPS服务器(nginx / varnish)将成为我的两个Web服务器,然后是db-server。

这听起来像一个可行的战略? 请引导我在这里。

你知道你的第一个瓶颈吗? 如果不是的话,你是如何制定事情的顺序呢?

也就是说,如果你的应用程序没有做任何错误的话,你可能会遇到的第一个限制就是数据库引起的磁盘I / O,你的策略可能是一个不错的select。

移动数据库到另一个物理磁盘应该有很大的帮助,是你的第一件事。 例如,根据您使用的系统,在当前主机上使用第二个磁盘或移动到完全分离的服务器之间可能没有区别或差别很大。 你正在VPS上运行,如果你是磁盘I / O绑定移动到第二个VPS将不会有太大的帮助,如果碰巧使用相同的存储(相同的磁盘或相同的SAN或其他) – 但最后一个是一个问题,应该由您的VPS提供商解决。

我build议阅读Theo Schlossnagle的Scalable Internet Architectures 。 本书描述了在服务器之间扩展应用程序的所有理论和实践,确保没有单点故障,扩展数据库等。

你的计划确实听起来像是第一个缩放比例。 通常,一切都从一台服务器上启动,然后拆分networking和数据库,然后添加一个反向代理或负载平衡器,并运行多个Web服务器,依此类推。

你不能改善你没有测量的东西。 首先,你应该看看你的瓶颈是什么。 你现在可以使用,如果你还没有build立某种监控。 如果一切运行良好,可以使用JMeter生成实际负载。

以下是关于在Django应用程序周围构build的基础结构的更多观点。