Tomcat集群搭建

关于如何搭建Tomcat集群网上仍是能搜到不少相关的教程,这里结合我本身在实际应用中的操做作下备忘。html

案例说明:web

  这里以在本机部署的2个tomcat来作集群。固然,tomcat集群能够是分布式的,而差别也仅仅是在地址-端口的配置上,文章后面会讲到。apache

部署环境:浏览器

操做系统: Red Hat Enterprise Linux Server release 6.0 (Santiago)(x64)
JDK版本: 1.6.0_45

集群构成:tomcat

httpd + tomcat + mod_jk

版本选择:bash

httpd-2.2.26
apache-tomcat-7.0.42
mod_jk-1.2.31-httpd-2.2.3 #这里写的是httpd-2.2.3,但其实跟httpd-2.2.26也能适配

以上文件(都是我从Apache官网下载的)我已经作了打包并上传至百度云盘,须要的朋友可使用下面的连接下载:服务器

把所需文件上传至服务器之后,咱们就能够动手来搭建了。session

1.首先安装httpd,过程很简单以下:app

#解压httpd包
tar -zxf httpd-2.2.26.tar.gz
cd httpd-2.2.26/

#配置预编译选项,这里只关心输出目录就能够了
./configure --prefix=~/apache2
#编译
make
#安装
make install

 

2.部署tomcat负载均衡

#解压tomcat包,并复制成2份
tar -zxf apache-tomcat-7.0.42.tar.gz
mv apache-tomcat-7.0.42/ tomcat1/
cp -r tomcat1/ tomcat2/

2.1配置tomcat属性,这里以tomcat一、2为例(这里须要注意的地方主要是端口,设置时不要形成冲突便可):

#修改tomcat配置文件server.xml,主要修改:Shutdown端口,Connect服务端口,AJP端口
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1" redirectPort="8443" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
#修改集群名称和tomcat别名
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
#去掉cluster节点的注释
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
#修改以上端口是为了不本机内多个tomcat同时运行形成端口冲突
#修改tomcat配置文件context.xml,为<Context>节点增长distributable="true"属性

同理,tomcat2的配置:

#修改tomcat配置文件server.xml,主要修改:Shutdown端口,Connect服务端口,AJP端口
<Server port="8007" shutdown="SHUTDOWN">
<Connector port="8082" protocol="HTTP/1.1" redirectPort="8443" />
<Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />
#修改集群名称和tomcat别名
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
#去掉cluster节点的注释
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
#修改以上端口是为了不本机内多个tomcat同时运行形成端口冲突
#修改tomcat配置文件context.xml,为<Context>节点增长distributable="true"属性

2.2为tomcat增长个测试文件,后期测试集群性能使用:

<!--编辑webapps/test/test.jsp,主要用来测试负载均衡状况-->

<%@ page contentType="text/html; charset=GB2312" %>
<html>
    <head>
        <title>tomcat-cluster-test-page</title>
    </head>
    <body>
        SessionID: <%=session.getId() %> 
    </body>
</html>

OK,基本上tomcat的配置到这里就结束了。

 

3.为httpd增长集群配置文件

#在apache2/conf/下增长wokers.properties文件
#文件内添加内容,形式以下:

#server
worker.list=loadbalancer,jkstatus

#tomcat1
worker.tomcat1.port=8010 #该端口是tomcat1的AJP服务端口,设置方式如2.1所示
worker.tomcat1.host=localhost #若是tomcat部署在其余机器上,可填写其服务器IP
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1

#tomcat2
worker.tomcat2.port=8011 #该端口是tomcat2的AJP服务端口,设置方式如2.1所示
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1

#loadbalancer
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2
worker.loadbalancer.sticky_session=1
worker.jkstatus.type=status

3.1将mod_jk解压到apache2/modules下并命名文件为mod_jk.so,接下来修改配置文件以下:

#编辑apache2/conf/httpd.conf,在底部增长配置:

#加载mod_jk模块
LoadModule jk_module modules/mod_jk.so

#指定负载均衡配置文件
JkWorkersFile conf/workers.properties

#定义日志输出
JkLogFile logs/mod_jk.log
JkLogLevel debug

#mod_jk按照访问路径来作请求分发
#负载均衡的监控页面请求
JkMount /jkstatus jkstatus

#将其余任意请求都交由loadbalancer控制器处理 
JkMount /* loadbalancer

3.2为httpd手写一个启动控制器:

#!/bin/bash
#     file: run.sh
#     what: httpd-controller, Usage: run.sh [OPTIONS] <start|status|stop>

case "$1" in
    start)
        /tomcat/apache2/bin/apachectl -f /tomcat/apache2/conf/httpd.conf
        echo "apache-httpd started."
        ;;
    stop)
        kill -TERM `cat /tomcat/apache2/logs/httpd.pid`
        echo "apache-httpd stopped."
        ;;
    status)
        if [ -z "`ps -ef|grep httpd|grep -v grep`" ]; then
            echo "apache-httpd not started."
        else
            echo "apache-httpd is running."
        fi
        ;;
    *)
        echo "Usage: $0 [OPTIONS] <start|stop|status>"
        ;;
esac

 

4.启动tomcat和httpd:

tomcat1/bin/startup.sh 
tomcat2/bin/startup.sh 

apache2/bin/run.sh start

启动后,经过浏览器访问下监控页面http://192.168.1.100:8080/jkstatus

 

访问http://192.168.1.100:8080/test/test.jsp,页面显示正常:

那么咱们来找个机器测试下负载均衡性能,测试结果以下:

[tomcat@server ~/test]$for((i=0;i<1000;i++))
> do
>   wget http://192.168.1.100:8080/test/test.jsp 2>/dev/null
> done
[tomcat@server ~/test]$awk -F. '/SessionID/{a[$2]++}END{for(i in a){print i, a[i]}}' test.jsp*
tomcat1   500
tomcat2   500

从结果来看:负载后,tomcat接收到的请求占比差很少1:1,仍是不错的。

关掉tomcat1,而后测试下访问会不会出现问题:

[tomcat@server ~]tomcat1/bin/shutdown.sh
[tomcat@server ~]cd test/
[tomcat@server ~/test]$for((i=0;i<1000;i++))
>do
>wget http://192.168.1.100:8080/test/test.jsp 2>/dev/null
>done
[tomcat@server ~/test]
[tomcat@server ~/test]$awk -F. '/SessionID/{a[$2]++}END{for(i in a){print i, a[i]}}' test.jsp*
tomcat2 1000

OK,全部请求都转发到tomcat2去了,说明节点故障也能够应付。tomcat集群搭建成功。

 

以上便是tomcat集群搭建的全过程了,文章若有不当之处各位请不吝赐教。

相关文章
相关标签/搜索