一、集群、负载均衡概念
(1)集群是一组相互独立的、通过高速网络互联的计算机或者分布在统一高性能计算机上的一组独立server节点,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
(2)负载均衡首先是建立在集群基础之上的,首先要建立一个服务群组,然后将用户的访问均匀的分布在不同的群组成员节点上,达到提高并发访问效率,减轻服务器压力的目的。
负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。
二、tomcat负载均衡策略
Apache+tomcat负载均衡有两种方式,一种为mod_jk,另一种为mod_proxy。其中,mod_jk需要使用第三方jk插件完成,配置相对复杂,是传统的配置方式。mod_proxy使用反向代理,直接配置就可以实现,是tomcat官网推荐的新方式。
三、tomcat实现负载均衡(同一台机器,不同的tomcat服务)
(1)安装tomcat
在服务器上,装两个tomcat的server。
(2)修改端口
因为在同一台机器上,所以需要修改两个tomcat服务器中的一个的配置文件server.xml的端口,假设两个server分别为server1,server2,server1的端口保持原来的配置,现在显示要修改的server2的server.xml:
<Server port="9005" shutdown="SHUTDOWN">
将server2原来的关闭监听端口改为9005。
<Connector port="9080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="9443" />
将server2原来的http监听端口改为9080,转向端口改为9443。
<Connector port="9009" protocol="AJP/1.3" redirectPort="9443" />
将server2原来的ajp监听端口改为9009,转向端口改为9443。
以上的工作是构建集群成员,目前构建了2个成员,可以是多个。
(3)配置转发器
tomcat负载均衡的转发器使用Apache HTTPServer,充当请求的接收,转发(dispatcher),处理静态请求的Server。
安装Apache HTTPServer服务,并修改/conf下的httpd.conf服务配置文件,
首先将下列配置项前的#去掉,重启apache httpserver时,导入mod_proxy必须的模块。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
(4)配置均衡成员
在httpd.conf中加入集群成员,
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://samuel.dev:8009 loadfactor=1 route=jvm1
BalancerMember ajp://samuel.dev:9009 loadfactor=1 route=jvm2
</proxy>
参数说明:
ProxyRequests Off 是告诉Apache需要使用反向代理,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口。loadfactor是负载因子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个tomcat都是1,Apache就按1:1的比例转发,如果是2和1就按2:1的比例转发。这样就可以使配置更灵活,例如可以给性能好的服务器增加处理工作的比例,如果采取多台服务器,只需要修改ip地址和端口就可以了。route参数对应后续tomcat配置中的引擎路径(jvmRoute)。
(5)配置Host
在httpd.conf中,找到#Include conf/extra/httpd-vhosts.conf将前面的#去掉,表示导入Host的配置文件,然后修改conf/extra/httpd-vhosts.conf中的httpd-vhosts.conf配置文件,加入一下配置
<VirtualHost *:80>
ServerName samuel.dev
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
</VirtualHost>
表示将80端口的请求转发给负载均衡代理处理器。
(6)配置server1、server2为集群的成员
打开server1、server2的tomcat服务器配置文件server.xml,
server1:
<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">
<!--
<Engine name="Catalina" defaultHost="localhost">
-->
server2:
<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm2">
<!--
<Engine name="Catalina" defaultHost="localhost">
-->
(7)配置集群成员的session复制:
打开server1、server2的tomcat服务器配置文件server.xml,
将<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />注释去掉,同时加入session复制,
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">
<!--
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
-->
<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="auto"
port="5001"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>
<!--
<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"/>
<!--
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
-->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
(8)在每个server的webapps的项目中的web.xml中加入<distributable />
(9)由于负载均衡涉及session同步机制,需要序列化,所以在项目中放入session中的对象必须实现序列化接口。