Haproxy 解决集群 session 共享问题
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值
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.
可以看到故障转移了并且cookie值也改变了
上面两种方法通过负载均衡模source实现,另外一个就是通过启用cookie功能,强制性在cookie里面插入后端主机的server_id去实现,最简单的就是使用source去实现。
最后提一点haproxy监控页面
将104节点剥离出去,对104节点可以进行硬件的升级,这个界面的功能非常有助于线上服务器的使用,比如服务器硬件故障需要修复,需要临时将该服务从集群里面剔出去,通过页面操作就实现非常简单
再将之前踢出去的104节点通过监控页面加入集群当中
目录 返回
首页