haproxy - HAProxy:防止对备份服务器的粘性
问题描述
我面临 HAProxy (1.8) 的配置问题。
语境:
- 在 HAProxy 配置中,我在后端有几台服务器,还有一个额外的备份服务器,以防其他服务器停机。
- 一旦客户端从服务器获得答案,它必须坚持到该服务器进行下一次查询。
- 出于某些充分的理由,我不能使用 cookie 来解决这个问题,而我不得不使用棍子表。
问题:
- 当每个“正常”服务器都关闭时,客户端会按预期重定向到备份服务器。
- 但是,stick-table 然后填充了客户端和备份服务器 id 之间的关联。
- 并且当每个“正常”服务器返回时,存在于棒表中并与备份服务器的 id 关联的客户端将继续被重定向到备份服务器而不是正常服务器!
这真的让我很不爽……
所以我的问题是:如何防止 HAProxy 将客户端粘贴到后端的备份服务器上?
请在下面找到配置示例:
defaults
option redispatch
frontend fe_test
bind 127.0.0.1:8081
stick-table type ip size 1m expire 1h
acl acl_test hdr(host) -i whatever.domain.com
...
use_backend be_test if acl_test
...
backend be_test
mode http
balance roundrobin
stick on hdr(X-Real-IP) table fe_test
option httpchk GET /check
server test-01 server-01.lan:8080 check
server test-02 server-02.lan:8080 check
server maintenance 127.0.0.1:8085 backup
(我已经尝试为备份服务器增加一个较低的权重,但它并没有解决这个问题。)
我在文档中读到“stick-on”关键字有一些“if/unless”选项,也许我可以使用它来根据后端服务器名称编写条件,但我不知道要使用的语法,或者即使有可能。
欢迎任何想法!
解决方案
我真傻!我对棒表配置非常着迷,以至于我没想到要查看服务器选项...
有一个简单的关键字可以完美解决我的问题:不粘
切勿将分配给此服务器的连接添加到棒表。这可以与备份结合使用,以确保对备份服务器禁用粘表持久性。
所以我的配置示例的最后一行就变成了:
server maintenance 127.0.0.1:8085 backup non-stick
...现在一切都按我的预期工作。
推荐阅读
- symfony - 多选下拉/复选框 Symfony 3.4 Form
- c++ - 捕获组标准 C++ RegEx 和 PCRE 中只有 1 个匹配项
- haskell - 在 Haskell 中应用特定类型变量的最短方法
- azure - Azure App service Keeps pulling docker image from docker hub
- vaadin - 无法让 @CssImport 仅适用于组件范围
- c# - C# 中的 SQL 更新没有显示错误,但也没有更新
- android - 通过毕加索加载的android主屏幕小部件中的图像有时只会更新
- javascript - 在 html 中显示 api 控制台登录
- node.js - 在控制器中使用 api 请求标头的有效方法,Node Express Js 中的模型
- swift - 通过 Swift Framework Wrapping C Library 中的 C 标头