Apache HTTPD负载均衡配置:粘性会话与故障转移技术问询
Apache HTTPD负载均衡器配置问题解答
配置文件
<VirtualHost _default_:80> RewriteEngine On ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" env=HTTPS <Proxy "balancer://webtop"> BalancerMember "http://internalsite:7003" route=web1 ping=2 BalancerMember "http://internalsite:7006" route=web2 ping=2 ProxySet lbmethod=byrequests </Proxy> <Location /webtop> ProxyPass balancer://webtop/webtop stickysession=ROUTEID nofailover=On Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/webtop" env=BALANCER_ROUTE_CHANGED </Location> </VirtualHost>
问题与解答
问题1:首次连接时,客户端无ROUTEID Cookie,负载均衡器能否先检查BalancerMember的状态,再进行节点分配,避免分配至已下线的BalancerMember?
可以。你配置里的ping=2参数已经为每个BalancerMember启用了健康检查,Apache的mod_proxy_balancer会每隔2秒向节点发送健康探测请求。一旦某个节点被检测为下线,会被标记为不可用状态,负载均衡器在分配首次请求时,只会从处于正常状态的节点中挑选,不会将请求转发到已下线的节点。
问题2:当客户端持有指向web1的ROUTEID Cookie,但该BalancerMember已故障时,发起新请求后,HTTPD能否自动将Cookie切换为web2并转发至该节点?
当前配置下不能,因为你在ProxyPass里设置了nofailover=On。这个参数的作用是:当绑定的会话节点故障时,拒绝进行故障转移,直接返回错误给客户端。
如果想要实现自动切换,需要将nofailover=On改为nofailover=Off(或者直接删除这个参数,因为默认值就是Off)。修改后,当web1节点故障时,负载均衡器会忽略该节点,自动将请求转发到健康的web2节点,同时因为路由发生了变化,BALANCER_ROUTE_CHANGED环境变量会被触发,Header指令会向客户端发送新的ROUTEID Cookie,将后续请求绑定到web2节点。
内容的提问来源于stack exchange,提问作者Vladimir Povyshev
相关产品推荐
相关产品推荐

