但是当用户快速增长时,我们将不得不扩展我们的架构以满足需求.可能会引入分布式文件系统和数据库(以及并行计算?),还有一些集群和维护技术(如Gearman和Pshell).
网上有一些我可以通过的文章.但我真的需要一些实践经验来切实有效地为这个问题做好准备.
解决方法
第一步是使一切都可重复,可测量和可管理.通过可重复,我的意思是使用诸如FAI或kickstart之类的工具来安装操作系统,例如puppet或cfengine,以便在安装基本操作系统后配置机器.通过可测量,我的意思是使用像仙人掌,板球或神经节这样的东西来监控你的集群现在的表现.不仅可以测量加载平均值,还可以测量呈现页面或服务请求所需的时间.这些在开始时似乎都不重要,但应该在系统从负载下降之前告诉你,并且可以简单地一次添加10或100台机器.将您的增长计划建立在数据而非猜测上.
可管理意味着将工具放在适当的位置,以允许您自动生成和测试尽可能多的配置.从你拥有的东西开始并发展它.如果您将机器信息存储在数据库中,那很好.如果没有,您可能有一个电子表格,您可以导出.如果您还没有将配置置于某种源代码控制中.从数据库自动创建配置可以让您在压力更小的情况下成长.在它们在您的服务器上运行之前对它们进行测试可以避免由于拼写错误或其他错误导致服务无法启动.
水平方法假设您可以适当地重复.想想你的应用程序.拆分哪些区域有意义?许多机器可以并行处理哪些区域?延迟会影响您的应用程序.您有多大可能遇到连接限制或其他瓶颈?您是否要求您的Web服务器也处理邮件传递,数据库或其他杂务?
我曾在拥有数百个Web服务器的环境中工作过.对于不同类型的负载,事物应该以不同方式分割.如果您拥有很少变化的大量数据文件,那么将它们从主动变化的“东西”中分离出来可能会为提供静态和动态数据提供更多的空间.不同的工具可以更好地适应不同的负载. Apache和Lighttpd在某些方面效果很好,Nginx对其他人的效果更好.
查看代理和缓存.用户和应用程序之间以及应用程序的各个部分之间.我读到你已经在使用memcache了,这有帮助.在负载均衡器和Web服务器之间放置像perlbal或pound这样的反向代理可能有意义,具体取决于您的应用程序流量.
在某些时候,您可能会发现MysqL master< - > (N * slave)复制没有跟上,你需要对数据库进行分区.对数据库进行分区可能涉及设置另一层数据管理.很多人使用另一个带memcache的数据库进行管理.在我工作的一个地方,我们使用了主< - >主要用于大多数数据的复制对,另一对用于10个读取从属用于指向数据的指针.
这只是我在使用数百台机器的网站上遇到的一些问题的一个非常简单的描述.从几台机器到几百台机器的增长是无止境的.我相信成千上万的成长也是如此.