Mic*_*ine 4 scaling web architecture
这是一个大问题:)我们正在运行一个网站,其中 LAMP 并不大,5 个 Web 服务器具有 LVS 负载平衡,3 个 MySQL 服务器具有复制和读写分离,我们使用 Memcached 进行缓存和一些全文搜索工具。到目前为止,它运行良好,因为我们目前没有大量流量。
但是当用户快速增长时,我们将不得不扩展我们的架构以满足需求。也许会介绍分布式文件系统和数据库(以及并行计算?),以及一些集群和维护技术(如 Gearman 和 Pshell)。
网上有一些文章,我可以浏览一下。但是我真的需要一些实践经验来切实有效地准备这个问题。
Rik*_*der 12
有许多方法可以扩展 Web 应用程序和支持基础设施。Cal Henderson 写了一本关于这个主题的好书,名为“Building Scalable Web Sites”。这是基于他在 Flickr 上的经历。除非你慢慢成长,否则你会遇到很多其他人都见过的成长问题。与许多其他主题一样,缩放是一个旅程而不是目的地。
第一步是使一切可重复、可衡量和可管理。可重复我的意思是使用 FAI 或 kickstart 之类的工具来安装操作系统,并在安装基本操作系统后使用 puppet 或 cfengine 之类的工具来配置机器。我所说的可衡量是指使用像 cacti、cricket 或 ganglia 之类的东西来监控您的集群现在的表现。不仅要测量平均负载等内容,还要测量呈现页面或为请求提供服务所需的时间。这些在开始时似乎都不重要,但应该在您的系统因负载而崩溃之前告诉您,并且可以使一次添加 10 或 100 台机器变得简单。您的增长计划基于数据而不是猜测。
可管理意味着将工具放置到位以允许您自动生成和测试尽可能多的配置。从你所拥有的开始,然后成长。如果您将机器信息存储在数据库中,那就太好了。如果没有,您可能有一个可以导出的电子表格。如果您还没有,请将您的配置置于某种源代码控制中。从您的数据库自动创建配置可以让您在成长的同时减轻压力。在它们在您的服务器上上线之前对其进行测试可以使您免于因拼写错误或其他错误而无法启动服务。
横向方法假设您可以适当地重复事情。想想你的应用程序。哪些领域值得拆分?哪些领域可以由多台机器并行处理?延迟是否会影响您的应用程序。您遇到连接限制或其他瓶颈的可能性有多大?您是否要求您的 Web 服务器也处理邮件传递、数据库或其他杂务?
我曾在具有数百个 Web 服务器的环境中工作过。对于不同类型的负载,事情应该以不同的方式拆分。如果您有大量很少更改的数据文件,将它们与主动变化的“东西”分开可能会为静态和动态数据提供更多的空间。不同的工具对不同的负载效果更好。Apache 和 Lighttpd 在某些方面工作得很好,Nginx 在其他方面工作得更好。
查看代理和缓存。在您的用户和应用程序之间以及应用程序的各个部分之间。我读到您已经在使用 memcache,这有帮助。根据您的应用程序流量,在您的负载均衡器和 Web 服务器之间放置一个像 perlbal 或 pound 这样的反向代理可能是有意义的。
在某些时候,您可能会发现 MySQL master <-> (N * slave) 复制跟不上,您需要对数据库进行分区。对数据库进行分区可能涉及设置另一层数据管理。许多人使用另一个带有 memcache 的数据库来进行这种管理。在我工作的一个地方,我们对大多数数据使用 master <-> master 复制对,另一对有 10 个 read slaves 作为数据指针。
这只是对我在拥有数百台机器的站点上工作时遇到的一些问题的非常简单的描述。从几台机器增加到几百台机器是无穷无尽的。我相信这同样适用于增长到数千人。