这是一个很大的问题:)我们正在运行一个LAMP不大的网站,5个LVS负载平衡的Web服务器,3个带有复制和分离读写的MySQL服务器,我们使用Memcached进行caching和一些全文search工具。 到目前为止,它运作良好,因为我们目前没有大量的stream量。
但是当用户快速增长时,我们将不得不扩展我们的架构来满足需求。 也许会介绍分布式文件系统和数据库(和并行计算),还有一些聚类和维护技术(比如Gearman和Pshell)。
网上有一些文章,我可以通过。 但是我真的需要一些实际的经验来切实有效地为这个问题做准备。
扩展Web应用程序和支持基础架构的方法有很多。 Cal Henderson写了一本关于“build立可扩展网站”主题的好书。 这是基于他与Flickr的经验。 除非你慢慢的增长,否则你将遇到许多其他人看到的同样的增长问题。 与其他许多主题一样,缩放是一个不是目的地的旅程。
第一步是使所有事情都可重复,可衡量,可pipe理。 可重复使用的意思是使用像FAI或kickstart这样的工具来安装操作系统,以及类似puppet或cfengine的东西,以便在安装基本操作系统后configuration机器。 通过测量,我的意思是使用像仙人掌,板球或神经节这样的东西来监测你的群集现在的performance。 衡量不仅仅是平均负载,而且还需要多长时间才能呈现页面或服务请求。 在开始时,这些看起来都不重要,但是在系统从负载中倒下之前应该告诉你,并且可以简单地一次添加10台或者100台机器。 根据您的增长计划数据不猜测。
可pipe理的意思是将工具放在适当的位置,以便自动生成和testing尽可能多的configuration。 从你拥有的东西开始,发展它。 如果您要将机器信息存储在数据库中,太好了。 如果没有,你可能有一个电子表格,你可以导出。 如果你还没有把你的configuration放在某种源代码pipe理中。 从数据库自动创buildconfiguration可以使你的压力减小。 在服务器上运行之前对其进行testing,可以使您避免由于拼写错误或其他错误导致服务无法启动。
水平方法假设你可以适当地重复一些事情。 想想你的应用程序。 哪些区域有意义分裂? 什么地方可以并行处理多台机器? 延迟会影响您的应用程序。 你有可能遇到连接限制或其他瓶颈? 你问你的Web服务器还处理邮件传递,数据库或其他杂务?
我曾在数百个Web服务器的环境中工作。 对于不同types的负载,事物应该被分开。 如果你有大量的数据文件很less改变,把它们分开,从主动变化的“东西”可能会提供更多的空间来提供静态和dynamic数据。 不同的工具更适合不同的负载。 Apache和Lighttpd在某些方面工作良好,Nginx对其他方面更好。
看看代理和caching。 在用户和应用程序之间以及应用程序的各个部分之间。 我读到你已经在使用memcache,这有帮助。 根据您的应用程序stream量,在您的负载均衡器和Web服务器之间放置像perlbal或pound这样的反向代理可能是有意义的。
在某些时候,您可能会发现MySQL master(N * slave)复制没有跟上,您需要对数据库进行分区。 对数据库进行分区可能涉及设置另一层数据pipe理。 许多人使用另一个带有memcache的数据库进行pipe理。 在我工作的一个地方,我们用大多数数据的主复制对,另外一对用10个读奴隶来指向数据。
这只是我在几百台机器上工作时遇到的一些问题的简单描述。 没有什么东西从几台机器上升到几百台。 我敢肯定,成千上万的发展也是如此。
关于这个话题最近出现了很多很好的文献。 从高可扩展性开始,许多最好的东西都喜欢从那里。 你可以看一下Digg的技术博客 ,了解我们如何做事,还可以接触到像SAGE这样的资源 – SAGE名单上的人是一个很好的资源。
大多数Web应用程序用户群的高速增长需要开发人员在DB前面使用memcache。 应该计算数据并保存在caching中。 这将有助于减less向用户请求的页面提供数据所需的时间。