1集群配置介绍
Apache Tomcat可以说是当下最受欢迎的开源Java Web服务器。Tomcat的单个实例恐怕无法满足访问量日增的需要。这种情况下,需要考虑在“集群”环境下运行Tomcat;在这种环境下,Web服务器的工作负载分配到多个Tomcat实例。
负载均衡:前端服务器(常常名为“负载均衡器”、“代理均衡器”或“反向代理”)收到HTTP请求后,前端服务器将请求分发到后端的不止一个“worker”Web服务器,由它们实际处理请求。负载均衡可以消除后端的单一故障点,并且可以为任何Web服务实现高可用性、高扩展性以及更合理的资源优化。
会话复制:会话复制是一种机制,将客户端会话的整个状态原原本本复制到集群中的两个或多个服务器实例,以实现容错和故障切换功能。通常情况下,分发的状态服务能够跨集群中的多个不同服务器实例,复制客户端会话的状态。
集群:集群由两个或多个Web服务器实例组成,这些服务器实例步调一致地工作,透明地处理客户端请求。客户端将一组服务器实例认为是单一实体服务。集群的目的是,为客户端提供高可用性服务,同时尽量高效地利用所有的可用计算资源。
2配置过程
2.1环境要求
下面是搭建Tomcat集群的具体要求。我在本教程中假设有4台Ubuntu服务器。
Apache服务器#1:(106)带mod_jk的Apache HTTP Web服务器(充当代理均衡器)
Tomcat服务器#2:(107-109)Java运行时6.x或更高版本,以及Apache Tomcat 7.x(充当worker Web服务器)。
Apache Web服务器充当代理均衡器。Apache Web服务器是客户端唯一看得见的那台服务器,所有的Tomcat实例都被隐藏起来,客户端看不见它们。mod_jk插件被激活后,Apache Web服务器将任何入站的HTTP请求转发到集群中的Tomcat worker实例。
2.2 apache 服务器安装
Tomcat Connectors让你可以将Tomcat连接到其他开源Web服务器。对Apache Web服务器而言,Tomcat Connectors以一种名为mod_jk的Apache模块而出现。装有mod_jk的Apache Web服务器可以将Ubuntu服务器变成代理均衡器。
$ sudo apt-get install apache2 libapache2-mod-jk
2.3 tomcat服务器安装
1)Jdk安装
$ apt-cache search openjdk
After checking the latest version of OpenJDK, install it with apt-get
$ sudo apt-get install openjdk-7-jdk
$ vi ~/.bashrc设置环境变量
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
2)Tomcat 安装
Copy tomcat to server
$ sudo tar xvzf apache-tomcat-7.0.35.tar.gz -C /opt
CATALINA_HOME=/opt/apache-tomcat-7.0.35
Reload .bashrc file as follows.
$ source ~/.bashrc
Now enable Tomcat by running the following startup script.
$ sudo $CATALINA_HOME/bin/startup.sh
2.4 apache 服务器配置
在Ubuntu上,mod_jk配置文件位于/etc/apache2/mods-enabled/jk.conf。更新如下:
<IfModule jk_module>
# We need a workers file exactly once
# and in the global server
JkWorkersFile /etc/libapache2-mod-jk/workers.properties
# JK error log
# You can (and should) use rotatelogs here
JkLogFile /var/log/apache2/mod_jk.log
# JK log level (trace,debug,info,warn,error)
JkLogLevel info
JkShmFile /var/log/apache2/jk-runtime-status
JkWatchdogInterval 60
JkMount /* loadbalancer
JkMount /jk-status jkstatus
# Configure access to jk-status and jk-manager
# If you want to make this available in a virtual host,
# either move this block into the virtual host
# or copy it logically there by including "JkMountCopy On"
# in the virtual host.
# Add an appropriate authentication method here!
<Location /jk-status>
# Inside Location we can omit the URL in JkMount
JkMount jk-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
<Location /jk-manager>
# Inside Location we can omit the URL in JkMount
JkMount jk-manager
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
</IfModule>
如果实在虚拟机下,还需要在下面/etc/apache2/sites-available/000-default.conf文件加入:
JkMount /* loadbalancer
JkMount /jk-status jkstatus
使用下列内容,创建或编辑etc/libapache2-mod-jk/workers.properties:
worker.list=loadbalancer,jkstatus # 为192.168.1.100配置Tomcat实例
worker.tomcat1.type=ajp13
worker.tomcat1.host=192.168.1.100
worker.tomcat1.port=8081
# worker“tomcat1”
worker.tomcat1.connection_pool_size=200
worker.tomcat1.connection_pool_timeout=600
# worker“tomcat1”将要求操作系统发送关于连接的KEEP-ALIVE信号。
worker.tomcat1.socket_keepalive=1
# 为192.168.1.200配置Tomcat实例
worker.tomcat2.type=ajp13
worker.tomcat2.host=192.168.1.200
worker.tomcat2.port=8082
worker.tomcat2.connection_pool_size=200
worker.tomcat2.connection_pool_timeout=600
# worker“tomcat2”将要求操作系统发送关于连接的KEEP-ALIVE信号。
worker.tomcat2.socket_keepalive=1
worker.jkstatus.type=status
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2
2.5 tomcat 服务器配置
2.5.1 tomcat组播方式设置session store
Sudo vim /opt/apache-tomcat-7.0.30/conf/server.xml
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="you ip address"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener">
</Cluster>
tomcat集群和负载均衡的实现(session同步)
因 为tomcat的session同步功能需要用到组播,windows默认情况下是开通组播服务的,但是linux默认情况下并没有开通。
可以通过指令打 开
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
如果需要服务器启动时即开通组播需在/etc/sysconfig/static-routes文件内加入
eht0 net 224.0.0.0 netmask 240.0.0.0
2.5.2 redis共享方式设置session store
redis已经有组件支持直接在tomcat7中设置下将redis作为tomcat默认的session存储器,下面介绍下配置过程
1.从http://redis.io/下载redis,按照redis服务端
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
2.启动redis
cd RedisDirectory/src
./redis-server --port 6379
3.从http://tomcat.apache.org/download-70.cgi下载tomcat7,按照tomcat7
4.从https://github.com/xetorthio/jedis/downloads下载jedis作为java的redis客户端,从https://github.com/jcoleman/tomcat-redis-session-manager/downloads下载tomcat的redis session manager插件,从http://commons.apache.org/proper/commons-pool/download_pool.cgi下载apache的common pool包,将这几个jar包拷贝到tomcat7的lib目录下
5.修改tomcat的conf下的context.xml文件,添加或者修改下面的配置
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost" <!-- optional: defaults to "localhost" -->
port="6379" <!-- optional: defaults to "6379" -->
database="0" <!-- optional: defaults to "0" -->
maxInactiveInterval="60" <!-- optional: defaults to "60" (in seconds) --> />
6.重启tomcat后就可以看到session存储到redis上了。