专利名称:一种基于cookie的负载均衡会话保持算法的制作方法
技术领域:
本发明涉及一种网络通讯技术,具体地说是一种基于cookie的负载均衡会话 保持算法。
背景技术:
Internet用户剧烈增长和Internet流量爆炸式地增长。Internet的飞速发 展给网络带宽和服务器带来巨大的挑战。从网络技术的发展来看,网络带宽的增 长远高于处理器速度和内存访问速度的增长,针对高可伸縮、高可用网络服务的 需求,目前已经给出了基于IP层和基于内容请求分发的负载平衡调度解决方法, 并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸縮的、高可 用网络服务的虚拟服务器。 一组服务器通过高速的局域网或者地理分布的广域网 相互连接,在它们的前端有一个负载调度器(LoAd BAlAncer)。负载调度器能无 缝地将网络请求调度到真实服务器十.,从而使得服务器集群的结构对客户是透明 的,客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一 样。
但目前普遍釆用的源地址会话保持算法易导致负载不均衡的情况而产生的,冈 为现在有很多用户为内网用户,他们利用同一个外部IP进行与外界的联系,所以 对外网的服务来说,如果根据源地址算法,这些客户就是同一个客户,负载均衡 器就会把这些用户的请求发送到同一台服务器,势必会造成单台服务器压力过大。
随着互联网的发展cookie已经用于很多的web服务,服务器可以利用Cookies 包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。 Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示, 是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies 的功用。
本发明是两者的结合体,并且对他们赋予了新的功能。
发明内容
本发明的目的是提供一种基于cookie的负载均衡会话保持算法。 本发明的目的算法是按以下方式实现的,利用cookie来保持负载均衡服务的 连续性,其工作过程是负载均衡器检査请求是否包含有一个特殊的负载均衡用 cookie。如果找不到此cookie,通过一个分布式算法(例如轮询、最小连接等) 选择一个服务器, 一个负载均衡会话cookie被加入到返回的响应中。当浏览器得到此会话cookie,该cookie就会临时保存中内存里,在浏览器关闭后此cookie 将不复存在。在会话中浏览器会把此cookie加入到接下来的所有请求中,然后请 求被发送给负载均衡器。通过将相关服务器作为cookie值,负载均衡器那个判断 哪个服务器将负责处理(一个浏览器会话中的)请求。
为了保证cookie的安全性,可以利用MD5对其进行加密,并在cookie值中加 入源地址信息,保证cookie在传输中的安全性需要。
本发明的有益效果是可以避免大量内网用户利用一个外部IP地址访问 服务,从而导致全部的内网用户集中访问一台服务器的情况的发生,并且在 cookie失效后,基于cookie的负载均衡会话保持算法会为客户端分配新的 cookie,以保证应用的连续性。
附图1为基于cookie的负载均衡会话保持算法工作流程图。 5、实施方式
参照说明书附图对本发明的算法作以下详细地说明。
本发明的基于cookie的负载均衡会话保持算法,是基于cookie的负载均衡会
话保持算法的jAvA程序。具体程序如下
clAss CookieBAsedLoAdBAlAncerHAndler implements IHttpRequestHAndler, ILifeCycle {
privAtefinAlList〈InetSocketAddress〉servers= new ArrAyList<InetSocketAddress〉0: privAte int serverldx = 0: privAte HttpClient httpClient;
/承
* this clAss does not implement server monitoring or heAlthiness checks +/
Public CookieBAsedLoAdBAlAncerHAndler(InetSocketAddress. .. reAlServers) { servers. AddAll (ArrAys.AsList(reAlServers));
public void onlnitO {
httpClient 二 new HttpClient(); httpClient. setAutoHAndleCookies(fAlse);
public void onDestroy() throws IOException { httpClient.close 0;
public void onRequest(finAl IHttpExchAnge exchAnge) throws IOException { IHttpRequest request = exchAnge.getRequest0 : IHttpResponseHAndler respHdl 二 null; InetSocketAddress serverAddr = null; // check if the request contAins the LB—SLOT cookiecl : for (String cookieHeAder : request. getHeAderList ("Cookie〃)) { for (String cookie : cookieHeAder. split C)) { String[] kvp = cookie, split (c"="; if (kvp[O]. stArtsWith (〃LB—SL0T〃)) { int slot = Integer.pArseInt (kvp[l]); serverAddr = servers.get (slot); breAk cl:
// request does not contAins the LB—SLOT —〉 select A server if (serverAddr == null) {
finAl int slot = nextServerSlot0;
serverAddr = servers.get (slot);
respHdl = new IHttpResponseHAndler() { Execution(Execution. NONTHREADED)
public void onResponse(IHttpResponse response) throws IOException // set the LB_SU3T cookie
response.setHeAder(〃Set-Cookie", 〃LB—SU3T=〃 + slot +
〃;PAth:/〃);
exchAnge. send (response); Execution(Execution. NONTHREADED)
public void onException (IOException ioe) throws IOException { exchAnge. sendError (ioe);
} else {
respHdl = new IHttpResponseHAndlerO { @Execution(Execution. NONTHREADED)
public void onResponse(IHttpResponse response) throws IOException
exchAnge. send (response); @Execution(Execution. NONTHREADED)
public void onException(IOException ioe) throws IOException { exchAnge. sendError (ioe);
// updAte the Request-URL of the request URL url = request, getRequestUrl ();
URL newUrl = new URL(url. getProtocol0,serverAddr. getHostNAme (), serverAddr. getPort (), url. getFile());request, setRequestUrl(newUrl);
// proxy heAder hAndling (remove hop-by-hop heAders, ) //….
// forwArd the request httpClient. send(request, respHdl);
// get the next slot by using the using round—robin ApproAch privAte synchronized int nextServerSlot0 { serverldx++;
if (serverldx 〉= servers, size()) { serverldx = 0;
return serverldx;
clAss LoAdBAlAncer {
public stAtic void mAin(String[] Args) throws Exception {
InetSocketAddress[] srvs 二 new InetSocketAddress[] { new InetSocketAddressrsrvl 8030), new InetSocketAddress("srv2", 8030)};
CookieBAsedLoAdBAlAncerHAndler hdl = new
CookieBAsedLoAdBAlAncerHAndler(srvs);
HttpServer loAdBAlAncer = new HttpServer(8080, hdl);
loAdBAlAncer. run();
权利要求
1、一种基于cookie的负载均衡会话保持算法,其特征在于利用cookie来保持负载均衡服务的连续性,负载均衡器检查请求是否包含有一个特殊的负载均衡用cookie,找不到此cookie,通过一个分布式算法,选择一个服务器,一个负载均衡会话cookie被加入到返回的响应中,当浏览器得到此会话cookie,该cookie就会临时保存中内存里,在会话中,浏览器会把此cookie加入到接下来的所有请求中,然后请求被发送给负载均衡器,通过将相关服务器作为cookie值,负载均衡器选择的那个服务器将负责处理浏览器会话中的请求。
2、 根据权利要求1所述的算法,其特征在于分布式算法包括轮询、最小连接。
3、 根据权利要求l所述的方法,其特征在于在浏览器关闭后,cookie自动消失。
4、 根据权利要求1所述的算法,其特征在于方法仅适用于HTTP服务。
5、 根据权利要求1所述的算法,其特征在于客户端浏览器启用cookie服务后 使用负载均衡会话cookie,客户端浏览器禁用cookie服务,则算法自动改为其他 算法。
6、 根据权利要求1所述的算法,其特征在于cookie利用MD5对其进行加密, 并在cookie值中加入源地址信息,保证cookie在传输中的安全性需要。
全文摘要
本发明涉及一种基于cookie的负载均衡会话保持算法,该算法针对目前普遍采用的源地址会话保持算法易导致负载不均衡的情况而产生的,基于cookie的负载均衡算法会给每一个远程访问的客户端分配一个cookie值,并设置cookie的有效期,避免了大量内网用户利用一个外部IP地址访问服务而导致全部的内网用户集中访问一台服务器的情况的发生,并且在cookie失效后,基于cookie的负载均衡会话保持算法会为客户端分配新的cookie,以保证应用的连续性。
文档编号H04L29/08GK101534321SQ20091001467
公开日2009年9月16日 申请日期2009年3月9日 优先权日2009年3月9日
发明者苑鸿剑 申请人:浪潮电子信息产业股份有限公司