19.1. Apusic LoadBalancer

金蝶Apusic应用服务器6.0在Web层实现了负载均衡,提供Apusic LoadBalancer。利用Apusic LoadBalancer建立的负载均衡集群有一个很重要的特点就是实现了分布式Session管理,这也是实现Web服务器集群的关键,由于Web应用被分布到多台服务器上运行,因此保存在Session中的共享数据必须完全保持一致。Apusic LoadBalancer没有使用共享数据库来保存Session数据,共享数据库模式下,由于Session的变化是很频繁的,对数据库将造成很大的压力,最终将成为整个系统的瓶颈,Apusic LoadBalancer使用一种分布式Session服务,每个服务器管理自己所产生的Session。当Web应用从一台服务器迁移到另一台服务器时,Session也会自动进行迁移,这样使得对Session的管理被均匀地分布到所有的服务器上,任何一台服务器失效并不会使Session丢失。对应用开发者来说,要保证分布式Session能够正常工作,在Session中只能保存实现了java.io.Serializable的数据,否则Session将无法完成迁移。

19.1.1. 负载均衡策略

采用Apusic LoadBalancer作为负载均衡器时,主要提供三种负载均衡策略:

  • 随机选择策略

    随机选择其中一台服务器处理请求。

  • Round-Robin策略

    依次轮寻选择一台服务器处理请求。

  • 权重策略

    按照权重的比例选择服务器处理请求。

当然,还支持其他一些负载均衡策略,用户也可以扩展并加入自定义的负载均衡策略。

19.1.2. Apusic LoadBalancer的Session复制策略

Apusic LoadBalancer使用了内存复制技术,将每个后置服务器的Session备份在自己的缓存中,即后台某个节点处理完客户端请求时,将当前Session复制到负载均衡器中。所以使用Apusic LoadBalance时,集群中每个节点必须开启SessionService中的复制服务。

19.1.3. 失效转移

采用Apusic LoadBalancer时,由于Session缓存在Apusic LoadBalancer的缓存中,当主节点失效时,Apusic LoadBalancer从缓存取出当前的Session,将Session带到下一个节点进行处理,确保Session的可用性。如下图:

    
     
失效转移

图 19.1. 失效转移


19.1.4. 配置负载均衡

Apusic负载均衡器是用Apusic应用服务器实现的,也就是说,负载均衡器和其他金蝶Apusic应用服务器6.0实例没有本质区别,不同的是它上面没有安装应用系统,并且使用不同的配置文件,它只是专门提供负载均衡服务。客户通过访问负载均衡器的Web服务,来访问整个集群的资源。用户请求到达负载均衡器后,负载均衡器将它分配到某个金蝶Apusic应用服务器6.0实例上,让这个实例为此用户请求提供服务。

负载均衡器配置文件为DOMAIN_HOME/config/loadbalancer.conf,下面是其中LoadBalancer服务的片段:

<SERVICE  CLASS="com.apusic.web.loadbalancer.LoadBalancer">
    <ATTRIBUTE NAME="ServerPort" VALUE="80"/>
    <ATTRIBUTE NAME="BackendServers" VALUE="192.168.6.66:6888,192.168.6.67:6888"/>
    <ATTRIBUTE NAME="MaxWaitingClients" VALUE="500"/>
    <ATTRIBUTE NAME="WaitingClientTimeout" VALUE="5"/>
    <ATTRIBUTE NAME="KeepAlive" VALUE="True"/>
    <ATTRIBUTE NAME="MaxKeepAliveRequests" VALUE="100"/>
    <ATTRIBUTE NAME="KeepAliveTimeout" VALUE="15"/>
    <ATTRIBUTE NAME="MaxKeepAliveConnections" VALUE="300"/>
    <ATTRIBUTE NAME="EnableLog" VALUE="False"/>
    <ATTRIBUTE NAME="LogFileName" VALUE="logs/access.log"/>
    <ATTRIBUTE NAME="LogFileLimit" VALUE="1000000"/>
    <ATTRIBUTE NAME="LogFileCount" VALUE="10"/>
</SERVICE>

与DOMAIN_HOME/config/apusic.conf比较一下,可以发现少了一些服务描述,但多了一个LoadBalancer服务。

当用这个配置文件启动Apusic应用服务器6.0时,这台服务器就成为一个负载均衡器。

在配置文件中,最关键的属性BackendServers,定义了集群中的服务器,这是一个用逗号分割的地址列表,包括主机名和端口号。

Apusic负载均衡器默认情况下是会话粘滞(session-sticky)的,同时采用轮循的策略选择可用节点。当然也可以关闭会话粘滞,只要在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的优先级高。

要使用Session的分布式功能,集群中每台Apusic服务器的SessionService中属性:
<ATTRIBUTE NAME="Distributable" VALUE="True"/>值必须为True。默认情况下为False。

当上面的配置完成后,负载均衡器可以通过命令行方式启动,不同的是需要增加-config参数指明负载均衡器的配置文件,例如:

java -classpath C:\apusic-6.0\lib\apusic.jar;C:\apusic-6.0\lib\tools.jar;C:\apusic-6.0\lib\mejb.jar;C:\apusic-6.0\common\javaee.jar; com.apusic.server.Main –root C:\apusic-6.0\domains\mydomain -config C:\apusic-6.0\domains\mydomain\config\loadbalancer.conf