Tomcat的负载均衡(apache的mod_jk来实现):
1、基于Apache的mod_jk来实现:
apache
/ \
tom1 tom2
在完成两台tomcat1,tomcat2的安装之后,希望可以实现负载均衡,使用mod_jk可以实现节点的故障恢复功能,即一个节点出现问题,mod_jk会其不参与负载,
在节点故障恢复后,mod_jk会让其参与负载,对此节点是否失败,对用户而言是透明的。
实现流程:
a、用户访问数据达到Apache后,如果是静态内容,Apache立即回应;
b、如果Apache发现用户请求的是动态内容如jsp,就将请求丢给其中的一台tomcat来处理。
c、每次用户重复访问时,都被分配到同一台机器上(可以做会话粘滞或是会话复制)
本文环境在之前的基础上新增加一台机器(做负载均衡器),其实负责负载均衡的主要是由一个配置文件完成!那就是workers.propertise。
通过定义worker.list,port,host,type,lbfactor的值来定义每一台tomcat的主机;通过lbfactor来区别每台机器的权重,权重数值越大得到的用户请求数就越多。所以,只要重点关注这个文件的内容就行了。
实施:
a、安装Aapche
# tar -xzf httpd-2.2.22.tar.gz
# chown root.root -R httpd-2.2.22
# cd httpd-2.2.22
# ./configure --prefix=/usr/local/apache
# make && make install
b、编译mod_jk模块
# tar -xzf tomcat-connectors-1.2.32-src.tar.gz
# cd tomcat-connectors-1.2.32-src
# cd native/
# ./configure --with-apxs=/usr/local/apache/bin/apxs
# make && make install
# ll /usr/local/apache/modules/mod_jk.so
-rwxr-xr-x 1 root root 1076923 Feb 20 14:17 /usr/local/apache/modules/mod_jk.so
c、加载mod_jk
# vim /usr/local/apache/conf/httpd.conf
#增加的内容
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /usr/local/apache/conf/workers.properties
JkMountFile /usr/local/apache/conf/uriworkermap.properties
JkLogFile /usr/local/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampformat "[%a %b %d %H:%M:%S %Y]"
#告诉apache,如何处理相关类形的文件(这几行可要可不要,只要urlworkermap.properties里面有定义也是可以的! :)
JkMount /* controller
JkMount /*.jsp controller
JkMount /*.action controller
# cat /usr/local/apache/conf/workers.properties
# cat workers.properties
worker.list=controller
#========tomcat1========
worker.tomcat1.port=8009
worker.tomcat1.host=192.168.10.56
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1
worker.tomcat12.connection_pool_timeout=750
worker.tomcat12.socket_keepalive=0
worker.tomcat12.socket_timeout=3000
worker.tomcat12.connect_timeout=1000
worker.tomcat12.reply_timeout=3300
#========tomcat2========
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.10.57
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
worker.tomcat12.connection_pool_timeout=750
worker.tomcat12.socket_keepalive=0
worker.tomcat12.socket_timeout=3000
worker.tomcat12.connect_timeout=1000
worker.tomcat12.reply_timeout=3300
#=======balance controller====
worker.controller.type=lb
worker.retries=3
worker.controller.balance_workers=tomcat1,tomcat2
worker.controller.sticky_session=1
相关参数说明:
worker.tomcat12.socket_keepalive=0#此属性将告诉操作系统在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置,一般为120秒),这样将防止防火墙切断未激活的网络连接。
worker.tomcat12.socket_timeout=300000#此属性说明连接在未激活的状况下持续多久,web server将主动切断之。
worker.tomcat12.connect_timeout=10000# 此属性说明了web server等待PONG回应的时间(以ms为单位)。
worker.tomcat12.reply_timeout=330000#此属性告诉web server在接到远端的Tomcat已死并实时的切换到集群中的另外一个Tomcat的回应之前等待一段时间。
worker.tomcat12.reply_timeout=0#此属性说明了web server在检测到Tomcat失败后如何进行恢复工作(默认就是0,全部恢复)
worker.loadbalancer.sticky_session=0#表述是否将对SESSION ID的请求路由回到相同的Tomcat worker。(默认是0,session不复制)
# cat uriworkermap.properties
/*=controller
!/*.jpg=controller
!/*.gif=controller
!/*.png=controller
!/*.bmp=controller
!/*.html=controller
!/*.htm=controller
!/*.swf=controller
!/*.css=controller
!/*.js=controller
完成以上所有之后,你会发现两台tomcat确实已经负载了,但是一个新的问题又产生,会话的问题。第一次提交和第二次提交不在同一台服务器,这基本上可以视为数据丢失。
如果仅仅只是浏览,那么问题可能不是很明显,当然如果你登录了,那么系统又会提示让你登录。于是,就有了tomcat的会话复制!
目前关于tomcat的会话复制,有两种常见的方法:利用tomcat自身的简单集群功能,帮助复制会话。
另外一种就是利用memcache这类缓存程序来缓存会话。
前提条件:
1、memcached正常工作了
2、tomcat 正常工作了。
1、安装方法及安装包
javolution-5.4.3.1.jar
memcached-2.4.2.jar
memcached-session-manager-1.3.0.jar
msm-javolution-serializer-cglib-1.3.0.jar
msm-javolution-serializer-jodatime-1.3.0.jar
安装方法: 将这几个包放到/usr/local/tomcat6.0/lib里。
2、编辑tomcat的配置文件。 < 这一点很重要,因为网上大多数文章都是说修改server.xml里配置;我试过但最终发现session的信息没有存入到memcache中,
我意识到 这可能是配置有问题。目前发现编辑context.xml这个文件,是可以立即将session丢入到memcache中的。>
# vim /usr/local/tomcat6.0/conf/context.xml
<Context>
<!-- 在这个字段下添加以下内容,在节点入请填入你的memcached服务器ip及端口号-->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.254.41.197:11211"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false" />
</Context>
3、如何测试?
我目前的测试方法是,通过apache的mod_jk来实现负载均衡(之前的文章里有写),并且启用tomcat之间的会话复制。
这样的结果就是,seesion ID会随着每次用户的提交而变换节点,但ID不变。
例如:
ID CFC1ACAC6B0B8C27BEA76919F3A99BF8-n1.tomcat2
下次提交就会变成: <节点切换了,但是ID不变>
ID CFC1ACAC6B0B8C27BEA76919F3A99BF8-n1.tomcat1
结合memcache的状态: <我之前在会话没有成功的丢到memcached这里时,cmd_set 为0 >
# perl memcached-tool.pl 10.254.41.197:11211 stats
cmd_get 27
cmd_set 15
get_hits 12
# perl memcached-tool.pl 10.254.41.197:11211 stats
cmd_get 31
cmd_set 17
get_hits 14
我想通过以上的判断,配置 是成功的!