Haproxy 解决集群 session 共享问题_haproxy

Haproxy 二种方法保持客户端seslon 一致

 

1、用户 IP识别


源地址hash(用户IP识别)Haroxy 将用户IP经过hash计算后指定到固定的真实服务器上(类似于nginx的IP hash 指令)。

缺点:当后端一台服务器挂了以后会造成部分session丢失

backend SOURCE_srv
  mode http
  balance source
  server app-node1 10.31.1.179:80 check port 80 inter 3000 rise 3 fall 3
  server app-node2 10.31.1.191:80 check port 80 inter 3000 rise 3 fall 3
  server app-node3 10.31.0.35:80 check port 80 inter 3000 rise 3 fall 3

 

2、cookie 识别


cookie 识别 haproxy 将WEB服务端返回给客户端的cookie中插入haproxy中特定的字符串(或添加前缀)在后端的服务器COOKIE ID。

使用负载均衡特别是基于web的应用,最简单就是网站有前端和后端,前端可能更多的是静态页面,后端可能有登入的后台,如果将登入的后台也放到负载均衡池里面,就会出现这么一个问题,配置的默认负载均衡机制是轮询机制,那么是无法登入后台。因为正常来说后端登入验证机制是基于cookie或者session来验证。当登入某一台验证成功之后,就会把相关的cookie信息保存在本地,然后就不进行新的验证了。

如果使用了轮询机制登入A机器完成验证之后,将cookie请求放到本地了,那么下次登入A机器是自然不需要登入了。如果负载均衡的调度算法分配到B机器。如果没有相应的session或cookie,这样就需要重新做验证了

在LB1上配置好HAProxy后,LB1将接受用户的所有请求。如果一个用户请求不包含任何cookie,那这个请求将被HAProxy转发到一台可用的WEB服务器。可能是webA,webB,webC。然后HAProxy将把处理这个请求的WEB服务器的cookie值插入到请求响应中。如SERVERID=A。当这个客户端再次访问并在HTTP请求头中带有SERVERID=A,HAProxy将会把它的请求直接转发给webA处理。在请求到达 webA之前,cookie将被移除,webA将不会看到这个cookie。如果webA不可用,对应的请求将被转发到其他可用的WEB服务器,相应的cookie值也将被重新设置。

backend httpservers
option redispatch
option abortonclose
cookie SERVERID insert indirect nocache
server http1 192.168.179.103:80 maxconn 2000 cookie server1 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.179.104:80 maxconn 2000 cookie server2 weight 1 check inter 1s rise 2 fall 2

 通过访问192.168.179.101的haproxy可以看到负载均衡到192.168.179.103后端real server上,并且浏览器保存了cookie值

Haproxy 解决集群 session 共享问题_服务器_02

103上面干掉nginx,故障转移

[root@real-server1 ~]# pkill nginx


Haproxy日志:
Jul 22 05:10:13 localhost haproxy[17402]: Server httpservers/http1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.

Haproxy 解决集群 session 共享问题_服务器_03

可以看到故障转移了并且cookie值也改变了 

Haproxy 解决集群 session 共享问题_haproxy_04

 

上面两种方法通过负载均衡模source实现,另外一个就是通过启用cookie功能,强制性在cookie里面插入后端主机的server_id去实现,最简单的就是使用source去实现。

 

最后提一点haproxy监控页面


Haproxy 解决集群 session 共享问题_haproxy_05

将104节点剥离出去,对104节点可以进行硬件的升级,这个界面的功能非常有助于线上服务器的使用,比如服务器硬件故障需要修复,需要临时将该服务从集群里面剔出去,通过页面操作就实现非常简单

Haproxy 解决集群 session 共享问题_服务器_06

再将之前踢出去的104节点通过监控页面加入集群当中 

Haproxy 解决集群 session 共享问题_web服务器_07