实现Tomcat 8 Clustering/Session Replication环境

目录

1、环境概述

2、时间同步

3、实现过程

4、测试

5、讨论及总结

1、环境概述

测试环境拓扑如下:

clients

|

httpd

/       \

tomcat1     tomcat2

tomcat、httpd的安装已不再重复,但版本在这里说明:

httpd服务器(以负载均衡方式工作)

[[email protected] conf.d]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
[[email protected] conf.d]# uname -r
2.6.32-358.el6.x86_64
[[email protected] conf.d]# ifconfig | grep Bcast:
          inet addr:192.168.0.200  Bcast:192.168.0.255  Mask:255.255.255.0
[[email protected] conf.d]# rpm -q httpd
httpd-2.2.15-39.el6.centos.x86_64

后端tomcat服务器环境,操作系统版本与httpd服务器相同

[[email protected] ~]# catalina.sh version
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.21
Server built:   Mar 23 2015 14:11:21 UTC
Server number:  8.0.21.0
OS Name:        Linux
OS Version:     2.6.32-358.el6.x86_64
Architecture:   amd64
JVM Version:    1.8.0_45-b14
JVM Vendor:     Oracle Corporation

2、时间同步

请参照此博文的相关部份配置http://zhaochj.blog.51cto.com/368705/1635982

3、实现过程

在之前的博文中已实现了apache以mod_jk和mod_proxy两种类型实现对后端tomcat进行负载均衡的部署,但都有一个缺陷,在不启用sticky session时,客户端访问前端apache后被调度到后端的tomcat节点,当访问节点发生改变时此负载均衡系统不能保证用户session信息不变;如果启用sticky session,在一定程度上解决了用户session信息的丢失问题,但是当用户所访问的节点宕机时,用户的session信息依然会丢失,那是否有方法解决这个问题?

当然,常用有两种方案,方案一:采用节点间session复制技术,当用户被调度到一tomcat节点时,用户的session信息会被同步到其他节点,一般采用组播的方式传递session信息,只要在同一个组播里的成员都会有一份session复制器,这样不管是哪个tomcat节点宕机,其他节点上也有一份接近(如果session信息变化又没来得及同步就宕机,那其他节点的session就不完整)完整的session信息,对用户来说是透明的;方案二就是单独部署session服务器,利用google的MSM(Memcached Session Manager)项目来实现,这个此博文不讨论,将在后边博文中来呈现。

前提:此次环境是在上次博文“apache以mod_proxy实现负载均衡集群”的基础上来实现集群的session复制机制。

因tomcat的版本不同,在实现集群session复制时有些细微的区别,所以根据官方文档来配置,我的环境是tomcat是8.0.21的版本,官方文档这里http://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html#Bind_session_after_crash_to_failover_node

配置tomcat,实现集群的session复制:

[[email protected] ~]# vim /usr/local/tomcat/conf/server.xml
#以下代码加入到Engine容器中
<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 className="org.apache.catalina.tribes.membership.McastService"
                                address="228.0.0.4"
                                port="45564"
                                frequency="500"
                                dropTime="3000"/>
                        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                                address="192.168.0.201"
                                port="4000"
                                autoBind="100"
                                selectorTimeout="5000"
                                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"/>
                </Channel>
                <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                        filter=""/>
                <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.ClusterSessionListener"/>
        </Cluster>

注:以上内容定义在Engine容器中,则表示对所有主机均启动用集群功能。如果定义在某Host容器中,则表示仅对此主机启用集群功能。此外,需要注意的是,Receiver中的address="auto"一项的值最好改为当前主机集群服务所对应的网络接口的IP地址。

接下来更改web应用程序根目录下“WEB-INF”目录下的web.xml文件,必须添加<distributable/>这个元素,如果web应用程序没有这个目录及文件,则可复制默认站点的web.xml文件。

[[email protected] ~]# vim /tomcat/webapps/test/WEB-INF/web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="true">
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
<distributable/>
</web-app>
#在web-app容器中加入<distributable/>元素即可。

到此,tomcat1配置完成,在tomcat2上也作上边的这些修改后重新启动tomcat服务,重启后注意观察服务器的监听端口,会有server.xml配置文件中配置的端口出现,如下:

[[email protected] ~]# netstat -tnlup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1100/sshd          
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1184/master        
tcp        0      0 :::8080                     :::*                        LISTEN      3422/java          
tcp        0      0 :::22                       :::*                        LISTEN      1100/sshd          
tcp        0      0 ::1:25                      :::*                        LISTEN      1184/master        
tcp        0      0 ::ffff:192.168.0.201:4000   :::*                        LISTEN      3422/java          
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      3422/java          
tcp        0      0 :::8009                     :::*                        LISTEN      3422/java          
udp        0      0 192.168.0.201:123           0.0.0.0:*                               1108/ntpd          
udp        0      0 127.0.0.1:123               0.0.0.0:*                               1108/ntpd          
udp        0      0 0.0.0.0:123                 0.0.0.0:*                               1108/ntpd          
udp        0      0 fe80::20c:29ff:fec6:f77a:123 :::*                                    1108/ntpd          
udp        0      0 ::1:123                     :::*                                    1108/ntpd          
udp        0      0 :::123                      :::*                                    1108/ntpd          
udp        0      0 :::45564                    :::*                                    3422/java

4、测试

打开浏览器访问前端的httpd监听的地址,得到的结果如下图:

看两次访问到的页面,第一次访问到了tomcat1节点上的测试页面,第二访问到了tomcat2上的测试页面,但两次访问的session信息是保持不变的。测试说明两个节点间的session已完成了复制。

5、讨论及总结

