当前中国的互联网高速发展,对于大型网站来说,每天处理的请求及其数据非常庞大,这对服务器压力比较大,如果中间出现服务器崩溃,无疑是一场灾难。这里就要用到分布式部署。
不管是目前IBM的webSphere还是大众化的tomcat服务器,都为我们提供了一种通用的解决方式,就是多台服务器来分担访问量,这样在一个服务器上的压力就会减小很多,你可以根据自己的需求去配置任意多的服务器来支撑你的应用系统,如果一台服务崩溃了,那么另外的应用服务器依然可以继续支持应用继续服务。多应用服务器的简单流程图大致如下:
![这里写图片描述](https://img-blog.csdn.net/20160513233955155)
为了实现这个原理我们就需要解决两个问题:
1:如何实现多应用服务器间的session共享:(一台服务器崩溃,另外一台服务器可以继续支持)
2:如何分发请求到各个应用服务器实现负载均衡:(这里的解决方案是用apache做 web服务器)
系统环境:
win7(64bit)+jdk1.8;
事前准备:
1、下载Apache应用服务器tomcat7(我的版本是apache-tomcat-7.0.69-windows-x64.zip,是免安装的,解压就可以用,地址http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.69/bin/apache-tomcat-7.0.69-windows-x64.zip);
2、下载web服务器Apache2.4(版本是httpd-2.4.20-x64-vc11-r2,地址:http://www.apachehaus.com/cgi-bin/download.plx?dli=gUuZlTSlXWy8ERj9SVqVleJVlUGRVYSNkYxIkb);
步骤:
一、安装Apache。
1、解压Apache压缩包到指定文件夹,我的路径是E:/ApacheGroup/;
2、打开readme_first.html,这里有install说明,我用是第二种(To Install Apache as a service:);即使用cmd运行指令,先把目前切换到bin这级目录,运行安装服务指令httpd -k install;运行启动指令:httpd -k start;
3、访问localhost;如果能打开页面,说明安装成功;
4、打开conf/httpd.conf文件,加载以下模块。
#---------------------start------------------------
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule rewrite_module modules/mod_rewrite.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
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule speling_module modules/mod_speling.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#----------------------end---------------------
5、如果你想看到小猫页面,
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
在上面的index.html下面添加index.jsp就可以了
6、去掉Include conf/extra/httpd-vhosts.conf的注释标记#
7、在文件末尾加反向代理:
ProxyRequests Off
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
<proxy balancer://cluster/>
BalancerMember ajp://127.0.0.1:8019 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:8029 loadfactor=1 route=jvm2
</proxy>
8、修改conf/extra/httpd-vhosts.conf文件,注释掉所有的dummy-host,添加以下内容
<VirtualHost *:80>
ServerAdmin zengwei.shao@samsung.com
ServerName localhost
ServerAlias localhost
ErrorLog "logs/dummy-host.example.com-error.log"
CustomLog "logs/dummy-host.example.com-access.log" common
</VirtualHost>
9、再次启动Apache,如果启动不成功,说明配置存在错误。
二、安装tomcat7
1、将tomcat7压缩包分别解压到tomcat1和tomcat2文件夹中;并修改tomcat运行窗口的标题,方便运行时容易分清楚。PS:修改tomcat的bin文件下catalina.bat文件,`if "%TITLE%" == "" set TITLE=Tomcat_1`
2、修改tomcat1的server.xml文件,将8005、8080、8009端口改为8015、8081、8019;在<Engine name="Catalina" defaultHost="localhost">在末尾加 jvmRoute="jvm1";
3、修改tomcat2的server.xml文件,将8005、8080、8009端口改为8025、8081、8029;在<Engine name="Catalina" defaultHost="localhost">在末尾加 jvmRoute="jvm2";
4、分别将<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>修改为
<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"
bind="127.0.0.1"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="127.0.0.1"
port="4002"
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;"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
5、配置完成之后,启动两个Tomcat测试一下Tomcat是否可以正常启动;
三、 部署项目
1、新建项目Test,修改web.xml,增加<distributable />;
2、新建jsp,代码如下:
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session 列表</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
名称:<input type=text size=20 name="dataName">
<br>
值:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
3、启动Apache2.4,在页面中输入localhost\test\test.jsp进行测试;注意:Apache有可能启动不起来,那么解决方式是查看Apache安装目录下的logs目录下的error.log文件,根据log文件解决可能存在的问题。直到Apache可以正常启动,至此Apache就可以正常启动了。
PS:同一个ie窗口的请求,也就是和服务器的一次会话(session),sessio没有清掉的时候,是会让同一个tomcat处理的; session失效后,再次建立和服务器的会话,这样就会分配新的tomcat来处理。 tomcat 是全局session复制,集群内每个tomcat的session完全同步(也就是任何时候都完全一样的) 在大规模应用的时候,用户过多,集群内tomcat数量过多,session的全局复制就会有问题, 因此,建议tomcat的数量不要太多,5个以下为好。