1. 问题概述
A: 早期的服务器集群,一个客户端在一个访问周期里,总是固定访问一台服务器,以保持session的一致。可是随着对负载均衡的要求越来越高,这种模式不再能满足需求。举例来说,同时有100个客户端访问服务器,共有5台服务器集群,因此每台服务器分配了20个客户端,一段时间以后,陆续有80个客户端终止访问,剩余的20个客户端碰巧都是同一台服务器上的。此时这台服务器很忙,而别的服务器很闲。
为了更好地适应负载均衡的需求,很多服务器推出了session同步的功能。即同一个客户端在同一个访问周期里,可能第一次访问A机器,第二次跳转到B机器访问,此时在访问A机器过程中产生的session里的内容可以被同步复制到B机器上。于是上述的问题就得到了很好的解决。当80个客户端都终止访问后,剩余的20个客户端很快被平均分配到五台服务器上,每台服务器应付4个客户端即可,服务器资源得到了最大程度的利用。
B: 服务器的集群只解决了服务器自己的session同步问题,而作为报表工具,几乎所有的B/S报表工具都会提供参数缓存和报表缓存。参数和报表缓存的目的,是为了解决同一个用户在初次浏览报表后,再次执行翻页、打印、导出等操作时不用重新计算报表重新输入参数的问题。如果没有缓存,每一次点击翻页都重新计算报表,服务器的消耗太大。
也许有些报表工具会把参数缓存到session里,但是更多的报表工具为了兼容各种环境,往往自己制作了缓存池。至于报表的缓存,由于报表占用的空间比较大,一般的缓存都是存到硬盘上,不可能存到session里。因此,在上述集群环境下,当客户端第一次访问报表服务器的时候,A机器计算了报表并在A机器作了缓存,当客户端第二次访问时,例如此时跳转到B机器,B机器上找不到报表的缓存,也找不到参数的缓存,于是只好报错或者重新计算。
如何实现集群的时候缓存同步?
2. 解决方案
润乾报表提供了集群服务器之间通讯的能力,彻底解决了负载均衡时服务器之间跳转访问带来的缓存同步的问题。其原理是:
首先,客户端第一次访问报表服务器,A机器计算了报表并在A机器作了缓存,当客户端第二次访问时,例如此时跳转到B机器,B机器根据缓存id判断出是A机器做的缓存,于是B机器向A机器发送缓存请求,A机器读取缓存并把缓存结果发送给B机器,B机器再把结果返回给客户端。
优势:
1.应用服务器可以使用更加先进的集群能力,可以实现更加合理的负载均衡
2.在集群过程中,不仅仅实现了session同步,还实现了报表缓存同步
3.缓存同步使得服务器的运算次数大大减少,比如客户端一共访问了N次报表,每个报表执行了M次的翻页导出打印等操作,如有缓存同步,服务器只需要运算N次;如果没有缓存同步,而碰巧每一次翻页等操作都跳转到别的服务器(假设最糟糕的情况),服务器需要运算N*M次。
3. TOMCAT负载均衡配置说明
A:环境说明
Apache :apache_2.0.55 (必须为2.0以后版本)
Tomcat: apache-tomcat-5.5.17 (或者为5.5以上版本)
mod_jk: mod_jk-apache-2.0.55.so (必须与Apache版本同步)
润乾报表:4.1.61以后版本
B: Apache、Tomcat负载均衡
1.下载安装apche,tomcat
http://archive.apache.org/dist/httpd/binaries/win32/ 下载
apache_2.0.55-win32-x86-no_ssl.msi
http://tomcat.apache.org/download-55.cgi 下载tomcat5.5 zip版本(解压即可,绿色版)
http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/ 下载mod_jk,注意和 apache版本匹配
把Apache安装到:E:\ide\apache\Apache2,并使用8080端口。
解压两份Tomcat, 路径分别为 E:\ide\tomcat1,E:\ide\tomcat2
2.修改Apache配置文件http.conf
在apache安装目录下conf目录中找到http.conf,在文件最后加上下面一句话来引用mod_jk模块。
include "E:\ide\apache\Apache2\conf\mod_jk.conf"
3.新建mod_jk.conf文件
http.conf 同目录下(实际上是根据http.conf文件中,mod_jk配置的指定路径)新建mod_jk.conf文件,内容如下:
#加载mod_jk Module
LoadModule jk_module modules/mod_jk-apache-2.0.55.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器JkMount /* controller
4.新建 workers.properties文件
根据mod_jk.conf的配置,指定了workers.properties所在的位置与http.conf在同一目录下,新建本文件,内写入以下内容:
worker.list = controller,tomcat1,tomcat2 #server 列表
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=9009 #ajp13 端口号,非同一台电脑,一般使用默认8009端口。
worker.tomcat2.host= localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.controller.sticky_session=1
5.修改tomcat配置文件server.xml
如果你在不同电脑上安装tomcat,tomcat的安装数量为一个,可以不必修改tomcat配置文件,请直接跳过本节,如果是在同一台电脑上安装两个tomcat,则需要更改其中一个的设置,避免出现端口冲突。
打开tomcat2/conf/server.xml文件:将port8005修改为9005
将port 8080修改为9080
6.测试负载均衡
分别在tomcat1与tomcat2中建立一个应用,取名runqian,然后在本应用下建一个test.jsp,内容如下:
<%
System.out.println("服务器负载均衡");
%>
在IE中输入:http://localhost:8080/runqian/test.jsp。通过访问本jsp,查看tomcat1的窗口,可以看到打印了一行"服务器负载均衡",然后刷新一次,将在tomcat2的控制台中打印一行”服务器负载均衡”,以后每刷新一次,分别交替进行,完成负载均衡。
4. 配置润乾集群设置,达到缓存同步
A:在runqian这个应用中,部署好润乾报表,并且在reportConfig.xml中增加或者修改如下属性:
B:重起服务器,即可实现集群时缓存同步。