高可扩展性技术堆栈

时间:2009-09-14 06:30:27

标签: language-agnostic architecture hardware scalability

我正在建立一个负载荒谬的网络服务(每秒数千到数万个查询)。我正常的apache,PHP,memcache和一些数据库的堆栈将能够使用一个很好的负载均衡器和很多机器来处理它,但我想知道是否有更好的解决方案。

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

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

6 个答案:

答案 0 :(得分:13)

除了广泛的概述之外,这不是可以在这里回答的问题。一些通用指针:

  • 硬件:这两个选择基本上是很多小而便宜的盒子或更少数量更强大的盒子。更便宜的盒子更便宜,但通常比相同的CPU或内存消耗更多的电量(对你来说重要),而不是更大的盒子。人们常常忘记有时需要大量的电力消耗;
  • 后端:您可以从大城市(Oracle,SQL Server)到商品化端(MySQL)做出一些选择。 MySQL显然更便宜,你可以在MySQL上走得很远,但毫无疑问,Oracle(我比SQL Server更熟悉)拥有更好的优化器,功能更强大,并且比MySQL更强大。但是你会支付它;
  • 预算:这是一个重要因素,因为它可能值得为优质商业软件付费而不是支付使用“免费”软件的开发成本。软件开发是最昂贵的成本之一;
  • 纵向和横向可扩展性:您基本上要在此处回答的问题是您是否构建(更大的盒子等)或构建(群集环境)。最具扩展性的解决方案具有接近线性的水平可扩展性,但在短期内,垂直可扩展性可能更便宜。

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

更重要的是,你知道。技术堆栈你知道几乎在每种情况下你都不会使用特朗普技术堆栈。谨防最新炒作技术堆栈的“绿色牧场”陷阱。

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

要回答的一个重要问题是:您如何对应用程序进行分区?容易进行分区的应用程序更容易扩展。那些不倾向于以某种方式进行修改以使它们更容易分区。

这方面的一个很好的例子是一个简单的共享应用程序。您可以根据股票代码(一台服务器上的A-C,另一台服务器上的D-F等)对市场信息进行分区。对于许多此类应用程序来说效果很好。

答案 1 :(得分:5)

http://highscalability.com/这里有很多值得学习的地方,你可能会找到你的答案。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

龙卷风看起来像我会尝试这种问题http://bret.appspot.com/entry/tornado-web-server至少你知道它是一个久经考验的解决方案。

答案 4 :(得分:0)

我可以为你的筹码贡献一个好组件:MemCache

答案 5 :(得分:0)

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

鉴于此处的评论......

  

我的目标不是一个大型的可扩展系统,只是一个简单的技术堆栈。我不是在增长数据库,搜索,爬虫等。只是一个简单的请求,查询,响应和存储。为我的目的提出技术堆栈的建议吗?

..听起来像亚马逊的S3可以解决数据库部分([什么?!?] [1]),假设您只需要按键查找项目。如果您不介意Cloudfront

,这也会让您eventual consistency进行阅读

与此同时,使用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

相关问题