在开发大型的网络应用时,有时一台服务器往往不能满足客户端的要求,此时只能通过增加服务器来解决问题,也就是使用多台服务器平衡网络的负载。通过网络负载平衡将多台服务器以一个IP地址公布给网络,对外界而言看到的就像是一台服务器一样,如果网络负载平衡中的一台或几台服务器不可用时或繁忙时,服务不会中断,能够迅速在剩余的服务器中重新指派客户机通讯,帮助你为关键的业务程序提供不中断的服务。
针对于不同类型的应用程序,实现网络负载平衡的方式也不相同,在Windows Server 2003中,可以很容易完成在网络负载平衡管理(这是它自带的组件),当配置完负载平衡后,只要支持负载平衡的服务都可以自动实现负载平衡,如:Internet信息服务 (IIS)、ISA Server 2000防火墙与代理服务器、VPN虚拟专用网、终端服务器、Windows Media Services(Windows视频点播、视频广播)等服务。
如果想要架设上述以外的服务,那就需要服务自身对网络负载平衡的支持,下文讲述怎样用Apathe服务器+tomcat实现网络负载平衡。
tomcat实现网络负载平衡的方式有两种,第一种是依赖于Windows Server 2003,这种方式的原理是:在多台服务器上安装内容相同的tomcat服务器,通过配置文件使其与Windows Server 2003的心跳相关,这样多个tomcat之间可以通过Windows Server 2003的心跳联系起来实现sessin的同步与共享。这种方式比较简单,但有很大的缺点,它需不断的读Windows Server 2003的平衡处理信息,在效率上不理想,而且无法跨平台。
理想的方式是不依赖于OS,tomcat本身就具备集群管理的能力。以这种方式实现需要按照以下几个步骤进行。
一、准备
Apache服务器
下载地址:http://httpd.apache.org
Apache HTTP服务器(下文简称Apache服务器或者Apache)是由Apache软件组织提供的开放源代码软件,它是一个非常优秀的专业的Web服务器,为网络管理员提供了丰富多彩的Web管理功能,包括目录索引、目录别名、内容协商、可配置的HTTP错误报告、CGI程序的SetUID功能、子进程资源管理、服务器端图像映射、重写URL、URL拼写检查及联机手册等。Apache 服务器本身没有提供 Servlet/JSP 容器。因此,在实际应用中,把 Tomcat与Apache服务器集成,可以建立具有实用价值的商业化的Web平台。
JK插件(mod_jk.so)
下载地址:http://tomcat.apache.org/download-connectors.cgi
JK插件是用来使Apache服务器连接到tomcat的插件。该插件的版本要与Apache服务器版本统一,不然加载不上(我用的是2.0.63版,这里一定要注意,我已经被折磨了)。
tomcat5.5这个版本不限。
二、安装与配置
1.在两台服务器上安装tomcat,假设IP分别为192.168.0.2,192.168.0.3,端口都是8080,并网络畅通。
2.在其中的一台机器上或第三台机器上安装Apache2.0.63,只要按默认设置进行安装即可。如果安装成功,会自动在Windows中加入Apache HTTP服务,并且采用默认的80端口作为HTTP端口,注意在安装前确认80端口没有被占用,或安装时使用其它的端口。<APACHE_HOME>/conf子目录下有一个配置文件httpd.conf。找到Listen 80 ,可以在这里重新修改端口号。
3.把mod_jk.so复制到<APACHE_HOME>/modules目录下。
4.在<APACHE_HOME>/conf目录下创建如下的tomcats.properties文件,内容如下:
worker.list=tomcat1,tomcat2,loadbalancer #表示连接的服务列表
worker.tomcat1.port=8009 #tomcat中用于连接管理的端口,tomcat中默认是这个端口,可以在tomcat/conf/server.xml中改成别的
worker.tomcat1.host=192.168.0.2 #Tomcat服务器的地址
worker.tomcat1.type=ajp13 #类型
worker.tomcat1.lbfactor=100 #负载平衡因数
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.0.2
worker.tomcat2.type=ajp13 #类型
worker.tomcat2.lbfactor=100 #负载平衡因数
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2 #在tomcat1和tomcat2中平衡
worker.loadbalancer.sticky_session=1#0表示不锁定session,1表示锁定
worker.loadbalancer.sticky_session_force=false
5.在<APACHE_HOME>/conf/httpd.conf文件的最后加入:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/tomcats.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug #日志级别debug,info,error,war
JkMount /*.jsp loadbalancer #当访问*.jsp时先会启动loadbalancer,然后通过该服务自动平衡到具体的comcat服务器上。
三、运行
在两台tomcat服务器的webapps/root下分别建立一个test.jsp文件,里面分别写上tomcat1和tomcat2.
重新启动Apahe服务器与两台tomcat服务器,在地址栏输入:http://Apache服务器地址/test.jsp。会发现当 worker.loadbalancer.sticky_session=0时,显示结果每次刷新可能会不同,证明它已平衡到不同的tomcat上了,而得1时,在同一个session中它会强行的绑定到同一个tomcat上。