通过Apache+mod_JK+Tomcat集群实现负载均衡
1、概念
通过Apache+mod_JK+Tomcat集群搭建起来的环境主要用来实现负载均衡和高可用性。使用apache作为反向代理服务器实现负载均衡,使用mod_jk可以实现节点的故障恢复功能,达到高可用性。使用tomcat集群功能实现sessionID共享复制。用户访问数据在到达apache后,如果是静态内容,直接由apache处理,如果是动态请求,就通过mod_jk调用后端的一台tomcat服务器去处理请求,可以通过黏性Session将用户的每次请求都分配到同一台tomcat服务器上。在mod_jk选择后端tomcat服务器时,根据apache配置文件中的lbfactor,也就是权值大小来选择。权值越大的分配的任务将会越多。
tomcat集群分为横向集群和纵向集群,横向集群是通过在多台物理服务器上运行tomcat形成集群,而纵向集群是在一台物理服务器上运行多个tomcat程序形成集群,纵向集群可以充分利用物理机的硬件资源,节省成本。
2、集群架构图
3、安装配置负载均衡
下载链接
http://httpd.apache.org/download.cgi#apache22
http://tomcat.apache.org/download-70.cgi
http://tomcat.apache.org/download-connectors.cgi#需要和apache对应的版本保持一致
1)、安装apache
# tar -zxvf httpd-2.2.23.tar.gz
# cd httpd-2.2.23
# ./configure --prefix=/usr/local/apache
# make && make install
2)、编译mod_jk模块
# tar -zxvf tomcat-connectors-1.2.40-src.tar.gz
# cd tomcat-connectors-1.2.40-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 952069 Aug 8 13:19 /usr/local/apache/modules/mod_jk.so
3)、加载mod_jk模块
# vim /usr/local/apache/conf/http.conf
# 增加的内容
LoadModule jk_module modules/mod_jk.so#加载mod_jk模块
JkWorkersFile /usr/local/apache/conf/workers.properties #指定workers.properties文件的路径
JkMountFile /usr/local/apache/conf/uriworkermap.properties #指定uriworkermap.properties文件的路径
JkLogFile /usr/local/apache/logs/mod_jk.log #指定mod_jk的日志文件的路径
JkLogLevel info#指定mod_jk的日志级别
JkLogStampformat "[%a %b %d %H:%M:%S %Y]" #记录Tomcat Worker名称、网址和每个请求的时间
4)、配置workers.properties
# vim /usr/local/apache/conf/workers.properties
worker.list=controller
#========tomcat1========
worker.tomcat1.port=8009 #ajp13端口号
worker.tomcat1.host=10.0.2.208 #tomcat的主机地址
worker.tomcat1.type=ajp13 #连接tomcat所用的协议类型
worker.tomcat1.lbfactor = 1 #负载均衡权重值,值越高,分配的连接数越多
worker.tomcat12.connection_pool_timeout=750 #timeout参数必须和tomcat ajp端口timeout设置一致,否则会产生半开或者半闭连接,导致jk连接异常。
worker.tomcat12.socket_keepalive=0 #告诉操作系统在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置,一般为120秒),这样将防止防火墙切断未激活的网络连接。
worker.tomcat12.socket_timeout=3000 #连接在未激活的状况下持续多久,web server将主动切断之。
worker.tomcat12.connect_timeout=1000 #说明了web server等待ping回应的时间(以ms为单位)。
worker.tomcat12.reply_timeout=3300 #告诉web server在接到远端的Tomcat已死并实时的切换到集群中的另外一个Tomcat的回应之前等待一段时间。
#========tomcat2========
worker.tomcat2.port=8009
worker.tomcat2.host=10.0.2.209
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=0 #表述是否将对SESSION ID的请求路由回到相同的Tomcat worker。(默认是0,session不复制)
5)、配置uriworkermap.properties
# vim /usr/local/apache/conf/uriworkermap.properties #告诉apache,出现以下类形的文件交由tomcat处理
/*=controller
!/*.jpg=controller
!/*.gif=controller
!/*.png=controller
!/*.bmp=controller
!/*.html=controller
!/*.htm=controller
!/*.swf=controller
!/*.css=controller
!/*.js=controller
6)、配置tomcat测试页
# vim /usr/local/tomcat/conf/server.xml
在</Host>前添加以下内容
<Context path="" docBase="/usr/local/tomcat/webapps/" debug="0" reloadable="false" />
在/usr/local/tomcat/webapps目录下新建index.jsp,内容如下
<html>
<body bgcolor="green">
Session ID:<%=request.getSession().getId()%>
</body>
</html>
不通的tomcat服务器,需要修改bgcolor="green"中的颜色,如red、yellow等
在完成以上配置后,apache和mod_jk负载均衡已经安装配置完毕,这时候再访问后端的tomcat服务器时,可以发现连接请求会被轮询分配到各台tomcat服务器中,但是并不能保持会话,不断的刷新页面可以发现session ID在不断的变化。
4、配置session同步复制
7)、配置server.xml文件
# vim /usr/local/tomcat/conf/server.xml
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine name="Catalina" defaultHost="localhost">
修改成
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<!--<Engine name="Catalina" defaultHost="localhost">-->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
取消<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>的注释
8)、配置web.xml
# vim /usr/local/tomcat/conf/web.xml
<distributable/>
</web-app>
在</web-app>上添加<distributable/>。使的session可以被tomcat的集群节点进行轮循复制
在完成以上配置后,session复制已经配置完成,这时候再去不断的刷新页面,会发现会话会在tomcat服务器间不停的流转,但是session ID一直没有变。
5、遗留问题
1)、在本例中配置的tomcat集群是最简单的,用户小规模的集群。在session同步共享方面,我们还可以将session放到一个地方同一管理,参与到集群的所有节点将session信息用一套相同的机制保存到一个统一的地方,这样不管请求被分配到哪个节点,这个节点都可以获得其它节点创建的session。
2)、当sticky_session设置成1时,不断的刷新页面,会话将一直保存在同一个节点上。当停止这个节点的tomcat服务时,会话将自动立刻跳到其它存活的tomcat节点上,并没有出现像一些文章写的那样页面不能访问。但是当手动ifdown这个节点的网口时,会话有的时候会自动跳到其它节点,有的时候是一直处理刷新中。