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

[经验分享] Apache & Tomcat集群配置

[复制链接]

尚未签到

发表于 2017-1-1 08:34:44 | 显示全部楼层 |阅读模式
1.  
概述

对于大型网站系统或者访问量较高的应用系统,多用户的并发访问常常会导致服务器的异常甚至不响应,一个web服务器往往无法满足所有的负载。解决这个问题的办法就是把负载分担在多个web服务器上,使系统稳定、快速的运行。均衡负载最常用的方式是集群(cluster),即把多个web服务器节点分布在一个或多个硬件服务器上,已达到分担处理请求的目的。
2.  
原理

对于以tomcat为application server的应用,常见的集群方式是web server(apache)调用连接器(如jk2),通过负载均衡(ajp13),把访问分发到各个tomcat节点,各个节点处理完访问后,把相应的response数据发送给web server,然后由web server把访问结果返回给浏览器(用户)。
Tomcat的集群主要包括三个部分:负载均衡、session同步、webApp(web资源)同步。
2.1.     
负载均衡

负责request请求的自动分配,根据app server(tomcat)的负载来决定分配方式,常用apache的ajp13(属于tomcat的一个子项目)来处理。
2.2.     
session同步

即Session
Replication,是集群面临最大的一个问题。

由于http协议的无状态性,对于用户识别以及信息保留一般都通过session来处理,所以各个cluster的节点必须保障session的一致性。同时session的同步还要考虑性能的问题(socket,IO etc…),tomcat中使用tomcat cluster子项目来实现session的同步(基于TCP/IP协议)。
对于超大型网站系统,基于性能方面的考虑,需要实现primary-secondary session replication,(prsp)即实现session的分级同步,减轻session复制对于访问相应的影响。Tomcat5.5以及以前版本没有实现对于prsp的支持,但据说会在下个版本实现。
2.3.     
webApp同步

即webApp的自动分发。一次分发(deploy)/改动,各个cluster节点自动同步。
对于集群,各个cluster节点的文件资源(resource,包括程序、配置文件、页面、图片、用户上传资源文件等)必须保持一致。对于大型网站或高访问量的应用系统,这种同步必须在特别短的时间(小到可以被忽略)内、不对程序运行造成破坏的情况下进行,所以手工同步是不现实的。
Tomcat5.5以及以前的版本没有对此进行支持,需要自己来实现。
2.4.     
图示

http://blog.donews.com/images/blog_csdn_net/huazii/cluster.jpg

3.  
方案

由于tomcat的web server功能和性能的局限性,采取以下方案:

  •       
    采用web server + tomcat的方式
  •       
    Tomcat 采用 tomcat5.5(配合jmx.jar,以使其可以运行在非jdk5.0版本)
  •       
    Web server采用apche2.0
  •       
    连接器(connecter)采用jk2 

    (见http://jakarta.apache.org/site/downloads/downloads_tomcat-connectors.cgi)
  •       
    负载均衡采用ajp13 (tomcat集成)
  •       
    集群采用tomcat自带cluster (tomcat集成)
  •       
    文件资源同步 (未实现,建议参考tomcat
    context reload
    部分。)
4.  
配置方式

1.软件的准备

a)Apache 2.0

b)Tomcat 5.5
(以及jdk1.4兼容布丁)

c)mod_jk2.so



2.ApacheTomcat的整合以及Balancer的配置

a)首先安装Apache,然后将mod_jk2.so拷贝在ApacheModule目录中

b)修改httpd.conf文件,添加以下内容:

LoadModule
jk2_module modules/mod_jk2.so

c)Apache中的conf/httpd.conf添加指定web目录,如

Alias /myWebApp
"D:/tomcat/webapps/myWebApp/"

或者直接设定为默认访问目录”/”:
DocumentRoot
"
D:/tomcat/webapps/myWebApp/"
在Apache中的conf/httpd.conf添加如下配置,已禁止访问所有/WEB-INF/目录:
<Directory
~ "/WEB-INF/">

    Order allow,deny

    Deny from all

</Directory>

d)Apacheconf目录中建立workers2.properties文件,内容如下:

[logger.apache2]

level=DEBUG

[shm]

file={apache_home}\logs\shm.file

size=1048576

#第一个Tomcat的配置

[channel.socket:tomcat1]

#tomcat connecter端口,自己定义,保持和tomcatserver.xml中的一致既可

port=8009

#tomcat ip地址或域名

host=localhost

定义worker

[ajp13:tomcat1]

channel=channel.socket:tomcat1

#第二个Tomcat的配置

[channel.socket:tomcat2]

#tomcat connecter端口,自己定义,保持和tomcatserver.xml中的一致既可

port=9009

#tomcat ip地址或域名

host=localhost

#定义worker

[ajp13:tomcat2]

channel=channel.socket:tomcat2

#定义Balancer(负载均衡器)

[lb:lb1]

