Tomcat集群

高并发问题

网站发展壮大,必然得能承受住庞大的网站访问量;
如果服务器访问量过大,就会出现服应用服务器崩溃的情况,如何解决?

多服务器负载均衡

webSphere或tomcat,都提供了一种通用的解决方式,就是多台服务器来分担访问量。
这样一个服务器上的压力就会减小很多,可以根据需求配置任意多的服务器来支撑应用系统,如果一台服务崩溃了,那么另外的应用服务器依然可以继续支持应用继续服务。
多应用服务器的简单流程图大致如下:
Tomcat集群_第1张图片
为了实现这个原理我们就需要解决两个问题:
1:如何实现多应用服务器间的session共享:(一台服务器崩溃,另外一台服务器可以继续支持)
2:如何分发请求到各个应用服务器实现压力分解:(用apache或nginx做 web服务器)

Session共享

Tomcat的简单集群设置session共享

server.xml,最简单的集群配置只需要将节点中注释掉的下面这句取消注释即可:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 

使用这样方法配置的集群会将Session同步到所在网段上的所有配置了集群属性的实例上。
该广播地址下的所有Tomcat实例都会共享Session,那么假如有几个互不相关的集群,就可能造成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" 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="4001" 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>    

修改web.xml:
只需要在节点中添加这个节点就可以了。加入

<distrubutable/>

nginx + tomcat + redis尝试

利用tomcat和nginx+redis共享session:
windows环境:
nginx: localhost:8888
tomcat1: localhost:8180
tomcat2: localhost:8280
redis: localhost:16379

tomcat配置

因为我是在一台机器上做的,所以2个tomcat需要配置不同端口:
按照百位区分:8180,8280这样:

  • tomcat1:
<Server port="8105" shutdown="SHUTDOWN">
<!-- shutdown 端口 -->
<Connector port="8180" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<!-- http 端口 -->

<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
<!-- AJP端口,虽然我还不知道是用来干啥的 -->
  • tomcat2:
<Server port="8205" shutdown="SHUTDOWN">
<!-- shutdown 端口 -->
<Connector port="8280" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<!-- http 端口 -->

<Connector port="8209" protocol="AJP/1.3" redirectPort="8443" />
<!-- AJP端口,虽然我还不知道是用来干啥的 -->

启动脚本catalina.bat run

nginx配置

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    #这个是负载均衡的所有服务器
    upstream  webservers   {  
        server   localhost:8180;
        server   localhost:8280;
    }  

    server {
        listen       8888;
        server_name  localhost;

        charset utf-8;  
        location / {  
            root   html;  
            index  index.html index.htm;  
            proxy_pass        http://webservers; 
            proxy_set_header  X-Real-IP  $remote_addr;  
            client_max_body_size  100m;  
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

启动脚本:
`start nginx`或`start nginx.exe`

redis配置

其实只有下面两行配置要改,搜索改这两行就行

port 16379
maxheap 1024000000  

注意,最好改端口,因为6379很可能被占用了。
redis server启动:

redis-server.exe XX.conf

redis-cli启动:

redis-cli.exe XX.conf

运行效果

整个程序只有一个jsp页面,主要是查看session是否一致,如果一致,则说明已经共享:
这里写图片描述
这里写图片描述
Tomcat集群_第2张图片
可以看到,不管是直接访问tomcat1,2还是走nginx,session都是相同的,可以看到session已经共享。
同时在redis中可以看到已经存在session(3493E9EF683CF8BB1F1992965625862A):
这里写图片描述

下载资源
测试版Java web小程序
windows版redis
参考链接
Windows下安装并设置Redis
Tomcat集群配置学习篇—–分布式应用

你可能感兴趣的:(tomcat,应用服务器,负载均衡,集群)