2009-09-14 100 views
8

我正在构建一个将处于荒谬负载下(每秒数千到数万个查询)的web服务。我的Apache,PHP,memcache和一些数据库的正常堆栈将能够处理它与一个很好的负载平衡器infront和大量的机器,但我想知道是否有更好的解决方案。高可伸缩性技术堆栈

端点将被一个信标(通过客户端上的javascript)命中,我将读取用户的cookies,从数据库中提取一些小信息,缓存它,做一些小的计算,发送响应和如果需要,写入数据库并使缓存无效。

好的技术选择和/或硬件建议?

回答

13

这不是一个问题,可以在其他任何地方回答这个问题,而不是一个广泛的概述。一些一般性的指针:

  • 硬件:的两个选择,基本上很多小的,便宜的盒子或更少数量的更强大的框。便宜的盒子价格便宜,但通常比相同的CPU或内存消耗更多的电力(对您而言很重要)。人们经常忘记耗电量有时很大的成本;
  • 后端:你有几个选择,从镇(甲骨文,SQL Server)的大端到商品化的最终(MySQL)。 MySQL显然更便宜,你可以在MySQL上使用更多的东西,但毫无疑问,Oracle(我比SQL Server更熟悉)具有更好的优化器,更强大并且比MySQL更强大。但是,您将支付它;
  • 预算:这是一个巨大的因素,因为它可能是值得支付好的商业软件,而不是支付使用“免费”软件的开发成本。软件开发是所有人中最昂贵的成本之一;
  • 垂直和水平可伸缩性:你基本上想要在这里回答的问题是你建立(更大的箱子等)还是构建(集群环境)。最具可扩展性的解决方案具有接近线性的水平可扩展性,但在较短期内,垂直可扩展性可能更便宜。

至于你的普通堆栈,我会坚持下去,除非你有特别的要求,你没有提到禁止它。毕竟,PHP是一种经过验证的技术,可以运行互联网(Facebook,维基百科,Flickr和我认为雅虎)前20个网站中的4个左右。如果对他们来说足够好,那对你来说已经足够了。

更重要的是,你知道它。技术堆叠你知道王牌技术堆栈,几乎在任何情况下都不会。注意最新的炒作技术堆栈的“绿色牧场”陷阱。

Memcache很好。另一件你可能想考虑添加到混合中的beanstalkd是一个分布式工作队列处理器。

要回答的一个重要问题是:您可以如何很好地分配您的应用程序?轻松实现分区的应用程序更容易扩展。那些不倾向于以某种方式进行修改以使其更易于分区的方式。

一个很好的例子就是一个简单的sharetrading应用程序。您可以根据股票代码(一台服务器上的A-C,另一台服务器上的D-F等)划分市场信息。对于很多这样的应用程序来说,这将运行良好

5

http://highscalability.com/这里有很多东西需要学习,你会很可能找到你的答案。

+1

我的目标不是一个大的可扩展系统,只是一个简单的技术堆栈。搜索,爬虫等仅仅是一个简单的请求,查询,响应和存储任何关于我的目的的技术堆栈建议? – 2009-09-14 06:46:10

+0

从我所看到的,你可以用任何技术堆栈构建可伸缩的系统。每秒数以千计的查询“是非常高的,因此对我来说这是一个”大型可扩展系统“,任何技术栈都有其成功的故事,如果你想支持这个收费,你需要阅读这个网站(也许考虑使用键/值存储为CouchDB而不是关系数据库) – 2009-09-14 07:07:37

0

PHP,memcached + DB总的来说可以很好地扩展,但是可能有更低成本的方法,即能够处理每台机器更多并发请求的堆栈。

鉴于您的评论在这里...

我的目标不是一个大的可扩展的系统,只是一个简单的技术堆栈。我没有增长数据库,搜索,爬虫等。只是简单的请求,查询,响应和存储。对于我的目的,技术堆栈的任何建议?

..这听起来像DB的一部分可能是亚马逊的S3([什么?!?] [1])解决,假设你只需要通过密钥找到项目。如果你不介意eventual consistency,那么这也会给你Cloudfront的读数。

同时,服务器端使用async IO来处理请求应该会显着提高每台机器可以处理的并发请求数。另一个海报已经说龙卷风(bret.appspot.com/entry/tornado-web-server)值得一看 - 没有看到异步IO的API更友好。

您可能仍然需要memcached来保持快速读取,但是您要注意,memcached客户端在尝试发出并发请求时不会阻止服务器进程--PHP通常不会这个问题在每个PHP(或Apache)进程都有自己的memcached连接,并且一次只做一件事。 This python client - 应该支持异步IO - 底层的libmemcached支持异步请求。

同样适用于从服务器到S3的HTTP请求 - 您如何处理并发请求? boto似乎使用连接池,每个连接持有不同的套接字打开。内存使用?

声明:我在这里成为一名扶手椅架构师 - 并没有真正做到这一点,最聪明的建议可能会按时完成项目,而且你知道的并且不会失败。

很抱歉的链接

[1] - http://www.nektoon.com/t/1Z99Daaa

1

您也可以考虑使用BigPipe来提高你的表现。 Facebook也在大量使用它,这就是他们对此的看法:“为了利用Web服务器和浏览器之间的并行性,BigPipe首先将网页分成多个小块,称为小页面,正如流水线微处理器将指令的生命周期分成多个阶段(例如“取指令”,“指令解码”,“执行”,“寄存器回写”等),BigPipe将页面生成过程分成几个阶段:

请求解析:web服务器解析和健康检查HTTP请求 数据获取:Web服务器从存储层获取数据 标记生成:Web服务器为响应生成HTML标记。 网络传输:响应从Web服务器传输到浏览器。 CSS下载:浏览器下载页面所需的CSS。 DOM树构造和CSS样式:浏览器构造文档的DOM树,然后在其上应用CSS规则。 JavaScript下载:浏览器下载页面引用的JavaScript资源。 JavaScript执行:浏览器执行页面的JavaScript代码。

前三个阶段由Web服务器执行,最后四个阶段由浏览器执行。每个小页面必须顺序遍历所有这些阶段,但BigPipe允许在不同阶段同时执行几个小页面。“