相关概念

  • 集群

集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。

一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。

负载均衡集群为企业需求提供了更实用的系统。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。

负载通常包括应用程序处理负载和网络流量负载。这样的系统非常适合向使用同一组应用程序的大量用户提供服务。

每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。

  • 负载均衡

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行

例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

主要有如下两种方式:

1. 软件

2. 硬件

  • 反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,

并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

需要理解正向代理与反向代理的区别。

Apache做反向代理服务器

  • httpd.conf文件配置

1. 加载相应模块

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so

2. URL映射配置

ProxyPassMatch /*.gif$ !  
ProxyPassMatch /*.jpg$ ! 
ProxyPassMatch /*.png$ ! 
ProxyPassMatch /*.css$ !
ProxyPassMatch /*.js$ !
ProxyPassMatch /*.htm$ ! 
ProxyPassMatch /*.html$ !
ProxyPass /server-status !
ProxyPass /balancer-manager !
ProxyPass /uploads !
  
ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
<Proxy balancer://cluster/>  
	BalancerMember http://10.10.162.101:8081 loadfactor=1
	BalancerMember http://10.10.162.101:8082 loadfactor=1
</Proxy>  
  
<Location /server-status>
	SetHandler server-status  
	Order Deny,Allow  
	Deny from all  
	Allow from all  
</Location>  
  
<Location /balancer-manager> 
	SetHandler balancer-manager  
	Order Deny,Allow  
	Deny from all  
	Allow from all  
</Location>

ProxyPass指令:

说明

将一个远端服务器映射到本地服务器的URL空间中

语法

ProxyPass [path] !|url [key=value key=value

作用域

server config, virtual host, directory

状态

扩展(E)

模块

mod_proxy

该指令允许你将一个远端服务器映射到本地服务器的URL空间中,此时本地服务器并不充当代理角色,而是充当远程服务器的一个镜像。 path是一个本地虚拟路径名, url是一个指向远程服务器的部分URL,并且不允许包含查询字符串。它主要是用作URL前缀匹配,不能有正则表达式,它里面配置的Path实际上是一个虚拟的路径,在反向代理到后端的url后,path是不会带过去的

"!"指令对于您不想对某个子目录进行反向代理时很有用

如上所示:

ProxyPass /uploads !

将会取消对于路径为/uploads的方向代理

注意

顺序很重要,您需要把拒绝指令放置在普通ProxyPass指令之前。

ProxyPassMatch指令:

语法:ProxyPassMatch [regex] !|url

这个实际上是url正则匹配,而不是简单的前缀匹配,匹配上的regex部分是会带到后端的url的,这个是与ProxyPass不同的。

ProxyPassMatch /*.jpg$ !

这个示例表示对以".jpg"结尾的请求,都不会被转发。

Tomcat配置

针对以上Apache的配置,我们同样也需要对tomcat做配置,由于是在一台主机运行两个tomcat服务器,则需要修改相应的端口。

  • 修改Server.xml

1. Server 端口

<Server port="8006" shutdown="lshutDown4hik1">

2. Http端口

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
redirectPort="8443" executor="tomcatThreadPool"  proxyName="10.10.162.101" proxyPort="80"/>

proxyName:如果connector在代理配置中使用,将这个属性设置成调用request.getServerName()时返回的服务器名称

proxyPort:如果Connector在代理配置中使用,这个属性指定了调用request.getServerPort()返回的端口值 3. ajp端口

Apache做负载均衡服务器与tomcat交互支持两种协议http与ajp协议,如果通过ajp协议的话,则需要更改ajp协议端口,避免端口号冲突。

4. session共享

tomcat自身可以完成session共享,但是对于集群数量较大的情况下,这种共享形式是不建议的。而对于小型集群可以作为一种方案,配置比较方便

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
                channelSendOptions="8">  
			 <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="4000"  
						 autoBind="100"  
						 selectorTimeout="5000"  
						 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"/>  
			 </Channel>  
	  
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
					filter=""/>  
    <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>

除此之外,还需要修改项目的web.xml文档,加入如下内容:

<distributable/>

该元素说明应用将会部署在分布式Web容器中