如何扩展web应用程序


How to scale a web application

我的基本问题是:如何开始构建一个可以快速增长的web应用程序?

一个小背景:我的一个客户要求提供一个网络应用程序。我不能详述,但这是一种电子商务和众筹的事情。因此,他想花一些钱,并期望一个网站可以无限增长。

我计划用Zend Framework 2和MySql来构建它。我的问题是我没有使用大规模网络应用程序的经验。我到处都读到:没问题,只要开始这个项目,如果它变得很大,你就可以对它做出反应,添加缓存、集群等。

但这真的是真的吗?还是我必须从一开始就添加一些可伸缩性机制?例如,云服务器(AmazonEC2)对文件系统有不同的方法。以后可以换吗?或者负载平衡呢?我在会话处理方面有问题,还是没有?MySql呢?还是直接从NoSql方法开始更好?

所以我目前的计划是:

  • 步骤1:使用ZF2和MySql正常构建web应用程序
  • 步骤2:添加缓存,如memcache和操作码
  • 步骤3:MySql集群还是NoSql,负载平衡还是云服务器

更新:

好吧,我知道我的问题有点太宽泛了。所以我试着把它归结为几个具体的问题:

  • 最好直接从云服务器开始
  • 云服务器可以无限增长吗

您的计划:

Step 1: Build the web application normally with ZF2 and MySql.
Step 2: Add caching like memcache and opcode
Step 3: MySql cluster or NoSql or load balancing or cloud server??

这是我的建议:

Step 1: Build the web app on CodeIgniter with MySQL (lighter, and faster than ZF2 with MySQL)
Step 2: Do memchace, opcode and don't forget phpfpm 
Step 3: Use Amazon EC2 and use their Load Balancing features to load balance between servers.

缩放是一件复杂的事情,不同的项目有不同的需求。我最近读了一本关于扩展PHP应用程序的好书。也许这可以帮助你:https://leanpub.com/scalingphp

一书中的一些提示

  • 传入请求的负载平衡器
  • 1个Mysql主服务器用于写入,x个Mysql从服务器用于读取(如果主服务器宕机,则可以升级从属服务器
  • 使用会话存储我认为这本书推荐Reddis(不确定,几周前)
  • 运行Nginx而不是Apache

就个人而言:

  • 这可能与品味有关,但我建议将Laravel作为一个PHP框架,它比ZF更轻,(再次品尝…)更优雅

目前我还不记得这本书中的更多内容,但如果你不能获得足够的信息,请通过电子邮件与我联系,我会查找的。

我是否必须从一开始就考虑扩展,或者以后添加这些技术(如负载平衡和会话存储)是否容易

我从书中了解到,在他们(Twitpic)的案例中,在项目变得很大并经历了很多停机时间后,规模就开始了。在我看来,考虑一下你想采取的缩放步骤是件好事。当您的项目需要扩展时,可以扩展专用的(我的)SQL服务器或负载均衡器。但是,当您计划使用会话存储服务时,我建议您从一开始就使用它,这样您就不必在需要扩展时重写代码。此外,一些会话存储服务在RAM中存储尽可能多的信息,这降低了执行时间。

此外,当你设置服务器时,我会说从Nginx开始,它使用的资源比Apache少。