官方建议此Clustering/Session Replication技术只能用在小规模的集群环境中,有网友做过测试,当后端的tomcat节点数大于5个时,整个集群的性能不会再上升。

这里还有一个问题值得讨论,在生产环境下实现了session在各节点间的复制,在httpd上的配置中是否要启用session粘性或绑定呢,即使不启用绑定session,mod_proxy或mod_jk会根据配置的调度算法来把客户端的请求分发到后端的tomcat节点上,如果启用session的绑定功能,那客户端在一段时间内会被分发到同一个tomcat节点上,如果是以mod_proxy方式实现负载集群时要记得启用故障转移选项(nofailover=Off),不然,客户端之前问题的tomcat节点发生故障,那客户端将无法实现故障转移,不过这好像是默认选项。

在集群session复制的负载均衡环境中是否启用session粘性功能我个人认为需要不断的监控调度节点、后端的tomcat各节点的负载情况来再做调整。

时间: 2024-10-28 03:01:58

实现Tomcat 8 Clustering/Session Replication环境的相关文章

Apache + Tomcat 负载均衡 session复制

转自:http://blog.csdn.net/cssmhyl/article/details/8455400 http://snowolf.iteye.com/blog/743611 Apache 和 Tomcat原本就是一家,更是一家亲! Apache与Tomcat整合,无非是将Apache作为前端依据请求路径.端口.代理分发给多个Tomcat,以到达转发和负载均衡的目的!同一时候.通过Apache和Tomcat相互作用,进行粘性会话,会话拷贝构建集群!这一切的最终结果就是"云服务"

Tomcat集群session复制,httpd/nginx反代Tomcat集群

   一个大型站点都会涉及到动态应用,动态应用都需要做会话保持,常见的会话保持方式就三种,一是session stick,二是session replication,三是session share,对于小型规模的tomcat集群,大多者会采用session replication方式,但阅读官方文档也好,查询大牛博客也罢,发现均有不准确之处,所以亲测成功实现之后得出如下文档,还望高人指点. 实验环境: 操作系统:CentOS 7.2 tomcat版本:tomcat-7.0.54(yum安装方式)

Apache 如何反响代理tomcat并且实现Session保持

简介 LAMT=Linux+Apache+MySQL+Tomcat: Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器: 在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选: 架构需求 Tomcat实现JSP动态请求解析的基本架构 说明:由后端Tomcat负责解析动态jsp请求,但为了提高响应性能,在同一主机内配置Apache做反向代理,转发所有请求至tomcat即可: 完整的LNMT架构设计 说明:本篇博客主要讲解单台Hap

windows下nginx+tomcat+memcache负载均衡tomcat集群session共享搭建

使用nginx 做负载均衡 memcached处理session共享  环境 windows 7  X64  java : jdk-7windows-x64.rar  nginx : http://nginx.org/en/download.html ,这里我们推荐下载稳定版(stable versions),本文采用nginx-1.8.0  tomcat:apache-tomcat-7.0.63 在同一台电脑上配置多个tomcat(本次采用两个tomcat来示范),修改 conf/server

nginx+memcached+tomcat集群 session共享完整版

nginx+memcached+tomcat集群 session共享完整版 集群环境 1.nginx版本 nginx-1.6.2.tar.gz 2.jdk 版本 jdk-7u21-linux-x64.tar.gz 3.tomcat 版本  7.0.29 4.memcached 版本 memcached-1.4.22.tar.gz 5. CentOS 6.5 系统采用一台服务做测试 一.nginx安装 安装依赖包 yum -y install gcc gcc-c++ 1.安装pcre库 tar z

【Tomcat】Tomcat + Memcached 实现session共享

概述 web项目中,Tomcat的访问量总是有限的,这时候就需要用到Tomcat集群,多个Tomcat的时候就要考虑Session共享的问题,这里介绍一种使用Memcached做Session共享的解决方案 环境 操作系统:Linux( centOS 6..5 版) 软件:Tomcat7    Memcached 实现原理 Tomcat + Memcached 实现session共享流程图 配置 安装Tomcat 2个和Memcached 1个,参考[Linux]Tomcat安装及一个服务器配置

tomcat cluster和tomcat+memcached实现Session会话保持

Tomcat Cluster: tomcat基于内存复制的集群,tomcat集群各节点通过建立tcp链接来实现session的复制,tomcat启动时,一个cluster对象(默认配置下是SimpleTcpCluster)会启动membership服务和Replication服务(用于建立tcp链接),membership服务记录了集群当前节点的信息,当一台节点接收http请求并产生一个新session时,调用Replication服务建立tcp连接把Session复制到membership列表

Apache/Nginx+Tomcat+Memcahced实现session管理

一.memcached简介 Memcached是一个免费开源.高性能.分布式的内存对象缓存系统.Memcached是在内存中,为特定数据(字符串或对象)构建key-value的小块数据存储. Memcached项目地址: http://www.memcached.org/ 现在最新版本为1.4.22,时间点:2015.01.26 二.实验环境介绍 第一个实验:我们在node3节点实现一个LNMP架构,测试memcached的基本的使用和web gui界面管理: 第二个实验:我们将node3节点当

NGINX如何反向代理Tomcat并且实现Session保持

简介 LNMT=Linux+Nginx+MySQL+Tomcat: Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器: 在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选: 架构需求 Tomcat实现JSP动态请求解析的基本架构 说明:由后端Tomcat负责解析动态jsp请求,但为了提高响应性能,在同一主机内配置Nginx做反向代理,转发所有请求至tomcat即可: 完整的LNMT架构设计 说明:本篇博客主要讲解单台Hapro