相关概念
- 集群
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。
一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
负载均衡集群为企业需求提供了更实用的系统。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。
负载通常包括应用程序处理负载和网络流量负载。这样的系统非常适合向使用同一组应用程序的大量用户提供服务。
每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。
- 负载均衡
负载均衡,英文名称为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空间中 | |
| |
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容器中