Tomcat集群

来源:互联网 发布:洛阳智网网络爆客网 编辑:程序博客网 时间:2024/04/29 05:28

高并发问题

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

多服务器负载均衡

webSphere或tomcat,都提供了一种通用的解决方式,就是多台服务器来分担访问量。
这样一个服务器上的压力就会减小很多,可以根据需求配置任意多的服务器来支撑应用系统,如果一台服务崩溃了,那么另外的应用服务器依然可以继续支持应用继续服务。
多应用服务器的简单流程图大致如下:
这里写图片描述
为了实现这个原理我们就需要解决两个问题:
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 16379maxheap 1024000000  

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

redis-server.exe XX.conf

redis-cli启动:

redis-cli.exe XX.conf

运行效果

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

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

1 0
原创粉丝点击