你知道大型网站是如何做负载均衡的吗:大型网站负载均衡解决方法(2)

发表于:2014-06-26来源:未知作者:未知点击数: 标签:负载均衡
会话状态管理 在完整的 用例 中,应用程序通常需要在各个步骤之间与用户交互。在用户实现其目标的过程中,他们在交互时所作的每个响应会影响可供用

会话状态管理

在完整的用例 中,应用程序通常需要在各个步骤之间与用户交互。在用户实现其目标的过程中,他们在交互时所作的每个响应会影响可供用户使用的选项和应用程序的状态。术 语"会话状态"通常用于描述这种以用例为中心的状态。此会话状态的一部分仅仅用于跟踪任务的进度,并在使用结束后丢弃该部分;如果用例成功结束,则将会话 状态的其他部分保存在数据库中进行长期存储。例如,在使用联机购物车的用户选择结帐按钮(购物车中至少有一个项目时,才会启用该按钮)之前,很少要求该用 户提供支付或运送信息。

分布式应用程序通常通过网络连接调用远程服务器上的软件组件。应用程序必须跟踪在各步骤之间会话状态发生的更改,以提供它们之间的连续性。应用程序设计人员通常在以下三个基本位置中的某一个维护会话状态:

•客户端。应用程序设计人员将每个用户的会话状态存储在用户的计算机上。

•中间服务器。应用程序设计人员将会话状态存储在一台在客户端计算机与永久存储用户信息的数据库服务器之间作为中介的计算机上。

•数据库服务器。应用程序设计人员将会话状态与其他长期应用程序和用户数据一起存储在数据库服务器中。

只有中间服务器方法影响此模式。每种方法及其优缺点在 Designing for Scalability with Microsoft Windows DNA [Sundblad00] 的第 2 章"Designing for Scalability"中有详细说明。

如果所有服务器都是无状态的(就是说,在服务器处理请求后,服务器的状态将还原为默认值),一个简单的解决方案(如图 1 中所示的解决方案)就足够了。在两种情况下服务器可以是无状态的。其一,客户端不需要会话;也就是说,每个请求都是单独的工作单元,并且在请求之间没有持 续存在的临时值。其二(称为"客户端会话管理"),客户端本身将保存会话的状态,并在请求内发送会话状态信息,以便任何服务器都可以检查到请求,并继续处 理它。

在服务器会话管理方案中,服务器负责维护用户会话的状态。服务器会话管理要求负载平衡器将同一个用户会话内来自一个客户端的所有请求定向到同一个服务器实例。此机制通常称为"服务器关系"。

会话管理本身的一个问题是:如果服务器因出现错误或进行维护而脱机,则可能会丢失客户端的工作,而且客户端必须重新发送丢失的会话中已经发送的所有 请求。在某些情况下,偶然丢失会话对用户来说不是大问题。例如,在联机地图搜索应用程序中,如果服务器丢失用户刚键入的地址,用户重新键入该地址不会是一 件太麻烦的事情。但是,在其他情况下,会话丢失可能是极其不便的。例如,在具有无状态客户端的联机租用应用程序中,用户可能要花费 10 分钟的时间才能将几页有价值的信息键入到合约表格中。如果负载平衡组中的一台服务器脱机,您当然不希望用户再花费 10 分钟重新键入所有信息。为避免因负载平衡组中的服务器出现故障而导致的会话丢失,可以使用以下两种方法:集中式状态管理和异步会话状态管理。图 2 显示集中式状态管理。

图 2:负载平衡和集中式状态管理

集中式状态管理方法将会话状态信息存储在一台与应用程序服务器处于不同层的集中式服务器上。应用程序服 务器每次收到作为会话一部分的请求时,它先从会话管理服务器提取会话状态,然后处理该请求。会话管理服务可以是运行在存储了共享资源并且具有高可靠性配置 的服务器上的数据库或另一类型的应用程序。有关如何改进共享资源上的容错的详细信息,请参阅 Failover Cluster 模式。

图 3 显示异步会话状态管理。

图 3:负载平衡和异步会话状态管理

使用异步会话状态管理方法时,每台服务器只要发生会话状态更改,就会将其会话状态广播给所有其他服务 器;因此,每台服务器都包含所有会话的状态信息,而且任何服务器都可以处理包含在会话中的请求。会话状态还会在单独的服务器出现故障之后继续存在。因为不 需要额外的设备,所以此解决方案更经济;但是,因为它涉及异步调用,所以其配置和维护更困难。在每台服务器上存储所有会话的状态还会导致效率更低。

原文转自:http://blog.sina.com.cn/s/blog_c34954a30101tkhl.html