[b]前述:[/b]

windows集群同J2EE的集群不同,因为它是操作系统自带的集群支持,它没有J2EE集群对java的web应用的良好支持,例如session复制以及session粘滞。所以对windows集群,需要特别配置一下,以此来支持集群的功能。

[b]简单原理说明:[/b]

Windows集群的均衡负载会根据情况,将外部请求分配给集群内的服务器处理。当一个会话(Session)在A服务器上产生并开始,产生了一部分会话信息将保存到A服务器的内存中。假如这次会话中的一次请求被windows集群的均衡负载调度器分配到了B服务器去处理,那么问题就产生了,B服务器中的内存中并没有这个会话的信息,那么就会报session timeout。
而我们的配置,会在集群的服务器间建立联系。当B服务器收到请求,发现这个请求的会话不是自己产生的,那么它会根据请求中的信息,判断出这个会话是由哪台服务器产生。接着它会将这个请求通过内网转发给相应的那台服务器去处理。这样相当于就实现了J2EE集群的会话粘滞的功能。简单的说,会话粘滞就是保持一个会话中的多次交互都由一台集群中的服务器处理。这样就不会再产生上述的问题。

前提:

    集群的服务器间需要有内网间通信的支持。
    不同服务器上的报表应用必须是一致的。

配置步骤:
集群内的每台安装有报表应用的服务器都需要这样配置。

1.    关闭现在的报表服务。

2.    增加配置文件。
将配置包resource文件夹下的cluster.xml打开。看见如下内容

<?xml version="1.0" encoding="UTF-8" ?>
<ClusterConfig useCluster="true">      //useCluster=”true”表示启用集群配置
    <ClusterService>
        <ServiceName>A</ServiceName>  //给这台服务器取一个区别于其他机器的别名
        <ip>192.168.0.1</ip>            //这台服务器在内网中的IP地址
        <port>8080</port>              //报表应用的端口
        <WebAppName>WebReport</WebAppName>  //报表应用的名称
    </ClusterService>
    <ClusterService> 
        <ServiceName>B</ServiceName>
        <ip>192.168.0.2</ip>
        <port>8080</port>
        <WebAppName>WebReport</WebAppName>
    </ClusterService>
</ClusterConfig>

这里的每个ClusterService都是集群中一台服务器的相关信息。配置好后,系统会根据自身的IP和端口号去匹配找到相应的信息。当然也可能会有一些原因导致系统无法正确的匹配找到。这时您可以设置isSelf属性来指定自身的属性。
例如这个配置文件部署在A服务器下,那么ServiceName为A的那个ClusterService节点后加一个属性 isSelf=”true”,表示下这是本机的信息。如下所示。
<?xml version="1.0" encoding="UTF-8" ?>
<ClusterConfig useCluster="true">
    <ClusterService  isSelf="true">
        <ServiceName>A</ServiceName>
        <ip>192.168.0.1</ip>
        <port>8080</port>
        <WebAppName>WebReport</WebAppName>
    </ClusterService>
    <ClusterService>
        <ServiceName>B</ServiceName>
        <ip>192.168.0.2</ip>
        <port>8080</port>
        <WebAppName>WebReport</WebAppName>
    </ClusterService>
</ClusterConfig>         //这个就是指定自身信息的A服务器相应的配置文件了
ServiceName是为一台服务器取的别名,只是为了区别标记一下。最好简单方便,如A、B、C或者A1、A2等。注意!不能是中文。

