HAProxy新增服务器后会话未重新均衡,如何重置持久化Cookie连接实现强制重均衡?
哥们,这问题我太熟了!你遇到的情况完全是Cookie会话持久化的正常表现——你当前的配置里,cookie SERVER insert indirect nocache会让已建立会话的客户端带着标记旧服务器的Cookie,HAProxy会严格按照这个Cookie里的服务器标识转发请求,根本不会触发roundrobin算法重新分配,新增的服务器自然捞不到老用户的请求。
给你两个方向的解决方案,按需选择:
一、无感知过渡(不影响现有用户)
如果不想打扰正在使用的用户,完全可以等老会话自然过期:
- 因为你用的是会话级Cookie(没设置expire),用户关闭浏览器再打开,或者刷新页面时Cookie失效后,HAProxy就会重新用roundrobin算法分配请求,自然会覆盖到新服务器。
- 要是你用的是带过期时间的持久Cookie,可以临时在配置里给Cookie加个短过期时间(比如
cookie SERVER insert indirect nocache expire 3600,设置1小时过期),等大部分老Cookie失效后再改回原配置,这样能加速均衡过程。
二、强制快速均衡(会中断现有会话,谨慎操作)
如果必须立刻让所有请求都参与均衡,就得强制重置现有Cookie,代价是现有用户的会话会被断开(业务不允许会话丢失的话千万别乱试):
- 方案1:临时修改Cookie名称
把配置里的cookie SERVER insert indirect nocache改成cookie SERVER_NEW insert indirect nocache,然后重新加载HAProxy:
这样老客户端带的haproxy -f /path/to/your/haproxy.cfg -sf $(pidof haproxy)SERVERCookie会被HAProxy直接忽略,新请求会被分配新的SERVER_NEWCookie,自然会轮询到包括新节点在内的所有服务器。等均衡完成后,你可以改回原来的Cookie名称,或者就用新的也行。 - 方案2:临时删除旧Cookie
在你的backend nodes里临时加一行指令,删除客户端发来的旧Cookie:
同样reload HAProxy,这样所有带老Cookie的请求都会被清空标识,HAProxy会重新分配新的Cookie,实现全量均衡。等达到你想要的均衡状态后,删掉这行指令再reload回去就行。reqidel ^Cookie:.*SERVER=
最后再提醒一句:强制方案会导致现有用户的会话丢失,一定要在业务低峰期操作,最好提前和业务方确认风险!
备注:内容来源于stack exchange,提问作者dssof
相关产品推荐
相关产品推荐

