近日,系统应用突然慢的受不了,有时还不能正常登录,于是下决心将系统负载均衡方案实践下。

环境准备。

负载均衡采用的方式无非是两类,硬件的负载均衡服务器,软件的类Apache的proxy_balancer,其他的方式暂时没有了解,我选择了后者,其一是不要花钱,其二,达到的效果并不逊于硬件设备。好了,方案选定后,开始实施吧,根据apache官方文档,负载均衡配置确实很简单。

实践步骤:

1.加载对应的组件。

proxy_module ,proxy_ajp_module ,proxy_balancer_module ,proxy_connect_module ,proxy_http_module ,

2.配置负载均衡,hosts添加:10.9.23.30 k.test.com.cn;ws为需要访问的项目名称

<VirtualHost *:80>
ServerName k.test.com.cn
ProxyRequests off
ProxyPreserveHost off
SetEnv force-proxy-request-1.0.1
SetEnv proxy-nokeepalive 1

<Proxy balancer://test>
BalancerMember http://10.9.23.30:9888/ loadfactor=1 
BalancerMember http://10.9.23.30:8888/ loadfactor=1 

</Proxy>
ProxyPass /ws balancer://test/ws  nofailover=off 
ProxyPassReverse / balancer://test/


 </VirtualHost>

3.经过上面的配置,正常情况下,负载均衡配置应该是可以使用的,只有正常启动apache即可,采用的分配策略是默认的byrequests,分配权重是轮询访问,nofailover=off允许失效转移。

4.配置balancer-manager监控负载状态及配置修改

加载状态组件status_module ,配置状态监听,如果是生产环境,要慎重开发权限。

<Location /balancer-manager>
 SetHandler balancer-manager
 Order Deny,Allow
 Allow from All
 </Location>

访问http://k.test.com.cn/balancer-manager即可查看负载均衡运行状态。

5.设定sticky session,根据官方的文档,sticky session有两种方式,一种设置是通过header进行设定,一种是在请求连接中添加JSESSIONID属性,

如:ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid

查询网上负载均衡的配置大多采用stickysession=JSESSIONID|jsessionid方式进行设定,不过,在配置Apusic的sticky session时,采用stickysession=JSESSIONID的方式(Apusic官方文档也是这样配置的),却发现,同一个session请求被不断的转发给其他的负载服务器,导致应该正常显示的数据变得不正常,经过多次实践,最终采用了通过header进行sticky session设定的方式,问题解决。

操作步骤:加载headers_module,重新修改步骤2中设定的负载,并修改了分配方式为bybusyness。

<VirtualHost *:80>
ServerName k.test.com.cn
ProxyRequests off
ProxyPreserveHost off
SetEnv force-proxy-request-1.0.1
SetEnv proxy-nokeepalive 1
Header add Set-Cookie "ROUTERID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<Proxy balancer://test>
BalancerMember http://10.9.23.30:9888/ loadfactor=1 
BalancerMember http://10.9.23.30:8888/ loadfactor=1 
ProxySet lbmethod=bybusyness
ProxySet stickysession=ROUTERID
</Proxy>
ProxyPass /ws balancer://test/ws  nofailover=off 
ProxyPassReverse / balancer://test/


 </VirtualHost>
6.应用服务器采用的Apusic,后端服务器为了能够支持Apache的sticky session,需要在Apusic对应apusic.conf中的
<SERVICE CLASS="com.apusic.web.session.SessionService" >节点中添加
<ATTRIBUTE NAME="Distributable" VALUE="True"/>
     <ATTRIBUTE NAME="Replicable" VALUE="True"/>
     <ATTRIBUTE NAME="SessionStick" VALUE="True"/>
也可以直接引用config下的cluster.conf文件,只需要在startapusic.cmd中修改
%JAVA_RUN% -Dcom.apusic.domain.home="%DOMAIN_HOME%" com.apusic.server.Main -root "%APUSIC_HOME%" -config /config/cluster.conf

7.好吧,最后重启各Apusic服务,并启动Apache,貌似负载已经实施成功,系统能正常访问,访问速度恢复正常。