近日,系统应用突然慢的受不了,有时还不能正常登录,于是下决心将系统负载均衡方案实践下。
环境准备。
负载均衡采用的方式无非是两类,硬件的负载均衡服务器,软件的类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,貌似负载已经实施成功,系统能正常访问,访问速度恢复正常。