Haproxy:我的会话“有点”粘滞

Haproxy:我的会话“有点”粘滞

Pound 位于 HAProxy 前面,用于 SSL 卸载,因此 HAProxy 接收纯文本 HTTP 请求。我在两个托管同一应用程序的 Web 应用服务器前面安装了 HAProxy (v1.4.8)。以下是我的 HAProxy 配置。

目前,客户端访问 HAProxy,并可以访问任何服务器,以对站点根目录进行初始“GET /”请求。例如,客户端访问 ServerA,从那时起,他们可能始终由 ServerA 或 ServerB 提供服务,无论哪个,会话都将粘在 A 或 B 上。相反的情况也一样;客户端的初始请求可能进入 ServerB,在此初始请求之后,他们将始终由 ServerB 或 ServerA 提供服务。会话将粘在对方服务器上,但有时在初始请求之后会发生这种变化,所有未来请求都将粘在对方服务器上。

以下是我的 HAProxy 配置。我写错了吗?

listen  app-servers 127.0.0.1:80
    cookie ASP.NET_SessionId prefix
    balance url_param ASP.NET_SessionId
    balance roundrobin 
    option persist
    option redispatch

    # Balance based on ASP .NET sesssion ID
    appsession ASP.NET_SessionId len 64 timeout 30m request-learn prefix

    # Active WebApp servers
    server  appserver1 10.0.0.1:80
    server  appserver2 10.0.0.2:80

谢谢。

答案1

如果您的应用对用户在会话中切换应用服务器很敏感,那么您希望将粘性保持时间设置为至少与会话 cookie 的到期时间一样长。

您的粘性表设置为在 30 分钟后使条目过期。因此,虽然您的用户可能会继续发送相同的会话 ID,但如果他们暂停超过 30 分钟,那么他们的连接将重新平衡。如果您不喜欢这种行为,那么 4 小时或更长的设置可能适合您。正如我上面用粗体表示的那样,您至少希望将粘性保持时间设置为至少与会话 cookie 的过期时间一样长。

当您使用该cookie server insert选项时,您将添加一个没有过期时间的烹饪。并且该 cookie 说明要使用哪个服务器。由于没有过期时间,客户端永远不会移动到另一个服务器。

但你也需要问问自己为什么要关心这个问题。切换到另一台服务器会对用户体验产生巨大影响吗?如果是这样,也许你应该认为这是你的网络应用程序的一个缺陷,并在该层解决它。我可能是错的,但这是值得思考的事情。

答案2

我对此并不是很满意,但它确实有效;我在客户端请求中插入了一个 cookie,而不是跟踪 ASP .NET 会话 ID:

listen  app-servers 127.0.0.1:80

    cookie server insert
    balance roundrobin 
    option persist
    option redispatch
    server  appserver1 10.0.0.1:80 cookie srv1
    server  appserver2 10.0.0.2:80 cookie srv2

相关内容