一般来说,负载均衡就是将客户端的请求分流给后端的各个真实服务器,达到负载均衡的目的。还有一种方式是用两台服务器,一台作为主服务器(Master),另一台作为热备份(Hot Standby),请求全部分给主服务器,在主服务器down,立即切换到备份服务器,以提高系统的整体可靠性。
1.apache 目录中httpd.config中加入(头部信息是有的,可以将注释去掉) LoadModule proxy_module modules/mod_proxy.so # 提供代理服务器功能
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #提供负载均衡功能
LoadModule proxy_http_module modules/mod_proxy_http.so# 让服务器支持http协议 也可以写其它的服务
如mod_proxy_ftp 可以访问apache文档查看详细的其它配置 调试2. ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.100:8080/
BalancerMember http:// 192.168.1.100 :8089/
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/ # 调试信息
<Location /balancer-manager>
SetHandler balancer-manager
order Deny,Allow
Deny from all
Allow from localhost
</Location> 注: http://192.168.1.100:8080/ http:// 192.168.1.100 :8089/ 为两台服务器(本机测试) 在我的这两个服务器下都有一个test项目,test中放index.jsp 8080 服务器输出8080。。。。8089服务器输出8089。。。。 重启apache 访问 localhost:test/index.jsp,被转向的服务器是1:1的 。可以配置 负载比例分配 修改 BalancerMember http://192.168.1.100:8080/ loadfactor=5 BalancerMember http:// 192.168.1.100 :8089/ loadfactor=1 重启apache 那么被转向到8080这台服务器的与被转向8089这台服务器的比率是5:1 分配apache是提供有算法的,比如 需求:来自同一个session的请求,转发到同一个server上. 修改httpd.conf LoadModule headers_module modules/mod_headers.so # 需要mod_headers来设置response headers. Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http:// 192.168.1.100 :8080/ route=server1
BalancerMember http:// 192.168.1.100 :8089 / route=server2
</Proxy>
ProxyPass / balancer://mycluster/ stickysession=ROUTEID
ProxyPassReverse / balancer://mycluster/ 这样,如果浏览器第一次访问时,如果访问了server2,那么以后来自同一个session的请求都会发送至server2。 ProxyPassReverse 如果 http://192.168.1.100:8080/test/index.jsp 被redirect到了 http://192.168.1.100:8080/test/test.jsp ,那么当访问http://localhost/test/index.jsp 时,本应被redirect到 http://192.168.1.100:8080/test/test.jsp 的响应被改成了被redirect到http://localhost/test/test.jsp 。redirect的请求仍会经过负载均衡。 各种算法的原理请参见 http://httpd./docs/2.2/en/mod/mod_proxy_balancer.html 热备份(Hot Standby) 热备份的实现很简单,只需添加 status= H 属性,就可以把某台服务器指定为备份服务器: ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.100:8080/
BalancerMember http:// 192.168.1.100 :8089/ status= H
</Proxy>
ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ 如果8080 down掉则会启用8089 <Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from all
</Location> 访问localhost/ balancer-manager可以看到服务器信息 最后将我做的全部配置拿出来: LoadModule proxy_module modules/mod_proxy.so#提供代理服务器功能
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so#提供负载均衡功能
LoadModule proxy_http_module modules/mod_proxy_http.so#请求支持http协议
LoadModule headers_module modules/mod_headers.so#设置response headers Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.100:8080/ route=server1 # 分配的8080服务器
BalancerMember http://192.168.1.100:8089/ route=server2 #分配的8089服务器
</Proxy>
ProxyPass / balancer://mycluster/ stickysession=ROUTEID #根据sessionid请对到对应服务器
ProxyPassReverse / balancer://mycluster/
<Location /balancer-manager>#调试
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from all
</Location> 8080服务器中放test项目 index.jsp test.jsp index.jsp中response.setRedirect("test.jsp") 8089服务器中放test项目index.jsp test.jsp |
|