通过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、集群架构图

wKiom1Pl1ReyCm2xAACFEsiZnSQ006.jpg

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这个节点的网口时,会话有的时候会自动跳到其它节点,有的时候是一直处理刷新中。