集群是保证大型应用高可用的重要手段之一,应用服务器的集群也是目前最常见的集群操作方式。
通过借鉴我的同事之前的经验及相关资料,这里制作了2中环境的集群:一种是直接使用Apusic自带的负载均衡器,制作集群。这样的集群不需要额外的负载均衡器,配置也是非常方便。另外,就是使用apache做负载均衡器,制作集群。下面分别介绍两种方式的操作过程。
Apache的HTTP Server是目前最常见的负载均衡器,由于其开源免费并且效果相对不错,深受广大用户的喜爱。
首先 ,需要下载一个apache服务器,下载地址:http://httpd.apache.org/download.cgi 。可以根据自己实际情况,下载需要的apache版本。这里使用的是Windows环境下的2.2.15版本。
其次 ,添加apusic的集群域。双击%APUSIC_HOME%/bin下的config.cmd文件,打开域管理工具,依次选择“1- 创建一个新的Apusic域”--“1- 选择系统默认模板”--“2- 集群”(这里创建一个集群模板的域)--“选择默认路径”--“输入域名称”--“输入服务监听端口”--“输入服务器SSL安全监听端口”,创建一个集群域。集群域创建完成后,可以在%APUSIC_HOME%/domains/下,看到按照之前输入的域名创建的目录,此时的域目录已经将所有必须的文件及目录创建完成,只需要将需要启用的应用配置完成即可。假设我们创建的域名为:domain1,其服务监听端口为:7777。
再次 ,修改apusic.conf文件,在文件中添加集群服务信息。内容如下所示:
<SERVICE CLASS="com.apusic.cluster.ClusterService" > <ATTRIBUTE NAME="ServerName" VALUE="$DOMAIN_NAME"/> <ATTRIBUTE NAME="ReplicationPolicy" VALUE="PAIR"/> <ATTRIBUTE NAME="LoadWeight" VALUE="100"/> <ATTRIBUTE NAME="ClusterName" VALUE="ApusicCluster"/> </SERVICE>
然后 ,修改apusic.conf中的Session服务信息,保证Session的高可用。推荐使用Session粘滞,以减少负载均衡器频繁切换造成的压力;另外,为防止集群中网络风暴的产生,建议使用配对的session复制策略。关于SessionService的配置信息如下所示:
<SERVICE CLASS="com.apusic.web.session.SessionService" > <ATTRIBUTE NAME="Distributable" VALUE="True"/> <ATTRIBUTE NAME="Replicable" VALUE="True"/> <ATTRIBUTE NAME="SessionStick" VALUE="True"/> <ATTRIBUTE NAME="SessionInvalidateCheckInterval" VALUE="60"/> <ATTRIBUTE NAME="DestorySessionOnApplicationStop" VALUE="False"/> <ATTRIBUTE NAME="PersisteSession" VALUE="False"/> <ATTRIBUTE NAME="MaxSessionsInCache" VALUE="1024"/> <ATTRIBUTE NAME="DefaultSessionTimeout" VALUE="3600"/> </SERVICE>
说明:默认情况下,在创建完成集群域之后,关于集群与Session服务的配置信息已经创建完成,唯一需要修改的地方是SessionService中的“DestorySessionOnApplicationStop”属性值,默认是True,需要将其修改为“False”,以保证集群中的某一台机器宕机或发生故障时Session不会丢失。
接下来 ,需要修改%APUSIC_HOME%/domains/domain1/config/下面的vm.options文件,在其中加入“com.apusic.jvm.route=ApusicCluster”,来配合apusic.conf中关于Session粘滞的配置,保证Session粘滞正常。其中“ApusicCluster”为apusic.conf中ClusterService下配置的ClusterName。
另外,由于Apache的Http Server对于负载均衡的bug(不知道最新的版本是否已经修订,先按照经验来),需要在vm.options中加入“-Dapusic.redirect.proxy=true”。
在完成对Apusic相应的配置之后 ,修改apahce的httpd.conf文件(路径:%APACHE_HOME%/conf),释放负载均衡的服务:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_http_module modules/mod_proxy_http.so
最后 ,在httpd.conf文件末尾,添加集群中的成员,其配置信息如下所示:
<VirtualHost *:80> ProxyRequests off ProxyPass / balancer://test/ stickysession=JSESSIONID <Proxy balancer://test> BalancerMember http://192.168.1.210:7777 loadfactor=1 route=domain1 BalancerMember http://192.168.1.202:7777 loadfactor=1 route=domain2 </Proxy> </VirtualHost>
其中,“stickysession=JSESSIONID”用于说明使用session粘滞;“Proxy balancer”下属的信息,则说明了加入集群的各个成员及各自的端口、域等信息;“loadfactor”则指明集群中各成员的负载比例,例子中是1:1。BalancerMember为后置机节点,后面的值为后置机的地址和端口。Loadfactor为负载权重。当用户想使用会话粘滞(Session-Stick),可以在ProxyPass / balancer://test/ 后面加入stickysession=JSESSIONID,当用户想使用失效转移时要在后面加入nofailover=off,同时在每个BalancerMember最后面加入route=serverName。
至此,使用Apache Http Server做负载均衡器的Apusic集群配置完成。重启Apache,然后启动Apusic对应的服务,集群即创建完成。
Apusic本身内置负载均衡器,可以直接借助Apusic的负载均衡器,创建一个Apusic集群。创建Apusic集群,只需要在Apusic中新创建一个域,例如,此处创建一个名为“balancer”的域,修改此域中loadbalancer.conf的内容,此文件中已经有“LoadBalancer”相关配置信息,修改“LoadBalancer”下的“BackendServers”属性为需要加入集群的各Apusic服务,不同的服务之间用逗号分隔,例如:
<ATTRIBUTE NAME="BackendServers" VALUE="192.168.1.210:7777,192.168.1.202:7777"/>
Apusic负载均衡器默认情况下是会话粘滞(session-stick)的,同时采用轮循的策略选择可用节点。当然你也可以关闭会话粘滞,只要在LoadBalancer服务中,增加属性:
<ATTRIBUTE NAME="SessionStick" VALUE="false"/>
就可以关闭会话粘滞。如果想采用其他策略来选择节点,可以增加属性:
<ATTRIBUTE NAME="BalancePolicy" VALUE="Random"/>
其中Value值可以选择:Random,Round-Robin,LoadWeight.注意当用户选择LoadWeight的时候,还需要增加属性:
<ATTRIBUTE NAME="LoadWeight" VALUE="10,20,70"/>
来标识权重的值。其值与服务器地址列表中的服务器一一对应。此外,用户还可以扩展自己的负载均衡策略,只要实现LoadBalancePolicy接口,同时增加属性:
<ATTRIBUTE NAME="BalancePolicyClass" VALUE="userclass "/>
其中Value值为用户自定义的类。当两个属性BalancePolicy,BalancePolicyClass同时存在时,BalancePolicyClass的优先级高。
最后,当上面的配置完成后,负载均衡器可以通过命令行方式启动,不同的是需要增加-config参数指明负载均衡器的配置文件,例如:java -classpath E:/apusic/lib/apusic.jar; E:/apusic/lib/javac.jar;E:/apusic/lib/mejb.jar;E:/apusic/common/javaee.jar; com.apusic.server.Main -root E:/apusic/domains/mydomain -config /config/loadbalancer.conf。最终,使用Apusic做负载均衡的Apusic集群创建完成!
Apusic不仅仅支持Apache做负载均衡器,还支持其他的Http Server,(比如微软的IIS)做负载均衡器,具体配置请参考相应资料。
经过测试,使用Apusic做为负载均衡器,可以实现异构系统环境下的集群,而且可以保证Session的一致性(幂等性)。但是,经过测试,发现在异构环境下,使用Apache做负载均衡,没法保证幂等性,这个不知是配置出现问题,还是本身不提供相应的机制。