IP、PORT、和WebAppName上面的注释中有介绍。
IP是该台服务器内网中的IP,就是其它服务器能与之通信的IP。
Port是[url=http://www.finereport.com/cn/knowledge.html]报表[/url]应用的端口号,假如是部署在tomcat下,那么就是tomcat的端口号,默认是8080.例如我们的内置服务器是8079.
WebAppName是报表应用的名称,我们默认的是WebReport。
简单的讲。如上面的那个例子。B服务器的信息如下。
<ClusterService>
        <ServiceName>B</ServiceName>
        <ip>192.168.0.2</ip>
        <port>8080</port>
        <WebAppName>WebReport</WebAppName>
    </ClusterService>
那么正确的配置的结果,就是在A服务器上,假如有浏览器,浏览器中输入
http://192.168.0.2:8080/WebReport/ReportServer?reportlet=xxx.cpt 就能访问到B服务器上的报表应用。这个url中的IP、端口号和web应用名称就是上面配置信息里面的。注:xxx.cpt只是举个例子。

那么综上说明,假如集群中多了一台C服务器,给它取个别名就叫C。内网IP是192.168.0.3。装了tomcat,端口默认是8080。报表应用名称也是默认是WebReport。那么服务器下的配置文件应该如下所示。
<?xml version="1.0" encoding="UTF-8" ?>
<ClusterConfig useCluster="true">
    <ClusterService>
        <ServiceName>A</ServiceName>
        <ip>192.168.0.1</ip>
        <port>8080</port>
        <WebAppName>WebReport</WebAppName>
    </ClusterService>
    <ClusterService>
        <ServiceName>B</ServiceName>
        <ip>192.168.0.2</ip>
        <port>8080</port>
        <WebAppName>WebReport</WebAppName>
    </ClusterService>
    <ClusterService>
        <ServiceName>C</ServiceName>
        <ip>192.168.0.3</ip>
        <port>8080</port>
        <WebAppName>WebReport</WebAppName>
    </ClusterService>
</ClusterConfig>

最后,请根据上面的格式,写好cluster.xml文件,并且将其拷贝到各服务器的[url=http://www.finereport.com/cn/knowledge.html]报表[/url]应用下WEB-INF\resources文件夹下。当然,有isSelf属性指定的特定服务器的配置文件需要保存到相应的服务器路径下。
注意!xml文件的保存格式是 utf-8 no Bom的格式。一般用写字板打开配置包下的cluster.xml文件,修改保存就可以。

3.    测试配置是否生效。
当集群中的服务器都已经按照上述步骤配置好,并且重新启动[url=http://www.finereport.com/cn/knowledge.html]报表[/url]应用后。依次在各台服务器上做如下测试。
例如,现在在A服务器下,先本机测试下报表能否访问,测一张简单的模板就行。能正常访问(ie浏览器可能需要将localhost或者127.0.0.1的本机地址添加到信任站点中才能显示页面),接着在浏览器上输入:
http://localhost:8080/WebReport/ReportServer?op=cluster_test
上述url地址前面部分按情况,请换上相应报表应用的端口号和应用名称。然后假如本机设置正常就能看到如下的信息:(以上述A、B两台服务器的配置文件举例)

Cluster is start!
SELF:
ServiceName:A
IP:192.168.0.1
PORT:8080
WebAppName:WebReport

Other Server List:
NO1: ServiceName:B = 192.168.0.2:8080/WebReport – OK

这样说明,配置生效,A服务器能与B服务器间进行通信。再次查看下信息是否有误。
那么相应的在B服务器下测试,正确的回应如下。
 
Cluster is start!
SELF:
ServiceName:B
IP:192.168.0.2
PORT:8080
WebAppName:WebReport

Other Server List:
NO1: ServiceName:A = 192.168.0.1:8080/WebReport – OK
    
假如,没有显示Cluster is start,那么说明该机的配置没有生效,请检查配置文件后,重新启动应用,并且再次依照上面步骤测试。

假如显示是这样:

Cluster is start! 
Can not find Own Service Info.
LocalIP:192.168.0.39
LocalPort:8070。

说明,集群配置了,但是系统无法根据自身找到的IP和端口匹配到配置文件中的信息。而系统找到的IP是192.168. 0.39,端口是8070.可能您配置成了192.168.0.38:8080,那系统就找不到相应的节点信息了。当然由于各种原因可能系统无法拿到正确的IP和端口,这时请您检查后,设置正确的IP和端口后,在相应的ClusterService的节点上加isSelf属性(isSelf=”true”)。

假如,SELF:下的信息不正确,或者没有信息,也请检查配置文件。

假如,下面列出的其它机器的信息不正确,或者有遗漏,也请检查配置信息后,重启报表应用重试。

假如,其它服务器的回应,没有回应OK,例如回应Connection timed out: connect。请检查下那台服务器的配置信息,检查网络连接,ping下那台机器的ip地址,看看是否能ping通。然后查看那台服务器报表应用的端口和应用名称是否设置正确。
可以在浏览器中输地址直接在内网中访问下那台机上的报表应用,看看设置的ip、端口号等是否设置正确。修改后,重新启动报表应用,重试。

假如您觉得一台台服务器都这样去测试太麻烦,您也可以直接改成op=cluster_test_all.(http://localhost:8080/WebReport/ReportServer?op=cluster_test_all)来一起测试。这个其实就是在本机上给其它机器发op=cluster_test的请求,然后把回应一起显示出来。例如这样。

Cluster is start
SELF:
ServiceName:A
IP:192.168.100.39
PORT:8080
WebAppName:WebReport

Other Server List:
NO1: ServiceName:B = 192.168.100.39:8070/WebReport
------------------------------------------
Test it(op = cluster_test) - RE:
Cluster is start! SELF:
ServiceName:B
IP :192.168.100.39
PORT :8070
WebAppName :WebReport

Other Server List:
NO1: ServiceName:A = 192.168.100.39:8080/WebReport - OK


------------------------------------------
这个可能回应的时间比较长,所以假如长时间没有回应,说明某台机器的配置有问题,还是需要照上面的步骤一台台机器去测试。

4.    结束
当以上检查步骤结束。所有服务器都检查,发现正确后。恭喜,配置就完成了。



假如您在配置过程中,有无法解决的问题,请与我们联系。