我有几个小服务器和一个大服务器,其中包含几个小服务器的镜像。我们把小服务器组称为服务器 A、服务器 B、服务器 C 和服务器 D,大服务器将以服务器 X 为名称。
frontend proxy
bind 0.0.0.0:80
mode http
default_backend nodes
backend nodes
option forwardfor httpchk
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
server ServerA (server A IP):80 check
server ServerB (server B IP):80 check
server ServerC (server C IP):80 check
server ServerD (server D IP):80 check
server ServerX (server X IP):80 backup
下面是解释我期望的最终结果的图表。
如果服务器 A 到 D 中的一个发生故障/无法访问,我希望将用户重定向到服务器 X,一旦服务器启动,用户将被重定向回其相应的服务器。
- John
www.example.com
在服务器 B 上进行搜索。 - Haproxy 将 John 重定向到服务器 B。
- John 正在
www.example.com
服务器 B 上做一些事情。 - 服务器 B 宕机了!John 被重定向到服务器 X。
- John 正在
www.example.com
服务器 X 上做一些事情。 - 服务器 B 已启动!John 从服务器 X 重定向回服务器 B。
很确定可以使用 haproxy 完成此操作,但我找不到方法。有人可以给我指点一下吗?我现在完全不知所措。
答案1
好的。现在我知道你想要什么了。
创建A、B、C、D不同的池。
后端节点A 选项 forwardfor httpchk http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } 服务器 ServerA (服务器 A IP):80 check 服务器 ServerX (服务器 X IP):80 check
后端节点 B 选项 forwardfor httpchk http 请求设置标头 X-Forwarded-Port %[dst_port] http 请求添加标头 X-Forwarded-Proto https 如果 { ssl_fc } 服务器 ServerA (服务器 B IP):80 检查服务器 ServerX (服务器 X IP):80 检查
在服务器 A 和 X 上,您可以为每个要故障转移的服务设置 IP,或者设置响应特定域名的虚拟主机。(抱歉,我无法提供更多详细信息,因为您没有指定使用哪种技术...
答案2
我不确定约翰为什么想要或者应该意识到如果他打电话www.example.com
他最终会进入服务器 A、B、C 或任何特定的服务器。
约翰只打电话给你域名并希望它能发挥作用。最终。
如果池中的一台服务器发生故障,另一台服务器将给出相同的答案(例如,A 发生故障,其他任何服务器将代替他回答)。它们已经是彼此的备份服务器。
现在,如果您希望服务器 X 始终作为故障转移服务器或 A、B、C 或 D,则需要创建不同的池,仅包括 A 和 X、B 和 X 等等。
但是,这也意味着您将拥有不同的域和 IP 地址,或者!每个池的同一域具有相同的 IP,但端口不同。
如果你有其他目的,你需要解释一下,因为我不明白你想做什么。抱歉。希望这能有所帮助。
PS:如果您希望用户在登录应用程序服务器时始终获得同一台服务器的答复(除非服务器出现故障),那么您可能还需要在会话中添加粘性会话。
答案3
您的绘图可能不正确......我看到您还有多个 HAProxy 服务器......
在这种情况下,您需要一个 vIP(它们前面的虚拟 IP)来为您实现负载平衡。我不会在这里解释如何做到这一点,但一些云提供商会提供易于配置的服务。如果您想手动执行此操作,那就是另一回事了。
完成后,所有 HAProxy 都将拥有 1 个具有粘性会话的池,并且池中只有服务器 A 和 X、B 和 X、C 和 X 以及 D 和 X。
那是另一种设计。