Apache+Tomcat实现负载均衡及集群(session同步)--五、session同步(1)使用内存复制
2017-05-25 09:44
916 查看
打开tomcat的配置文件conf/server.xml,在主机Host元素中加入如下配置:
Xml代码
<!-- 集群配置 -->
<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服务,有规律的发送脉冲广播 -->
<Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<!-- receiver组件,用于从其他成员接收复制的数据信息 -->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.137.211" port="4001" autoBind="100" selectorTimeout="5000"
maxThreads="6"/>
<!-- sender组件,用于给组中其他成员发送复制的数据信息 -->
<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>
<!-- 过滤器,过滤了任何对静态页面、图形、js的请求,这些请求不会修改会话 -->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
<!-- 过滤器,同mod_jk一起使用,在故障转移期间保证会话的粘性 -->
<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>
两台tomcat的server.xml都做如上配置
注意事项:
1、无论Apache中是使用mod_jk还是使用mod_proxy,都应该关闭sticky session,如果是mod_proxy,还需要将nofailover属性的值置为Off,以下示例使用mod_proxy配置
2、tomcat的引擎Engine元素的jvmRoute属性去掉,如果加上,属性值会附加在session id的末尾,造成两次请求session id由于属性值不同而不同
3、两台tomcat的server.xml配置文件,Receiver元素的address属性值是不一样的,都是本机的ip
4、确保两台tomcat的4001端口是打开的,tomcat广播通信需要用到该端口,如果防火墙关闭了了该端口的访问,会出现如下问题
skipping state transfer. No members active in cluster group.
WARNING: Error receiving mcast package. Sleeping 500ms
java.net.SocketException: Socket closed
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:145)
at java.net.DatagramSocket.receive(DatagramSocket.java:725)
at org.apache.catalina.tribes.membership.McastServiceImpl.receive(McastServiceImpl.java:314)
at org.apache.catalina.tribes.membership.McastServiceImpl$ReceiverThread.run(McastServiceImpl.java:414)
5、应用程序shade的web.xml中需要加入distributable元素
依次启动tomcat、Apache,分别用Firefox和chrome浏览
目前火狐中的请求被211这台机器处理
刷新下页面
发现请求被243这台tomcat处理了,但是session id并没有改变
关闭211机器上的tomcat,继续刷新页面,重复刷几次,发现请求都是被243处理,session id并没有改变
至此,使用内存同步方式配置session同步已经完成,但是,tomcat默认的session存储策略是存储在文件系统中,对于一些高并发的系统,这往往会限制系统的相应时间。
Xml代码
<!-- 集群配置 -->
<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服务,有规律的发送脉冲广播 -->
<Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<!-- receiver组件,用于从其他成员接收复制的数据信息 -->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.137.211" port="4001" autoBind="100" selectorTimeout="5000"
maxThreads="6"/>
<!-- sender组件,用于给组中其他成员发送复制的数据信息 -->
<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>
<!-- 过滤器,过滤了任何对静态页面、图形、js的请求,这些请求不会修改会话 -->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
<!-- 过滤器,同mod_jk一起使用,在故障转移期间保证会话的粘性 -->
<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>
两台tomcat的server.xml都做如上配置
注意事项:
1、无论Apache中是使用mod_jk还是使用mod_proxy,都应该关闭sticky session,如果是mod_proxy,还需要将nofailover属性的值置为Off,以下示例使用mod_proxy配置
2、tomcat的引擎Engine元素的jvmRoute属性去掉,如果加上,属性值会附加在session id的末尾,造成两次请求session id由于属性值不同而不同
3、两台tomcat的server.xml配置文件,Receiver元素的address属性值是不一样的,都是本机的ip
4、确保两台tomcat的4001端口是打开的,tomcat广播通信需要用到该端口,如果防火墙关闭了了该端口的访问,会出现如下问题
skipping state transfer. No members active in cluster group.
WARNING: Error receiving mcast package. Sleeping 500ms
java.net.SocketException: Socket closed
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:145)
at java.net.DatagramSocket.receive(DatagramSocket.java:725)
at org.apache.catalina.tribes.membership.McastServiceImpl.receive(McastServiceImpl.java:314)
at org.apache.catalina.tribes.membership.McastServiceImpl$ReceiverThread.run(McastServiceImpl.java:414)
5、应用程序shade的web.xml中需要加入distributable元素
依次启动tomcat、Apache,分别用Firefox和chrome浏览
目前火狐中的请求被211这台机器处理
刷新下页面
发现请求被243这台tomcat处理了,但是session id并没有改变
关闭211机器上的tomcat,继续刷新页面,重复刷几次,发现请求都是被243处理,session id并没有改变
至此,使用内存同步方式配置session同步已经完成,但是,tomcat默认的session存储策略是存储在文件系统中,对于一些高并发的系统,这往往会限制系统的相应时间。
相关文章推荐
- Apache+Tomcat实现负载均衡及集群(session同步)--五、session同步(3)使用memcache
- Apache+Tomcat实现负载均衡及集群(session同步)--三、动静分离(2)使用mod_proxy
- Apache+Tomcat实现负载均衡及集群(session同步)--五、session同步(2)使用共享文件
- Apache+Tomcat实现负载均衡及集群(session同步)--四、负载均衡(1)使用mod_jk
- Apache+Tomcat实现负载均衡及集群(session同步)--四、负载均衡(2)使用mod_proxy
- Apache+Tomcat实现负载均衡及集群(session同步)--二、环境准备(1)
- Apache+Tomcat实现负载均衡及集群(session同步)--二、环境准备(3)
- Apache+Tomcat实现负载均衡及集群(session同步)--三、动静分离(1)使用mod_jk
- Apache+Tomcat实现负载均衡及集群(session同步)--一、前言
- Apache + tomcat实现高并发负载均衡方案(三)----实现session复制的集群
- Apache+Tomcat实现负载均衡及集群(session同步)--二、环境准备(2)
- apache + tomcat 集群 负载均衡 session 同步
- 使用apache代理tomcat集群并实现session复制
- 使用Apache + mod_jk + tomcat来实现tomcat集群的负载均衡出现的无法加载mod_jk.conf文件的问题
- Apache+tomcat实现负载均衡集群和session共享、tengine+tomcat实现web动静分离
- Apache + tomcat实现高并发负载均衡方案(二)----stickysession的集群
- Apache + tomcat实现高并发负载均衡方案(四)----实现session共享(memcache)的集群
- 负载均衡时使用Spring Session和SpringData来实现多台tomcat服务器的session同步
- Nginx+Tomcat+Memcached 集群Session共享[memcached服务安装、tomcat使用memcache存储session、nginx安装配置实现tomcat负载均衡]
- apache + tomcat集群负载均衡,Session复制