如何使动态网站高度可扩展?

时间:2010-08-05 16:29:08

标签: php scalability

我们如何制作一个动态网站或以PHP和后端开发的网站作为MySQL高可扩展的社交网站?

8 个答案:

答案 0 :(得分:12)

High Scalability上查看facebook,twitter和youtube等网站的基础设施。它们为您提供了非常好的工具概览(大多数是开源和免费的)。

您应该考虑一下:

  • 反向代理/负载平衡(鱿鱼或清漆)
  • 数据缓存(memcache和memcached)
  • c ++中可能的后端
  • NoSQL(Cassandra,CouchDB,MemcacheDB)

如果您有兴趣,我几周前写了一篇关于该主题的帖子,请查看here

答案 1 :(得分:7)

遵循良好的设计和编程实践,例如低耦合。尝试为您的网站寻找最佳解决方案(设计模式,OO最佳实践),同时考虑可扩展性。

我认为这里没有任何银弹,这取决于每个案例。

冗余也非常重要,因为仍然如此。

尽管如此,首先要注重使最佳设计成为可能,并且在时机成熟时,担心可扩展性。

答案 2 :(得分:3)

担心缩放时需要担心缩放,而不是之前。那时你应该知道答案,或者能够聘请一个人。

让我试着澄清一下这个答案。

缩放是现代开发中一个相当有价值的术语,因为使用design patternsframeworksdatabase abstractionnormalization等“最佳实践”通常是根本原因在极其需要的网站中限制可扩展性的瓶颈。

在软件上投掷硬件基本上可以让你将任何东西扩展到某一点。

此时(您需要在问题上投入更多硬件),您很可能拥有足够的用户群,您可以从您的网站/服务中获利,或者在开源产品的情况下,您可以我可能会有一个以下。这些资源将为您提供更高级别的计算机科学家/工程师的访问权限,这有助于扩展。

在减少硬件压力的水平上进行缩放变得非常反“最佳实践”。您开始编写代码以快速执行非常具体的任务。以Twitter为例,他们基本上重写了Twitter,不再使用ruby on rails,而是使用scala并设计了在performance alone周围成功的功能。另一方面,Facebook已经为compile PHP编写了自定义PHP包。

答案 3 :(得分:3)

这就像问如何建造摩天大楼一样,答案很复杂,取决于很多事情。

但这些问题和建议应该会有很大帮助。

绘制出您的系统设计图。为服务创建逻辑分区,可以在多个服务上进行拆分。为可以逻辑分割的服务创建多个虚拟主机名,例如静态映像托管。确定哪些服务需要在多个请求上持久化,并开发会话位置和缓存系统。

了解MemCached!

将SQL缓存放在sql请求之前。

开始考虑“云” - 考虑创建可以相互通信的“断开连接”虚拟映像,并以结构化方式交换所有状态信息,这与服务器无关。当您做到这一点时,如果您的设计正确,您可以透明地添加更多云服务。

答案 4 :(得分:3)

如前所述,应用程序的可伸缩性取决于许多因素。某些选项可能取决于应用程序,但从一开始就适当的规划始终很重要。

缩放有两种类型,纵向和横向。垂直扩展是旧的“投入更多硬件”方法,意味着升级服务器处理器和/或内存。通过在多个服务器之间添加冗余和跨越资源,水平扩展是适当的扩展方式。通常当人们谈论缩放时,他们意味着横向缩放。

用于扩展的典型Web体系结构至少需要一个负载平衡器,两个或多个Web服务器以及一个或多个数据库服务器。每个图层独立缩放,必须以不同方式处理。例如,您可以添加更多负载均衡器以使站点更具可用性(因此,如果一个均衡器发生故障,其他均衡器不受影响);此层不应要求更改您的应用程序,但需要对DNS和Web服务器软件进行其他更改。相反,添加数据库服务器可能会增加高可用性,增加响应时间,或两者兼而有之。对数据库层的更改可能需要更改应用程序,以便它可以跨多个服务器分割读取和写入。

当然,还有许多其他工具可用于扩展和/或高可用性。示例包括应用程序级缓存(memcached),HTTP加速器(基本上是HTTP级缓存)和替代数据存储方法。

最好的办法是在规划和构建应用程序的基础时牢记这些事项。是否需要最终从不同的数据库服务器进行读写?会话如何存储在本地文件系统(不可伸缩)或中央缓存(可伸缩)中?是否可以缓存这些数据对象,如果是这样,它们过于陈旧需要多长时间?如果你注意这些主要的事情,大多数时候你的应用程序将能够扩展而无需额外的代码库工作。

答案 5 :(得分:1)

在使其高度可扩展之前,请确保它具有高可用性。一切都是冗余是关键。多个服务器,多个站点,多个一切!

答案 6 :(得分:1)

答案 7 :(得分:1)

避免使用“前置控制器”模式。

每个请求都应单独处理,因此您可以单独扩展每个部分。尝试使用“前端控制器”模式执行此操作是不可能的,因为不是使用实际上是“前端控制器”的浏览器,而是将它放在您的服务器上,这太晚了,这意味着您无法将请求指向一种独特的资源。

相关问题