在分布式中,为了防止应用在单服务器因受压力过大而崩溃,而利用多个Tomcat集群进行部署,使应用可以无状态的访问到任何一个Tomcat服务器,从而进行合理的负载均衡操作,保证应用的可靠和稳定运行。(本节中暂不考虑Session同步的问题)
主要方式
mod_proxy、mod_proxy_blancer、mod_jk
mod_proxy
mod_proxy是一种分工合作的方式,利用反向代理的技术,将任务跳转给各个服务器,并不能实现负载均衡,仅仅是访问跳转。
主要用途:反向单例 单IP多域名多站点的功能
mod_proxy_blancer
mod_proxy_blancer是mod_proxy的扩展,支持负载平衡。
可以按轮询策略、权重分配策略和请求相应负载均衡策略进行调度
mod_jk
mod_jk是专门针对tomcat的方法,通过AJP协议链接Tomcat
比较
- mod_proxy缺点:当集群中一台服务器停止,apache仍然会转发请求过去,导致502网关错误。(解决办法:启动停止的服务器)
- mod_jk优点:Apache 会自动检测到停止掉的tomcat服务器,然后不再发请求过去。
- mod_jk缺点:当停止的Tomcat服务器被检测到并停止转发请求后,即使重新启动服务器也不会被Apache发现并继续转发请求。
- mod_proxy和mod_jk共同优点:可以只将Apache置于公网,节省公网IP地址资源。可以通过设置来实现Apache专门负责处理静态网页,让Tomcat专门负责处理jsp和servlet等动态请求。
- mod_proxy和mod_jk共同缺点:如果前置Apache代理服务器停止运行,所有集群服务将无法对外提供。
- mod_proxy和mod_jk对静态页面请求的处理,都可以通设置来选取一个尽可能优化的效果。
- mod_proxy_balancer和mod_jk都需要修改tomcat的配置文件配合
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"
综合这三种方式来说,mod_proxy_balancer和mod_jk的负载均衡能力更好,mod_jk的设置能力更强是真对Tomcat而专门的负载均衡方法。
当然Apache自带的是mod_proxy和mod_proxy_balancer模块,该模块主要提供两种集群实现方式:第一种是分工模式,固定为不同服务器分配不同的任务。第二种是可以检测到服务器的状态,如果服务器停止了,就停止发送请求,并转发给其他的服务器。但是第一种比第二种的效率更高。
安装实例 —— mod_jk模式
系统Ubuntu 12.04 程序Apache2和Tomcat7
安装程序
apt-get install apache2 apt-get install libapache2-mod-jk
配置文件
#进入配置文件目录 cd /etc/apache2/mods-available vim jk.conf
在配置文件中,分别添加JkOptions +RejectUnsafeURI
和JkMount /* loadbalancer
#配置work.properties文件 vim /etc/libapache2-mod-jk/workers.properties
修改workers.tomcat_home
和workers.java_home
为自己的tomcat和java路径.
默认路径:java:/usr/lib/jvm/java-1.7.0-openjdk-amd64 tomcat:/usr/share/tomcat7
配置worker.list
#配置 vim /etc/apache2/sites-available/000-default.conf
在<VirtualHost *:80>中添加JkMount /* loadbalancer
修改每个节点/var/lib/tomcat7/conf/server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
添加jvmRoute标签(要和前面对应上)
在<Engine/>标签中添加以下这段代码:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
重启服务 service tomcat7 restart
安装实例——Ubuntu mod_proxy_blancer模式
系统Ubuntu 12.04 程序Apache2和Tomcat7
加载模块
#进入apapche的配置目录 cd /etc/apache2/mods-enabled #采用链接的方式加载必要模块 ln -s ./../mods-available/proxy.load proxy.load ln -s ./../mods-available/proxy_http.load proxy_http.load ln -s ./../mods-available/proxy_balancer.load proxy_banancer.load #需要的支持文件 ln -s ./../mods-available/slotmem_shm.load slotmem_shm.load ln -s ./../mods-available/lbmethod_byrequests.load lbmethod_byrequests.load ln -s ./../mods-available/lbmethod_bybusyness.load lbmethod_bybusyness.load ln -s ./../mods-available/lbmethod_bytraffic.load lbmethod_bytraffic.load ln -s ./../mods-available/lbmethod_heartbeat.load lbmethod_heartbeat.load
执行完上述模块的加载后,可以重启apache,如果发送错误可以查看错误日志
#重启apache2 /etc/init.d/apache2 restart #或 service apache2 restart #错误日志 /var/log/apache2/error.log
配置反向代理(负载均衡)
vi /etc/apache2/sites-available/000-default.conf
如下配置内容:
<VirtualHost *:80> ServerAdmin admin@bit.com ProxyRequests Off Proxypass / balancer://proxy/ ProxyPassReverse / balancer://proxy/ <Proxy balancer://proxy> Order Deny,Allow Allow from all ProxySet lbmethod=bybusyness BalancerMember http://172.29.131.139:8080 loadfactor=1 BalancerMember http://172.29.131.140:8080 loadfactor=1 </Proxy> </VirtualHost>
注意:
- lbmethod=byrequests 按照请求次数均衡(默认)
- lbmethod=bytraffic 按照流量均衡
- lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)
然后重启服务器,就完成了配置工作
/etc/init.d/apache2 restart