2008-10-18 39 views
7

无法完全无状态的大型网站如何在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。在这种特定情况下,仅使用多个应用程序服务器集群是可行的,每个应用程序服务器集群都在自己的负载平衡器后面。有趣的是,我没有找到使用这种概念的网站。 编辑:我发现这个概念discussedhighscalability.com,这里的讨论是指雷珠的一篇文章命名为"Client Side Load Balancing for Web 2.0 Applications"。雷珠用透明脚本来透明地做这个客户端负载平衡。

即使存在缺陷,如书签,xss等,我认为这对于某些特殊情况听起来像是一个非常好的主意,即几乎无需内容的web应用程序,这些应用程序不需要被蜘蛛或书签(例如票务预订系统或类似的东西)。那么就不需要透明地进行负载平衡。

可能存在从主站点到服务器的简单重定向,例如,从www.ticketreservation.com重定向到a17.ticketreservation.com。从那里用户停留在服务器a17。 a17不是服务器,而是集群本身,可以实现冗余。

初始重定向服务器本身可能是负载均衡器后面的集群。这样,可以实现非常高的可扩展性,因为www后面的主要负载均衡器在每个会话开始时只被击中一次。

当然,重定向到不同的URL看起来非常讨厌,但对于单纯的Web应用程序(无论如何不需要被蜘蛛,深层链接或深藏书签),这应该只是用户的光学问题?

重定向集群可以轮询应用集群的负载并相应地调整重定向,从而实现平衡而不仅仅是负载分布。

回答

1

Ea SY。无状态的Web服务器负载均衡。持有会话数据的应用程序服务器(中间层)不是。 Web服务器可以使用您的会话ID cookie来确定要联系的应用程序服务器。

Memcached和微软的Velocity是解决这个确切需求的产品。

编辑:Web服务器如何知道要联系哪个应用程序服务器?这嵌入到会话ID哈希中,并且可以按照您的喜好一般地完成。它可以像你的会话ID是server:guid一样简单。尽管如此,Memcached的基础是散列。

重要的一点是,客户端必须能够找出无状态联系的应用服务器。最简单的方法是将其嵌入到密钥中,尽管注册表(可能在其自己的层上)也可以工作,并且可以提供一些容错功能。

编辑2:回到some Ebay interviews,我可能已经得到他们的执行细节有点不对。他们不做缓存,他们不在中间层做状态。他们所做的工作是按功能划分负载平衡的中间层(应用程序服务器)。所以,他们会有一个服务器池,例如查看物品。然后另一个销售物品池。

这些应用程序服务器有一个路由到分片数据库的“智能”DAL(由功能和数据分区,因此Database1上的用户A-L,Database2上的用户M-Z,Items1上的项目1-10000等)。

它们在中间层没有状态,因为它们是按功能分区的。因此,普通的用户体验将涉及超过1个应用服务器池。假设您查看某个项目(ViewAppServerPool),然后对项目(BidAppServerPool)进行出价。所有这些应用程序服务器都必须保持同步,然后需要分布式缓存来管理所有内容。但是,它们的规模非常大,没有分布式缓存可以有效地管理它,单个数据库服务器也无法进行管理。这意味着他们必须分割数据层,并且任何缓存实现都必须跨越相同的边界进行分割。

这是类似我以上贴的东西,只是向下移动了一层。应用程序服务器决定与哪个数据库联系,而不是让Web服务器确定要联系哪个应用程序服务器。只有在Ebay的情况下,由于其分区策略,它实际上可能会击中20多个数据库服务器。但是,无状态层又有一些它用来联系有状态层的规则。然而,Ebay的规则比我上面解释的简单化的“User1在Server10上”的规则要复杂一些。

+0

无状态Web服务器如何找到正确的应用程序服务器? 每个Web服务器都必须知道任何应用程序服务器持有的每个会话吗?会不会是这种可怕的通信开销? – SAL9000 2008-10-19 18:07:54

2

你可能必须要对工程团队在这些地方之一,肯定知道,但还有谁已经从谈判等信息做出的猜测已经走出两地的人:

Ebay ArchitectureAmazon Architecture

只是一个单一的负载本身在今天的世界平衡器一种DNS轮过去几年的知更鸟的当量。今天,你有像anycast这样的东西,让你玩各种技巧。你可以很确定ebay和amazon这样的喜欢使用负载平衡器,并且他们使用了很多。

您可能要多一点,当你想想它可能是如何工作的,因为很多的流量是无状态的熬下来。在一个页面的单个请求中,可能有很多不需要了解状态的对象。通过从无状态系统提供服务,将这些对象从图片中提取出来(这就是选播进来的地方),并且请求数量急剧下降。

如果不能让你一个单一的负载均衡器可以处理负载点那么接下来的一步就是要打破交易了使用IP路由和/或地理DNS。 eBay和亚马逊这样庞大的网站将分布在众多不同的数据中心中,每个数据中心都有大量的互联网连接。你把所有来自互联网流行任务西部的东西发送到西海岸数据中心的“任务”服务器,任何东西都从西部海岸数据中心“att”服务器发送到任何东西,东海岸数据中心“追求”服务器等等。这些系统中的每一个都可能是一个可以处理负载的单个负载均衡器,一些负载均衡器可以处理数十万次甚至SSL加密的事务。在背面,您会不断向每个数据中心批量复制数据,但它可能不同步。

+0

是的,我确实阅读了highscalability.com上的两篇文章。我发布了这个问题,因为我无法找到有关负载平衡的任何信息。据我所知,Anycast肯定比循环更先进,但也不提供有状态的负载平衡。 – SAL9000 2008-10-18 18:42:38

2

您可能会发现有用的下列文件,该文件提出了一个高度可用的键 - 值存储系统的设计和实施,一些亚马逊的核心服务使用提供一个“永远在线”的体验:

朱塞佩DeCandia,德尼兹Hastorun,马丹Jampani,Gunavardhan Kakulapati,阿维纳什拉克什曼,亚历克斯Pilchin,斯瓦米Sivasubramanian,彼得Vosshall和沃纳·博赫尔斯Dynamo: Amazon's Highly Available Key-Value Store”,在21 ACM研讨会作业系统原理,史蒂文森,华盛顿的议事程序, 2007年10月。

2

我不知道他们是如何做到这一点,但这里有一些建议:

  • 为了避免超载负载平衡器主机本身,使用循环DNS或
  • 重定向不同客户的不同基于负载,设置,地理位置等簇地址

要分发中间层负载,

  • 将会话ID cookie中的中间层会话服务器的ID嵌入 - 如其他人所建议的那样。这种方式你打哪个前端框是无关紧要的,他们可以添加/删除没有任何影响。
  • 如果它足够重要,在会话期间有一种将客户端重定向到替代中间层服务器的机制,这样可以将其中的一个关闭以进行维护等。
  • 客户开始使用新落成的中间层服务器,因为他们开始一个新的会话

要分发后端数据库负载

    的每个帐户或每“实时”
  • “传统的”分片用户数据
  • 异步复制缓慢变化或相对静态的数据;用户可能会看到它过时(但大部分时间不会太多)。中间层和Web服务器连接到本地到自己的位置的数据库