HAProxy负载均衡保持客户端和服务器Session亲缘性的3种方式

1 用户IP 识别 

haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令)

配置指令:

balance source

配置实例: 

backend szjc_server
       mode    http
       balance source
       server web1 szjc-web1:10080 cookie web1 check inter 1500 rise 3 fall 3 weight 1
   server web2 szjc-web2:10080 cookie web2 check inter 1500 rise 3 fall 3 weight 1

  

2 cookie 识别  

haproxy 将WEB服务端发送给客户端的cookie中插入(或添加加前缀)haproxy定义的后端的服务器COOKIE ID。 

会话保持的缺点: 

会话保持看似解决了Session同步的问题,但是却带来的一些其它方面的问题: 

  • 负载不均衡了:由于使用了Session保持,很显然就无法保证负载绝对的均衡。

  • 没有彻底解决问题:如果后端有服务器宕机,那么这台服务器的Session丢失,被分配到这台服务请求的用户还是需要重新登录。 

指令详解:  

cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]

    [ rewrite | insert | prefix ]              /*三者互斥,只能选一*/
rewrite  -表示cookie由服务器生成并且haproxy会在其值中注入该服务器的标识符;此关键字不能在HTTP隧道模式下工作。

insert   -表示如果客户端没有cookie信息且有权限访问服务器时,持久性cookie必须通过haproxy穿插在服务器的响应报文中。当服务器收到相同名称的cookie并且没有“preserve(保存)”选项时,将会移除之前已存的cookie信息。因此,insert可视作"rewrite"的升级版。cookie信息仅仅作为会话cookie且不会存到客户端的磁盘上。默认除非加了“indirect(间接)”选项,否则服务器端会看到客户端端发送的cookie信息。由于缓存的影响,最好加上“nocache”或“postonly”选项。

prefix  -表示不依赖专用的cookie做持久性,而是依赖现成的。用在某些特殊的场景,如客户端不支持一个以上的cookie和应用程序需求它。每当服务器建立一个名为<name>的cookie时,它将以服务器的标识符和分隔符为前缀。来自于客户端的请求报文中的前缀将会被删除以便服务器端能识别出它所发出的cookie,由于请求和响应报文都被修改过,所以此模式不能工作在隧道模式中。且不能和“indirect”共用,否则服务器端更新的cookie将不会被发到客户端.

[ indirect ] -指定此选项时,将不会向客户端发送服务器已经处理过请求的且可用的cookie信息。如果服务器设置这样一个cookie本身,它将被删除,除非“保存”选项也设置。在“插入”模式下,将从发送给服务器的请求中删除cookie,使持久机制从应用程序的角度完全透明。

[ nocache ] -当客户端和haproxy间存在缓存时,使用此选项和insert搭配最好,以便确保如果一个cookie需要被插入时,可被缓存的响应会被标记成不可缓存。这很重要,举个例子:如果所有的持久cookie被添加到一个可缓存的主页上,之后所有的客户将从外部高速缓存读取页面并将共享相同的持久性cookie,会造成服务器阻塞。  

在配置好HAProxy后,HAProxy将接受用户的所有请求。流程如下:

a、如果一个用户请求不包含任何cookie,那这个请求将被HAProxy转发到一台可用的WEB服务器。可能是webA,webB,webC或webD。然后HAProxy将把处理这个请求的WEB服务器的cookie值插入到请求响应中。如SERVERID=A。

b、当这个客户端再次访问并在HTTP请求头中带有SERVERID=A,HAProxy将会把它的请求直接转发给webA处理。在请求到达webA之前,cookie将被移除,webA将不会看到这个cookie。如果webA不可用,对应的请求将被转发到其他可用的WEB服务器,相应的cookie值也将被重新设置。  

配置指令例举:

backend szjc_server
   option forwardfor
   mode http
   cookie SERVERID insert indirect nocache #基于cookie做负载均衡
   server web1 szjc-web1:10080 cookie web1 check inter 1500 rise 3 fall 3 weight 1
   server web2 szjc-web2:10080 cookie web2 check inter 1500 rise 3 fall 3 weight 1

用chrome 浏览器打开,就会看到对应的cookie信息。

 

3 session 识别  

haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。

配置指令例举:

appsession JSESSIONID len 64 timeout 5h request-learn

配置实例: 

backend szjc_server
   mode    http
   appsession JSESSIONID len 64 timeout 5h request-learn
   server web1 szjc-web1:10080 cookie 11 check inter 1500 rise 3 fall 3 weight 1
   server web2 szjc-web2:10080 cookie 12 check inter 1500 rise 3 fall 3 weight 1
原文地址:https://www.cnblogs.com/reachos/p/8618095.html