目 录
1 背景
1.1 集群背景与发展
1.2 集群与云计算
2 TOMCAT集群原理
2.1 Tomcat集群组件
2.2 Tomcat集群结构
3 安装运行环境
3.1 准备安装软件
3.2 安装Apache
3.3 安装Tomcat
3.4 安装JK组件
4 TOMCAT负载均衡
4.1 Tomcat端口配置
4.2 Apache配置
4.3 平均请求测试
4.4 邦定请求测试
5 TOMCAT集群
5.1 Apache配置
5.2 Tomcat配置
5.3 测试工程配置
5.4 集群之后测试
1 背景
群集技术与研究方向目前已非常成熟,本文不对集群技术再做详细介绍,也不对集群中的服务器硬件、网络适配器、第五层交换、第七层交换技术做讲述,直接以WEB集群的例子来展现集群技术的简单应用。
1.1 集群背景与发展
本文的集群指WEB服务器集群,只是集群技术中很小的分支。
随着业务与需求的增长WEB服务器访问量不断的增加,客户对产品的负载能力与稳定性随之提高,在单一WEB服务器的架构中已经难以达到用户的需求,在进一步提高产品的质量外,需要寻求更可靠的技术支持。
市场需要我们回答以下问题
在产品稳定的情况下,如何面对不断增长的访问量?
在现有硬件的基础下,如何更进一步发挥硬件的性能?
WEB应用突发停止后,如何保证继续为客户提供服务?
在更换新版本系统时,如果保证不间断的提供服务?
上面的问题是在所有WEB系统开发、运行、维护过程中都会碰到的问题。如果要解决这个问题则首先要采用:WEB服务器系统集群技术。
系统集群在技术上还有很多问题尚未解决,不过,对于基本的WEB集成解决方案业界已经有了成熟的技术。
采用集群技术之后解决WEB服务器容量带来的巨大挑战,服务器资源终究是有限的,大容量服务器对用户来说是一笔巨大的开支,也无法保障原来的投入,同时也解决不了根本问题。
WEB系统集群技术为系统容量、扩展问题提供了良好的途径,同时又能保护用户的投资,它能把一组服务器通过一定形式组织起来,对外提供强大的服务能力,也能在同一服务器上部署多个相同系统集群充分挖掘服务器的潜力。
这种结构具有很高的性价比和良好的可靠性,并且可以通过增加虚拟服务器与物理服务器的方式不断的扩充系统容量,因此,WEB服务器集群已经成为构建大型网站系统的关键技术之一。
1.2 集群与云计算
集群是一个非常专业的学科,专业化的集群需要非常特殊的硬件与软件支持,在复杂的集群中有些几乎需要设置相同的硬件,并且运行特殊的操作系统版本才能保证他们同步。如果在网络底层进行集群还需要使用特殊的网络适配器来保证集群计算机的高速数据同步,要把不同地区的服务器集群还需要高速专用网络的支持。数据同步方面,在集群WEB服务器时其中最典型的一点就是服务器间的Session同步问题。
集群对各种条件要求比较高,它能实现高可用性,高稳定性,虚拟存储管理,服务器故障平滑转移及灾难恢复等复杂的应用,但是复杂的集群实现成本非常高,又难以对外提供商业化服务是阻碍其发展的重要原因。
云计算是从集群技术、网络计算、分布式计算等技术发展起来的一种新应用服务形式,是建立在原来的基础之上隔离了集群技术的复杂性,直接以服务的形式交付给客户使用。从应用上来说云是位于集群、分布式技术等等的上层,它把硬件、软件、操作系统与用户隔离,用户看到的只是公开的网络服务、是可选择的网络商品,不需要了解背后采用什么技术、使用什么操作系统等等。隔离了复杂技术的云计算,重点关注的是对外提供高质量的商业服务。
2 TOMCAT集群原理
2.1 Tomcat集群组件
操作系统:Windows
Http服务器:Apache
Apache模块:Mod_JK
Web服务器:Tomcat
2.2 Tomcat集群结构
Tomcat集群主要包括三大部分 Apache,JK,Tomcat,三者之间的关系与处理过程如下图。
客户请求
分配请求、负载均衡、服务器运行状态等
Session复制、数据同步等集群管理
3 安装运行环境
3.1 准备安装软件
操作系统:windows(本文只测试了windows环境)
Http服务器:Apache 版本为httpd-2.2.21-win32-x86-openssl-0.9.8r.msi,下载地址http://httpd.apache.org/
Apache模块:Mod_JK 版本为mod_jk-1.2.31-httpd-2.2.3.so,下载地址http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/ 注意下载版本JK后所注明的http服务器版本一定要与 Apache版本相同或相近。
Web服务器:Tomcat版本这里采用 Tomcat5.0.28是比较老的版本,也可以采用 5.5.X或6.X等新版本,下载地址 http://tomcat.apache.org/ 下载压缩版,这样便于复制安装。
3.2 安装Apache
下载完成之后,运行程序安装Apache,只要按默认设置进行安装即可,安装位置可以自己选择,本文安装目录为:D:\Program Files\Apache Software Foundation\Apache2.2。
默认安配置装的Apache是 80端口为HTTP端口。
3.3 安装Tomcat
本文要集群三个独立的Tomcat,所以把下载后的压缩包解压后复制三份到不同目录,本文目录为:D:\Tomcat5.0_8080; D:\Tomcat5.0_8081 ; D:\Tomcat5.0_8082 。
3.4 安装JK组件
以本文为例把JK组件包mod_jk-1.2.31-httpd-2.2.3.so复制到Apache目录D:\Program Files\Apache Software Foundation\Apache2.2\modules 下。
4 TOMCAT负载均衡
4.1 Tomcat端口配置
安装环境之后,本文中Apache服务器要与3个Tomcat进行集成,为方便测试3个Tomcat都运行在同一台机器上,为了解决Tomcat端口冲突问题必须重新进行设置,端口分配如下表:
down
http
ajp
proxy
原始默认值
8005
8080
8009
8082
Tomcat_1_8080
8010
8080
8020
8090
Tomcat_2_8081
8011
8081
8021
8091
Tomcat_3_8082
8012
8082
8022
8092
如果三台服务器运行在不同的电脑中则不需要修改。
找到Tomcat配置文件修改端口,Tomcat配置文件目录为Tomcat5.0\conf\server.xml
依次修改D:\Tomcat5.0_8080 , D:\Tomcat5.0_8081 , D:\Tomcat5.0_8082中的配置文件,用记事本打开文件直接采用查找替换方式,按上表把原来的四个端口修改成新值。
注意事项:server.xml 配置文件中proxy 的8020端口内容是被注释掉的,需要去掉注释。
完成修改后,测试运行3个Tomcat如下图:
正常启动后,请注意各服务器的端口是不是正确的配置,如果没问题,则这部分配置顺利完成。
4.2 Apache配置
1. 找到Apache服务器配置文件D:\Program Files\Apache Software Foundation\Apache2.2\conf\ httpd.conf
2. 用记事本打开httpd.conf文件,在最后增加一行代码:Include conf/mod-jk.conf
3. 在httpd.conf文件同目录下创建mod-jk.conf 文件,全部代码如下:
#加载mod_jk模块,注意名称与modules目录下的文件名保持一致.
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
#指定workers.properties文件目录.
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,controller为workers.propertise文件里指定的负载控制器.
JkMount /* controller
#JkMount /*.html controller
#JkMount /*.jsp controller
#JkMount /*.do controller
JkMount /servlet/* controller
#JkUnMount /index.html controller
#关掉主机Lookup, 如果为on很影响性能.
HostnameLookups Off
4. 在httpd.conf文件同目录下创建workers.propertise 文件,全部代码如下:
worker.list=controller,tomcat1,tomcat2,tomcat3 #server群集列表,tomcat名称与Tomcat配置Service.xml的jvmRoute名称一致
#========tomcat1========
worker.tomcat1.port=8020 #指定 tomcat1 服务器 AJP 的端口,默认为8009
worker.tomcat1.host=localhost #指定 tomcat1 服务器IP 或域名
worker.tomcat1.type=ajp13 #指定 tomcat1与apache AJP通讯协议
worker.tomcat1.lbfactor=1 #指定负载平衡因数,只有启用了负载平衡才有用.
#========tomcat2========
worker.tomcat2.port=8021 #指定 tomcat2 服务器 AJP 的端口,默认为8009
worker.tomcat2.host=localhost #指定 tomcat2 服务器IP 或域名
worker.tomcat2.type=ajp13 #指定 tomcat2与apache AJP通讯协议
worker.tomcat2.lbfactor=1 #指定负载平衡因数,只有启用了负载平衡才有用.
#========tomcat3========
worker.tomcat3.port=8022 #指定 tomcat3 服务器 AJP 的端口,默认为8009
worker.tomcat3.host=localhost #指定 tomcat3 服务器IP 或域名
worker.tomcat3.type=ajp13 #指定 tomcat3与apache AJP通讯协议
worker.tomcat3.lbfactor=1 #指定负载平衡因数,只有启用了负载平衡才有用.
#========controller 负载平衡控制器========
worker.controller.type=lb #指定 controller 类型
worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3 #指定负载平衡的tomcat
worker.controller.sticky_session=true #指定是否粘性 session
worker.controller.sticky_session_force=false
# session 配置说明:
#当sticky_session,sticky_session_force都为true时不复制session,
#sticky_session_force=false 指集群中某台服务器多次请求没有响应, 则转发到其它服务器处理,
#sticky_session=false 不使用粘性session,同时配置不复制session时, 注意转发请求后可能会找不到原来的session.
完成后启动Apache 在状态栏中可看到已集成 JK模块,如图所示:
虽然已经看到集成了JK模块,但是还不知道是不是顺利完成了负载均衡配置,下面我们进行测试。
4.3 平均请求测试
确保上述步骤操作正确后,接下来部署一下工程进行测试。
1. 部署一个test测试工程
假设大家都知道部署。
2. 编写一个jsp测试页
在test工程的根目录新建一个test.jsp测试文件,全部代码如下:
//应用程序地址.
String sId =request.getSession().getId();
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
//应用程序物理目录.
String appPath = request.getSession().getServletContext().getRealPath("/");
System.out.println(appPath+" --------Test JSP--------");
%>
测试JSP页面
测试JSP页面:
名称: 内容:
首页地址:
WEB程序目录:
Session>
3. 依次启动Apache,Tomcat1,Tomcat3,Tomcat3
访问测试页 http://localhost/test/test.jsp 显示如下图。
对测试页进行多次访问,本例测试访问6次,每次检查3个Tomcat服务器的控制台窗口,发现一个现象:如果第一次访问是Tomcat1,第二次变为Tomcat2,第三次则是Tomcat3,第四次又回到Tomcat1,3个服务器是进行轮流处理请求,现在已经实现了负载均衡的目的。
现在已经完成3个WEB服务器负载均衡配置,并且3个服务器是平均分配用户请求。
4.4 邦定请求测试
邦定请求方式,就是定义首次请求的服务器为最高优先分配,只要客户没有关闭IE,以后每一次请求都交给同一服务器处理。这样做的好处是用户只需登录一次,以后都是同一服务器处理,登录Session没有改变,不需要进行再次登录。
打开server.xml 找到如图中配置: 修改成: 结果如图。
测试的三个服务器的jvmRoute配置名称不能相同,请按下表修改。
http
jvmRoute名称
Tomcat_1_8080
8080
Tomcat1
Tomcat_2_8081
8081
Tomcat2
Tomcat_3_8082
8082
Tomcat3
配置完成后,依次启动Apache,Tomcat1,Tomcat3,Tomcat3访问测试页 http://localhost/test/test.jsp
注意:Tomcat1,Tomcat3,Tomcat3 的名称在必须与 workers.propertise文件里的名称配对。
第一次访问如下图,SessionId与前面的不一样,在后面增加了Tomcat1的名称:
第二次访问如下图,明显可以看出是访问同一服务器,并且SessionId都相同:
经过测试,在没有关闭IE的情况下多次访问都是提交给同一服务器处理,并且SessionId保持不变,其它的服务器没有接到请求,请看Tomcat1后台窗口:
为了验证多用户情况,又重新打开一个新的IE,发现新IE请求交给了Tomcat2处理,并且新IE多次刷新请求后,仍然是交给Tomcat2处理。
到现在Tomcat负载均衡配置已顺利完成,下面讲述怎么样把这三个独立的WEB服务器进行集群。
5 TOMCAT集群
虽然上面已经完成了负载均衡,但是三个服务器还是独立工作,没有形成一个整体,他们之间没有同步数据,基本的Session也没有复制,如果其中一个服务器关闭,请求会转发到另一个活动的服务器,新的服务器是没有原来的Session数据,客户必须再次登录,这种情况不能在实际应用发生,要解决这个问题,需要用到Web服务器集群来实现Session在所有服务器上同步复制。
5.1 Apache配置
在上一节中Apache基本已经配置完成,这里不需要再修改,最主要的是配置 workers.propertise 文件,这里只对重要的部分进行说明。
配置是否使用粘性 Session的选项:worker.controller.sticky_session。类似帮定,指某web服务器产生的Session,在下次客户用相同Session再访问服务器时仍然转发到相同的web服务器(必须指定好web服务器路由配置才行,就是配置jvmRoute名称)。
配置是否约束Session复制:worker.controller.sticky_session_force。
两者的组合关系如下表所示:
sticky_session
sticky_session_force
说明
true
false
Session有粘性,会复制,这是默认值
true
true
Session有粘性,不会复制
false
true
Session无粘性,会复制
false
false
Session无粘性,会复制
注意:配置session的复制后某台机器发起的session会广播给其他tomcat,每个tomcat都保留一份相同的未结束的session,此参数很耗费资源,所以web服务器之间的网络速度越快越好,尽量把服务器放置在同一个局域网内,以提高同步速度。
5.2 Tomcat配置
Tomcat服务器主要是启用集群模块,打开Tomcat服务器配置文件server.xml ,找到内容: 开头的部分,打开注释以便启用集群功能如下图所示:
修改集群tcpListenPort端口值,如果三台服务器运行在不同的电脑中则不需要修改,下面是3个web服务器集群端口的配置值:
tcpListenPort
Tomcat_1_8080
4010
Tomcat_2_8081
4011
Tomcat_3_8082
4012
5.3 测试工程配置
修改测试工程下面的 web.xml文件(注意:是部署的工程中的WEB-INF \ web.xml文件),在节点中加入一行配置:,如图所示:
5.4 集群之后测试
依次启动Apache,Tomcat1,Tomcat3,Tomcat3访问测试页 http://localhost/test/test.jsp,访问结果如图,这次连接的是8080端口的服务器:
假如8080端口的服务器,由于某种原因崩溃(测试时我们手动关闭8080服务器),如果再次刷新网页访问服务器,这次连接的是8082端口服务器,我们来看看测试图:
由于8080服务器已经关闭,请求转发到8082服务器,但是Session仍然是一样的!这证明服务器实现了集群,服务器上的Session已同步复制。
经过反复测试可以确定web服务器集群配置成功。 |