可伸缩性101:如何使用PHP设计可伸缩的Web应用程序?

Leg*_*end 12 php load-balancing amazon-ec2

我正在构建一个Web应用程序,并有几个简单的问题.根据我的学习,在最初构建应用程序时不应该担心可伸缩性,并且应该只在流量增加时开始担心.然而,这是我的第一个网络应用程序,我不太确定我是否应采取一种方法,我以特别的方式设计事物,然后"修复"它们.我一直在阅读有关人们如何开始使用应用程序的故事,该应用程序可在一到两周内吸引数百万用户.不是说我会面对同样的情况,但我不禁要问,这些人怎么做呢?

目前,我在Lunarpages上购买了一个共享主机帐户,这让我开始构建和测试应用程序.但是,我有兴趣学习如何使用云以可扩展的方式构建相同的应用程序,例如Amazon的EC2.根据我的理解,我可以看到几个组件:

  • 有一个负载均衡器首先接收请求,然后决定在哪里路由每个请求
  • 然后,此请求由服务器副本处理,然后服务器副本处理请求并更新(如果需要)数据库并将响应发送回客户端
  • 如果有类似的请求进入,那么像memcached这样的缓存机制会进入图片并从缓存中返回对象
  • 处理数据库复制的黑盒子

具体来说,我正在尝试执行以下操作:

  • 设置负载均衡器(我的作业显示HAProxy是一个这样的负载均衡器)
  • 设置复制以便可以同步数据库
  • 使用memcached
  • 配置Apache以使用多个Web服务器
  • 对应用程序进行分区以使用Amazon EC2和Amazon S3(我的应用程序需要大量存储空间)
  • 最后,在使用亚马逊服务时如何避免自我烧伤?因为这只是一个学习阶段,我可以使用简单的负载均衡器和复制来处理2-3台服务器,但直到我想避免意外支付大量资金.

我能够找到有关个别主题的资源,但无法找到从大局出发的内容.有人可以帮我开始吗?

小智 7

就个人而言,我认为你应该考虑你的应用程序最初如何扩展 - 否则你将遇到问题.

我并不是说您最初需要将其构建为多服务器系统,但如果您认为以后需要这样做,请注意现在的问题.

根据我的经验,这包括以下内容:

  • 会话.除非您使用"粘性"负载平衡,否则您必须有一些在服务器之间共享会话状态的方法.这可能意味着将会话数据存储在共享存储或数据库中.

  • 文件上传和复制.如果您允许用户上传文件,或者您有一个允许您上传图像/文档的CMS,则需要满足这些文件还需要找到群集中其他节点的方式.但是,如果您已经沿着上面提到的共享存储路径走下去,这应该涵盖它.

  • 数据库可伸缩性.如果您使用的是传统数据库服务器,您可能需要考虑如何在该级别实现可伸缩性.这可能意味着编写您的应用程序,以便您使用一个连接字符串进行读取,而另一个用于写入 然后,您可以自由地实现复制,其中一个主节点处理插入/更新,将更改级联到只读取处理大量工作的节点.

  • 中间件.您甚至可能希望沿着实现某种面向​​消息的中间件解决方案的路线完全交付业务逻辑功能 - 这将为您在未来扩展此业务逻辑层提供高度灵活性.虽然最初这将是一个很大的复杂性和工作,并没有很大的回报.


Amb*_*ber 1

您是否考虑过先尝试一下虚拟机?您可以在本地计算机上运行 2-3 个虚拟机,并像实际服务器一样设置它们,只是它们无法处理实际流量水平。如果您所寻求的只是学习体验,那么这可能是一种理想的方式。