设为首页 收藏本站
查看: 1327|回复: 0

[经验分享] Web服务器基于 Apache集群与负载均衡之Tomcat篇

[复制链接]

尚未签到

发表于 2015-12-23 15:02:07 | 显示全部楼层 |阅读模式
   
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集群主要包括三大部分 ApacheJKTomcat,三者之间的关系与处理过程如下图。

HTTP请求

客户请求
Apache

JK

Tomcat1

Tomcat2

 
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.X6.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服务器要与3Tomcat进行集成,为方便测试3Tomcat都运行在同一台机器上,为了解决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端口内容是被注释掉的,需要去掉注释。
完成修改后,测试运行3Tomcat如下图:
 
 
 
 
正常启动后,请注意各服务器的端口是不是正确的配置,如果没问题,则这部分配置顺利完成。
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处理,controllerworkers.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.xmljvmRoute名称一致
 
#========tomcat1========
worker.tomcat1.port=8020    #指定 tomcat1 服务器 AJP 的端口,默认为8009
worker.tomcat1.host=localhost      #指定 tomcat1 服务器IP 或域名
worker.tomcat1.type=ajp13   #指定 tomcat1apache AJP通讯协议
worker.tomcat1.lbfactor=1    #指定负载平衡因数,只有启用了负载平衡才有用.
 
#========tomcat2========
worker.tomcat2.port=8021    #指定 tomcat2 服务器 AJP 的端口,默认为8009
worker.tomcat2.host=localhost      #指定 tomcat2 服务器IP 或域名
worker.tomcat2.type=ajp13   #指定 tomcat2apache AJP通讯协议
worker.tomcat2.lbfactor=1    #指定负载平衡因数,只有启用了负载平衡才有用.
 
#========tomcat3========
worker.tomcat3.port=8022    #指定 tomcat3 服务器 AJP 的端口,默认为8009
worker.tomcat3.host=localhost      #指定 tomcat3 服务器IP 或域名
worker.tomcat3.type=ajp13   #指定 tomcat3apache 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.  依次启动ApacheTomcat1Tomcat3Tomcat3
访问测试页 http://localhost/test/test.jsp 显示如下图。
 
 
对测试页进行多次访问,本例测试访问6次,每次检查3Tomcat服务器的控制台窗口,发现一个现象:如果第一次访问是Tomcat1,第二次变为Tomcat2,第三次则是Tomcat3,第四次又回到Tomcat13个服务器是进行轮流处理请求,现在已经实现了负载均衡的目的。
 
 
 
现在已经完成3WEB服务器负载均衡配置,并且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
配置完成后,依次启动ApacheTomcat1Tomcat3Tomcat3访问测试页 http://localhost/test/test.jsp
注意:Tomcat1Tomcat3Tomcat3 的名称在必须与 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端口值,如果三台服务器运行在不同的电脑中则不需要修改下面是3web服务器集群端口的配置值:
 
tcpListenPort
 
Tomcat_1_8080
4010
 
Tomcat_2_8081
4011
 
Tomcat_3_8082
4012
 
5.3         测试工程配置
修改测试工程下面的 web.xml文件(注意:是部署的工程中的WEB-INF \ web.xml文件),在节点中加入一行配置:,如图所示:
 
 
 
5.4         集群之后测试
依次启动ApacheTomcat1Tomcat3Tomcat3访问测试页 http://localhost/test/test.jsp访问结果如图,这次连接的是8080端口的服务器:
 
假如8080端口的服务器,由于某种原因崩溃(测试时我们手动关闭8080服务器),如果再次刷新网页访问服务器,这次连接的是8082端口服务器,我们来看看测试图:
 
由于8080服务器已经关闭,请求转发到8082服务器,但是Session仍然是一样的!这证明服务器实现了集群,服务器上的Session已同步复制。
经过反复测试可以确定web服务器集群配置成功。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-155338-1-1.html 上篇帖子: Nginx、Lighttpd与Apache的区别 下篇帖子: 如何安装和配置Apache服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表