负载均衡服务器会话管理
1. 场景
负载均衡服务器是一个集群的请求分配器,负责将外部访问集群的请求分配到集群中的某台机器上。一个特定功能的集群由很多独立的机器组成,这些机器都运行相同的程序接受并服务分配到的请求。
拿WEB服务器为例,A用户对集群内网页的请求,每次都由负载均衡服务器分配到集群中一台机器上的WEB服务进程。在WEB应用的情形下,WEB服务进程通过HTTP请求头内的cookie的ID(如果使用PHP作为服务进程,则该ID可能名为PHPSESSID)来辨别访问者身份,并根据该访问者的操作,在机器中保存一些只服务于该用户的数据。如果该用户没有这样的ID,则认为是新的访问者,并且重新分配一个系统内唯一的字符串来表示该用户。当负载均衡服务器上没有会话管理,也就是说负载均衡服务器随机分配请求到集群机上,那么当该用户在前一台集群机上登录后,第二次请求被分配到林一台集群机,那么该用户又会回到未登录状态。在这种情形下,需要用户反复登录的情况是不能接受的。
负载均衡服务器的会话管理目标是,保证同一用户的每次访问都被分配到同一台集群机,保证用户每次请求的HTTP请求头里cookie的ID都能被认出,从而保证用户访问的连续性。
2. 解决方案
上述关于保证用户访问集群的连续性的问题有多种解决方案
1) 以负载均衡服务器入手,管理某个用户的请求和这些请求被分配到的集群机的对应关系,有了对应关系,之后的用户请求只要通过查询关系表,将请求分配到之前被分配到的集群机上进行服务
2) 在应用程序的会话管理入手,不将会话数据保存在集群机本地,而是所有集群机使用同一个会话数据缓存区,集群机通过查询会话缓存区获取该用户会话id对应的数据
以上第二种方案中的会话数据缓存区一般为memcached这样的缓存服务或redis这样的KV数据库,这种方案在业界普遍使用,但不在本文中讨论。
第一种方案也有多种实现方式
1) 映射访问用户IP到集群机
2) 映射访问用户HTTP请求头的cookie中保存的或者HTTP请求URL中保存的会话ID到集群机
第一种方式将映射实现在TCP/IP协议的IP层,第二种方式讲映射实现在TCP/IP协议的应用层。
由于第一种方式中,负载均衡服务器需要拆网络请求包的层数比较少,所以会有更高的执行效率,使得负载均衡服务器的负载更低,而第二种方式由于负载均衡服务器执行了更多的计算,在访问量大的情况下,会使得负载均衡服务器成为系统瓶颈。
但是第一种方式在一些情况下可能会导致负载不均衡,比如说有大量机器通过一个代理服务器(同一个IP)访问服务器,那么该IP分配到的服务器的负载就会过高。
第一种方法的另一个缺点是,当用户使用的是动态IP访问网络,而该IP会随着时间变化,如PPPoE、移动网络,那么在IP变化后访问被分配到另一台集群机服务时,用户之前访问产生的会话缓存数据就会全部丢失。
所以一般来说,会使用第二种方式帮助负载均衡器进行会话管理,因为cookie或URL带上的会话ID才是唯一的标识。
3. 真实服务器上的会话管理
3.1. Apache负载均衡服务器的会话管理
Apache服务器一般使用mod_proxy_balancer作为负载均衡模块,这个模块通过cookie和URL编码会话ID来实现请求向集群机的对应(stickyness)。Cookie可以通过Apache服务器或者应用程序本身来实现,而URL编码会话ID一般通过应用程序本身实现。下面介绍基于cookie的stickyness。
当使用基于cookie的stickyness,需要配置Apache负载均衡服务器使用cookie中的哪个key对应的值来确定集群机的分配,如通过以下配置:
ProxyPass / balancer://mycluster stickysession=REALNODEID <Proxy balancer://mycluster>de> BalancerMember http://192.168.1.50:80 route=node1 BalancerMember http://192.168.1.51:80 route=node2 </Proxy>
配置的意思是:检索请求集群的HTTP头中cookie里key为REALNODEID的值,如果该值为node1,则将请求转向http://192.168.1.50:80处理,如果该值为node2,则将请求转向http://192.168.1.51:80处理。
同时,在两台集群机的Apache服务器配置文件中,需要添加以下配置:
第一台:Header set Set-Cookie: “REALNODEID=node1”
第二台:Header set Set-Cookie: “REALNODEID=node2”
表示在响应HTTP头中,添加一条cookie,key名为REALNODEID,key值在两台服务器中分别为node1和node2。