无法完全无状态的大型网站如何在Web层实现极高的可伸缩性?为了防止负载平衡器瓶颈,分层(原文如此!)Web层?
有像eBay和亚马逊这样的网站,不能完全无国籍,因为他们有一个购物车或类似的东西。将购物车中的每件商品都编码到URL中是不可行的,也不可能将每件商品都编码到cookie中并在每个连接处发送它。因此,亚马逊只是将session-id存储到正在发送的cookie中。所以我明白,eBay和亚马逊的网络层的可扩展性应该比谷歌搜索引擎的可扩展性要难得多,在谷歌搜索引擎中,所有东西都可以编码到URL中。
另一方面,eBay和亚马逊都绝对大规模扩展。有传言说eBay上有15000个J2EE应用服务器。
这些网站如何处理这两个问题:极高的可伸缩性和状态性?由于该网站是有状态的,因此执行简单的DNS平衡并不可行。所以人们会认为这些公司有一个基于硬件的负载均衡器,比如BigIP,Netscaler或类似的东西,这是该站点单一IP地址背后的唯一设备。此负载均衡器将解密SSL(如果编码),检查该cookie并根据该cookie的会话ID来决定哪个应用程序服务器持有该客户的会话。
但是,这不可能正常工作,因为没有单个负载平衡器可能处理数千个应用程序服务器的负载?我会想象,即使这些硬件负载平衡器也不会扩展到这样的水平。
另外,负载平衡是为用户透明地完成的,即用户不会被转发到不同的地址,但仍然全部集体地一直停留在www.amazon.com上。
所以我的问题是:是否有一些特殊的技巧,可以实现像Web层的透明分片(而不是数据库层)?只要未检查cookie,就无法知道哪个应用程序服务器正在进行此会话。
编辑:我意识到只需要透明度,如果有需要蜘蛛和书签的网站。例如。如果该网站仅仅是一个网络应用程序,例如飞机票或火车票预定系统,那么只需将用户重定向到位于不同URL之后的特定网站服务器群即可,例如, a17.ticketreservation.com。在这种特定情况下,仅使用多个应用程序服务器集群是可行的,每个应用程序服务器集群都在自己的负载平衡器后面。有趣的是,我没有找到使用这种概念的网站。 编辑:我发现这个概念discussed在highscalability.com,这里的讨论是指雷珠的一篇文章命名为"Client Side Load Balancing for Web 2.0 Applications"。雷珠用透明脚本来透明地做这个客户端负载平衡。
即使存在缺陷,如书签,xss等,我认为这对于某些特殊情况听起来像是一个非常好的主意,即几乎无需内容的web应用程序,这些应用程序不需要被蜘蛛或书签(例如票务预订系统或类似的东西)。那么就不需要透明地进行负载平衡。
可能存在从主站点到服务器的简单重定向,例如,从www.ticketreservation.com重定向到a17.ticketreservation.com。从那里用户停留在服务器a17。 a17不是服务器,而是集群本身,可以实现冗余。
初始重定向服务器本身可能是负载均衡器后面的集群。这样,可以实现非常高的可扩展性,因为www后面的主要负载均衡器在每个会话开始时只被击中一次。
当然,重定向到不同的URL看起来非常讨厌,但对于单纯的Web应用程序(无论如何不需要被蜘蛛,深层链接或深藏书签),这应该只是用户的光学问题?
重定向集群可以轮询应用集群的负载并相应地调整重定向,从而实现平衡而不仅仅是负载分布。
无状态Web服务器如何找到正确的应用程序服务器? 每个Web服务器都必须知道任何应用程序服务器持有的每个会话吗?会不会是这种可怕的通信开销? – SAL9000 2008-10-19 18:07:54