worker=ajp13:tomcat2

worker=ajp13:tomcat1

#Uri的映射,满足uri条件的,apache才会送给tomcat来处理,所以这里要列出所有送给tomcat$#处理的uri,以后缀名或者web路径的方式。

[uri:/*.do]

[uri:/*.jsp]

group=lb:lb1

注:{…}代表得内容需要根据具体情况来配置。

e)修改Tomcat的配置

修改第一个Tomcatconf目录中server.xml,添加或修改以下内容:

<Connector
port="8009" enableLookups="false"
redirectPort="8443" debug="0" protocol="AJP/1.3"
/>

<!—portworker2对应–>



修改第二个Tomcatconf目录中的server.xml,添加或修改以下内容:

<Connector
port="9009" enableLookups="false"
redirectPort="8443" debug="0" protocol="AJP/1.3"
/>

<!—portworker2对应–>

 

注:和apache集成的tomcat最好只保留一个connector(在server.xml中去除不使用的),否则用户可能跳过apachetomcat直接访问,造成不可预料的异常。



修改第一个Tomcatconf目录中jk2.properties文件,添加以下内容:

channelSocket.port=8009

#server.xml以及worker对应



修改第二个Tomcatconf目录中jk2.properties文件,添加以下内容:

channelSocket.port=9009

#server.xml以及worker对应



这样TomcatApache的整合就完成了,你可以直接通过Apache来访问Tomcat5.



3.Tomcat集群的配置

a
)在Tomcatserver.xml文件的Host下有类似以下内容(已经被注释掉):

<Cluster
className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"

          managerClassName="org.apache.catalina.cluster.session.DeltaManager"

          expireSessionsOnShutdown="false"

          useDirtyFlag="true"

          notifyListenersOnReplication="true">

 

         <Membership

         className="org.apache.catalina.cluster.mcast.McastService"

         mcastAddr="228.1.2.3"

         mcastPort="45564"

         mcastFrequency="500"

         mcastDropTime="3000"/>

         <Receiver

         className="org.apache.catalina.cluster.tcp.ReplicationListener"

         tcpListenAddress="auto"

         tcpListenPort="4002"

         tcpSelectorTimeout="100"

         tcpThreadCount="6"/>

 

         <Sender

         className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"

         replicationMode="pooled"

         ackTimeout="15000"/>

 

         <Valve

         className="org.apache.catalina.cluster.tcp.ReplicationValve"

         filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

        

         <Deployer 

className="org.apache.catalina.cluster.deploy.FarmWarDeployer"

         tempDir="/tmp/war-temp/"

         deployDir="/tmp/war-deploy/"

         watchDir="/tmp/war-listen/"

         watchEnabled="false"/>

</Cluster>

 
把这个<Cluster>标签反注释掉,使之生效即可。

b
)在另一个Tomcat同上。

注:如果在同一台机器上运行,tcpListenPort不能一样.
c)在需要作集群的webappweb.xml中加上<distributable/>(具体位置在description标签之后).

这样所有的配置就结束了.配置完后,集群中的Tomcat会自动保证Session的复制.

 
注:三个及以上数量的cluster节点的配置依次类推。
参考:tomcat doccluster-howto以及“钝刀”的tomcat4.1的配置。
5.   对于系统程序编码的影响
5.1.     
session同步

为了保障tomcat
cluster各个节点对于session的自动同步,系统中所有保存在session的object必须实现序列化接口(Serializable),而且必须保证所有session中的object的成员域可序列化(如不能有java.sql.connection之类的涉及物理资源的成员域)。

5.2.     
关于static

由于各个cluster节点为两个单独的程序,分别拥有独立的堆栈甚至Jvm,系统中所有程序都不能出现依赖于具体请求的static变量或方法(换句话说,就是不能在各个servlet/jsp/action中共享非final的可能发生变化的static变量),比较常见的是在singleton模式中。
5.3.     
数据库并发

集群环境下,对数据库的并发访问可能会提升,但这种并发访问和同一个tomcat的多线程并发访问并无区别,所以确切的说,这并不是集群带来的问题,在所有多线程的情况下都必须注意。
6.  
总结、综述

大型网站系统或访问量大的应用系统,在高并发访问的情况下,由于业务处理时间较长,可能会造成响应迟缓甚至不响应的情况发生。
Tomcat集群主要解决业务处理的负载均衡,即把业务处理的压力分担在各个节点上,现在的情况下,其实施的主要成本为:
1.      
添置服务器,最集群节点。
2.      
开发自动同步webapp资源的系统。
3.      
对现有系统不符合第5条的模块的改进。
同时,在性能上,由于session共享带来的序列化/反序列化以及socket数据传送开销都比较大,在系统session更新频繁的情况下要慎重考虑是否使用集群。

运维网声明 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-322204-1-1.html 上篇帖子: apache 与 svn配置 下篇帖子: Apache curator-client详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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