环境:
IP | 角色 | 软件 |
192.168.1.131 | proxy-server | nginx |
192.168.1.124:8080 | Tomcat1 | tomcat |
192.168.1.124:8081 | Tomcat2 | tomcat |
192.168.1.124:8082 | Tomcat3 | tomcat |
192.168.1.124:8083 | Tomcat4 | tomcat |
proxy-server配置代理:
1 [root@gz01-nginx-proxy-master ~]# vim /usr/local/nginx/conf/nginx.conf
2 http {
3 include mime.types;
4 default_type application/octet-stream;
5 upstream tomcatlist {
6
7 server 192.168.1.124:8080 weight=1;
8 server 192.168.1.124:8081 weight=2;
9 server 192.168.1.124:8082 weight=3;
10 server 192.168.1.124:8083 weight=4;
11 }
12 location / {
13
14 proxy_pass http://tomcatlist;
15
16 }
17 location ~* \.(jsp|do)$ {
18 proxy_pass http://tomcatlist;
19 proxy_set_header Host $host;
20 }
21 [root@gz01-nginx-proxy-master ~]# /usr/local/nginx/sbin/nginx -t
22 nginx: the configuration file /usr/local/nginx-1.8.1/conf/nginx.conf syntax is ok
23 nginx: configuration file /usr/local/nginx-1.8.1/conf/nginx.conf test is successful
24 [root@gz01-nginx-proxy-master ~]# /usr/local/nginx/sbin/nginx -s reload
tomcat 集群会话共享的配置:
192.168.1.124:8080
192.168.1.124:8081
192.168.1.124:8082
192.168.1.124:8083
配置一样的信息即可
1 [root@gz01-tomcat-node01 ~]# vim /usr/local/tomcat/conf/server.xml
2 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
3 <Manager className="org.apache.catalina.ha.session.DeltaManager"
4 expireSessionsOnShutdown="false"
5 notifyListenersOnReplication="true"/>
6 <Channel className="org.apache.catalina.tribes.group.GroupChannel">
7 <Membership className="org.apache.catalina.tribes.membership.McastService"
8 address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
9 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
10 address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
11 <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
12 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
13 </Sender>
14 <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
15 <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
16 </Channel>
17 <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>
18 <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
19 <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
20 </Cluster>
保存配置启动tomcat
1 [root@gz01-tomcat-node01 logs]# /usr/local/tomcat/bin/startup.sh
创建测试页面
设置web.xml 的配置文件所有tomcat集群主机上(/usr/local/tomcat/webapps/ROOT/WEB-INF)加入<distributable/> 表示分布式
[root@gz01-tomcat-node01 WEB-INF]# vim web.xml
<distributable/>
</web-app>
所有tomcat集群主机上写个测试配置文件
1 vim /usr/local/tomcat/webapps/ROOT/index.jsp
1 <%@ page language="java" %>
2 <%@ page import="java.util.*" %>
3 <html>
4 <head>
5 <title>>Tomcat 192.168.1.124:8080 </title>
6 </head>
7 <body>
8
9 <h1><font color="blue">Tomcat 192.168.1.124:8080 </h1>
10 <table align="centre" border="1">
11 <tr>
12 <td>Session ID</td>
13 <% session.setAttribute("abc","abc"); %>
14 <td><%= session.getId() %></td>
15 </tr>
16 <tr>
17 <td>Created on</td>
18 <td><%= session.getCreationTime() %></td>
19 </tr>
20 </table>
21 </body>
22 </html>
浏览器测试(轮询,但是session ID是一样的,会话保持成功)
session复制共享:session replication,tomcat自带session共享,主要是指集群环境下,多台应用服务器之间同步session,使session保持一致,对外透明。 如果其中一台服务器发生故障,根据负载均衡的原理,调度器会遍历寻找可用节点,分发请求,由于session已同步,故能保证用户的session信息不会丢失,会话复制,。
此方案的不足之处:
必须在同一种中间件之间完成(如:tomcat-tomcat之间).
session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化较快时, 性能下降更加显著,会消耗系统性能。这种特性使得web应用的水平扩展受到了限制。
Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。
在大并发下表现并不好
1 Cluster配置参数 2 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> 3 <Manager className="org.apache.catalina.ha.session.DeltaManager" 4 expireSessionsOnShutdown="false" 5 notifyListenersOnReplication="true"/> 6 <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 7 <Membership className="org.apache.catalina.tribes.membership.McastService" 8 address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> 9 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 10 address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> 11 <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 12 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 13 </Sender> 14 <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 15 <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> 16 </Channel> 17 <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/> 18 <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> 19 <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 20 </Cluster> 21 22 23 1、Cluster配置: 24 Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. 25 className 表示tomcat集群时,之间相互传递信息使用那个类来实现信息之间的传递. 26 channelSendOptions可以设置为2、4、8、10,每个数字代表一种方式 27 2 = Channel.SEND_OPTIONS_USE_ACK(确认发送) 28 4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步发送) 29 8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(异步发送) 30 在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性,此时channelSendOptions设为10,半同步 31 例: 32 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> 33 34 2、Manager 35 (2-1)Manager介绍 36 Manger对象用于实现HTTP会话管理的功能,Tomcat中有4种Manger的实现: 37 ① StandardManager 38 Tomcat6的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件。 39 ② PersistentManager 40 当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来说比较有用。 41 ③ DeltaManager 42 用于Tomcat集群的会话管理器,它通过将改变了会话数据同步给集群中的其它节点实现会话复制。这种实现会将所有会话的改变同步给集群中的每一个节点,也是在集群环境中用得最多的一种实现方式。 43 ④ BackupManager 44 用于Tomcat集群的会话管理器,与DeltaManager不同的是,某节点会话的改变只会同步给集群中的另一个而非所有节点 45 (2-2)Manager配置 46 className-指定实现org.apache.catalina.ha.ClusterManager接口的类,信息之间的管理 47 expireSessionsOnShutdown-设置为true时,一个节点关闭,将导致集群下的所有Session失效 48 notifyListenersOnReplication-集群下节点间的Session复制、删除操作,是否通知session listeners 49 50 3、Channel 频道的介绍和配置 51 (3-1)介绍 52 Channel是Tomcat节点之间进行通讯的工具。Channel包括4个组件: 53 Membership:集群的可用节点列表 54 Receiver :接收器,负责接收消息 55 Sender :发送器,负责发送消息 56 Interceptor :Cluster的拦截器 57 58 (3-2)Membership 配置 59 ① Membership:维护集群的可用节点列表,它可以检查到新增的节点,也可以检查到没有心跳的节点 60 ② className-指定Membership使用的类 61 ③ address-组播地址 62 ④ port-组播端口 63 ⑤ frequency-发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500 64 ⑥ dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为3000 65 66 注:组播(Multicast):一个发送者和多个接收者之间实现一对多的网络连接。 67 一个发送者同时给多个接收者传输相同的数据,只需复制一份相同的数据包。 68 它提高了数据传送效率,减少了骨干网络出现拥塞的可能性 69 相同组播地址、端口的Tomcat节点,可以组成集群下的子集群 70 例: 71 <Membership className="org.apache.catalina.tribes.membership.McastService" 72 address="228.0.0.4" 73 port="45564" 74 frequency="500" 75 dropTime="3000"/> 76 77 (3-3)Receiver 配置 78 Receiver : 接收器,负责接收消息 79 接收器分为两种:BioReceiver(阻塞式)、NioReceiver(非阻塞式) 80 className-指定Receiver使用的类 81 address-接收消息的地址 82 port-接收消息的端口 83 autoBind-端口的变化区间 84 如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听 85 selectorTimeout-NioReceiver内轮询的超时时间 86 maxThreads-线程池的最大线程数 87 例: 88 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 89 address="auto" 90 port="4000" 91 autoBind="100" 92 selectorTimeout="5000" 93 maxThreads="6"/> 94 95 (3-4)Sender 配置 96 Sender : 发送器,负责发送消息 97 Sender内嵌了Transport组件,Transport真正负责发送消息 98 Transport:定义传输方式 99 Transport分为两种:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式) 100 例: 101 <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 102 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 103 </Sender> 104 105 (3-5)Interceptor 配置 106 Interceptor : Cluster的拦截器 107 ① TcpFailureDetector-网络、系统比较繁忙时,Membership可能无法及时更新可用节点列表,此时TcpFailureDetector可以拦截到某个节点关闭的信息,并尝试通过TCP连接到此节点,以确保此节点真正关闭,从而更新集群可以用节点列表 108 ② MessageDispatch15Interceptor-查看Cluster组件发送消息的方式是否设置为Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster标签下的channelSendOptions为8时)。 设置为Channel.SEND_OPTIONS_ASYNCHRONOUS时,MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender 109 例: 110 <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 111 <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> 112 113 4、ClusterListener 配置 114 ClusterListener : 监听器,监听Cluster组件接收的消息 115 使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager 116 例: 117 <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 118