HAproxy的Sticky Session

前言

本文主要记录一下最近工作中使用HAproxy转发请求到keycloak集群时遇到的问题以及解决办法。

问题出现

最近的项目里使用了keycloak做身份认证,测试环境是单机的keycloak所以在测试的时候一直没有任何问题。当部署好生产环境的时候,马上就发现在多机的情况下,用户的登录请求在多台keycloak之间跳来跳去。

分析问题

根据现象思考,觉得可能是keycloak的standalone-ha模式有什么参数可以配置从而将登录的session固定或者共享,而HAproxy只是起到一个将请求透传的作用。后来通过仔细研究keycloak的官方文档发现并没有这样的控制配置。于是将目光拉回到请求的转发过程。因为这个请求是登录认证的请求,所以肯定是需要一个session来记录登录信息,以便下次访问。那么目前输入完用户信息之后请求不断在多台keylocak之间跳动的原因就应该是HAproxy将携带用户信息的请求转发到某一台keycloak之后,登录成功之后跳转到登录后的页面,由于HAproxy没有记住session,那么将请求转发到另外的keycloak机器上去,此时重新验证身份信息,重新发送跳转请求,然后又转发到不同的机器上。这个过程不断重复,就会出现浏览器上面的页面不断加载,HAproxy日志中不断循环打印不同keycloak机器的访问日志。

寻找出路

问题的原因貌似找到了,然后就开始思考解决办法。感觉要么是做session共享,要么是一直将同一请求固定路由到某一台keycloak。不过这时候我的导师已经解决这个问题了。我翻看HAproxy的配置,和我想到的是一样的。配置了cookie SERVERID insert indirect nocache属性,然后在每一条backend server后面加上check cookie kc1(这是cookie的value,每台bs都不一样),然后问题就解决了。(其实这里面比较享受的是思考和寻找的过程😄)

参考

https://loadbalancerweb.wordpress.com/2016/06/24/cookie-session-haproxy/#respond

您的支持将鼓励我继续创作!
0%