我对此很陌生,我正在尝试使用带有 2 个 EC2 实例的 HAProxy 为 2 个 Web 服务器配置负载均衡器。假设我只能使用 2 个实例,我是否可以仅使用 2 个节点来连接它?
我目前只有 NodeA(xxx1)和 NodeB(xxx2),我在 NodeA 上设置了 HAproxy 来监听端口 80。我haproxy.cfg
在 NodeA 上的完整版本如下所示。
global
log /dev/log local0
log 127.0.0.1 local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
errorfile 503 /etc/haproxy/errorfiles/503.http
frontend http-in
mode http
bind *:80
default_backend webservers
backend webservers
mode http
balance roundrobin
server NodeA x.x.x.1 check port 80
server NodeB x.x.x.2 check port 80
从上面的配置可以看出,负载平衡不起作用,因为我无法在 NodeA 上启动 Apache,因为 HAPorxy 占用了 Port80。并且我只能获得 NodeB 而不能获得 NodeA。
我尝试将 HAporxy 端口更改为监听其他端口:失败。我还尝试将 Apache 端口更改为其他端口,NodeA 看起来类似于
frontend http-in
mode http
bind *:80
default_backend webservers
backend webservers
mode http
balance roundrobin
server NodeA x.x.x.1:81 check
server NodeB x.x.x.2:81 check
但也失败了。
来自 HAProxy 的一些日志
x.x.x.1:53006 [18/Mar/2019:01:27:57.789] http-in webservers/NodeA 0/0/0/43/43 400 168 - - ---- 6/6/6/6/+1 0/0 "GET / HTTP/1.1"n
x.x.x.1:53002 [18/Mar/2019:01:27:57.788] http-in webservers/NodeA 0/0/0/43/43 400 168 - - ---- 5/5/5/5/+1 0/0 "GET / HTTP/1.1"n
x.x.x.1:52998 [18/Mar/2019:01:27:57.788] http-in webservers/NodeA 0/0/0/44/44 400 168 - - ---- 4/4/4/4/+1 0/0 "GET / HTTP/1.1"n
x.x.x.1:52994 [18/Mar/2019:01:27:57.787] http-in webservers/NodeA 0/0/0/44/44 400 168 - - ---- 3/3/3/3/+1 0/0 "GET / HTTP/1.1"n
x.x.x.1:52990 [18/Mar/2019:01:27:57.787] http-in webservers/NodeA 0/0/0/45/45 400 168 - - ---- 2/2/2/2/+1 0/0 "GET / HTTP/1.1"n
x.x.x.1:52986 [18/Mar/2019:01:27:57.786] http-in webservers/NodeA 0/0/0/45/45 400 168 - - ---- 1/1/1/1/+1 0/0 "GET / HTTP/1.1"n
x.x.x.1:57534 [18/Mar/2019:01:27:52.344] http-in webservers/NodeA 5441/1/0/46/5718 400 168 - - ---- 1/1/0/0/+1 0/0 "GET / HTTP/1.1"n
我不确定我是否理解了正确的概念。
但本质上我想问的是,是否可以仅使用 2 个节点来实现负载平衡(例如,NodeA 运行 HAProxy 和 Apache,Node B 作为辅助服务器)
如果我知道我的概念是否有误或者有没有什么解决方法,我将非常感激。
答案1
您可以这样做,但是如果只有一个节点运行 HAProxy,那么如果该节点发生故障,您将缺乏冗余。
解决当前问题的技巧是让 Web 服务器监听与 HAProxy 监听的标准 HTTP(/s) 端口不同的端口,如第二个示例所示。
为了解决冗余问题,考虑在两个节点上运行 keepalived,并为它们提供一个虚拟 IP 地址来监听。