阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Tomcat的session集群和session服务器

416次阅读
没有评论

共计 9270 个字符,预计需要花费 24 分钟才能阅读完成。

概述

session 的作用

httpd 是无状态协议,多个 http 请求之间是没有关联的,服务器端也无法识别哪些请求来自同一个客户端。为了解决这一问题,当客户端第一次访问时,服务器端会创建一个 session 来保存这一次的会话信息,然后将 sessionID(session 的唯一标识符)放置在响应报文的首部发送给客户端,客户端再次请求时会携带这个 sessionID(通常在 request 的 cookie 中)表示这属于哪一个会话。

维持 session 的方式

在 Tomcat 实现负载均衡后,客户端的请求会被调度至不同的服务器,session 信息往往保存在其中一台服务器的内存中,若之后的请求被调度至其他的服务器上,则客户端无法访问到之前的 session 信息。解决这一问题的方式有 3 种:

1)session 绑定,在调度时,将同一个客户端的请求始终调度至同一台服务器;

2)session 集群,将多台服务器上的 session 信息实时进行同步;

3)session 服务器,将所有服务器上的 session 信息都存放至 session 服务器。

第一种方式可以在前端的代理服务器上配置相应的参数实现,但是这种方式会影响负载均衡的效果,并且其中的一台服务器故障了,其上的 session 信息也会全部丢失。第二种方式通过同步 session 实现,即每一个会话的 session 信息存在于所有的服务器上,这个不适用于大型的集群环境。第三种方式是将 session 信息集中存放至一台专用的服务器上,例如 memcache 服务器上,服务器在处理请求时会首先将 session 信息从 memcache 同步至本地,然后进行处理。本文介绍第二种和第三种的实现方式。

session 集群的实现

实验环境:2 个 tomcat 节点,利用 httpd 实现负载均衡。

192.168.1.116  #http 服务器

192.168.1.106  #tomcat node1

192.168.1.127  #tomcat node2

1)首先配置 http 服务器实现负载均衡(192.168.1.116 上)。

[root@www ~]# vim /etc/httpd/extra/httpd-vhosts.conf

####### 全局配置端 ################

<proxy balancer://lbcluster>

BalancerMember http://192.168.1.106:8080 loadfactor=1 route=a

BalancerMember http://192.168.1.127:8080 loadfactor=1 route=b

#ProxySet stickysession=JSESSIONID      #不做 session 绑定

ProxySet lbmethod=bytraffic

</proxy>

######## 虚拟主机的配置 ##############

<VirtualHost *:80>

    ServerName www.linuxidc.com

    ProxyVia Off

    ProxyRequests Off

    ProxyPreserveHost On

    ProxyPass / balancer://lbcluster/

    ProxyPassReverse / balancer://lbcluster/

    <Location /status>

      SetHandler balancer-manager

      Proxypass !

      Require all granted

    </Location>

    <Proxy *>

      Require all granted

    </Proxy>

    <Location  / >

      Require all granted

    </Location>

</VirtualHost>

包含对应文件:

[root@www ~]# vim /etc/httpd/httpd.conf

……..

Include /etc/httpd/extra/httpd-vhosts.conf

2)在每个 tomcat 节点上配置 server.xml 文件,在需要实现 session 集群的 host 中添加如下段落,若以下内容定义在 Engine 容器中,则表示所有主机均启用集群功能。

[root@node1 ~]# vim /usr/local/tomcat/conf/server.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 className=”org.apache.catalina.tribes.membership.McastService”

                        address=”228.0.3.4″

                        port=”45564″

                  expireSessionsOnShutdown=”false”

                  notifyListenersOnReplication=”true”/>

          <Channel className=”org.apache.catalina.tribes.group.GroupChannel”>

            <Membership className=”org.apache.catalina.tribes.membership.McastService”

                        address=”228.0.3.4″              #监听的多播地址(最好不要使用默认值)

                        port=”45564″                    #监听的端口

                        frequency=”500″                  #每个多长时间发一次心跳信息(单位毫秒)

                        dropTime=”3000″/>                #超时时长(超过这个时间还没有接受到心跳信息,则从 Membership 中移除该成员)

            <Receiver className=”org.apache.catalina.tribes.transport.nio.NioReceiver”

                      address=”192.168.1.106″            #通过哪个接口接收数据,如果有多个 IP 地址,这里需要指定

                      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.JvmRouteSessionIDBinderListener”/>

          <ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”/>

        </Cluster>

…..

若在虚拟机中配置必须指定 Receiver 段中的 address 为本机上某接口的地址。在 node2 节点上配置时,将该参数改为对应的 IP 地址(192.168.1.127)。

3)为期望实现集群功能的 webapp 的 web.xml 文件添加 <distributable/>

[root@node1 web]# vim WEB-INF/web.xml

…..

<web-app …..

…..

  <distributable/>

</web-app>

4)在 tomcat 的两个节点上添加测试页面

node1 上(192.168.1.106):

[root@node1 ~]# vim /tomcat/webapps/web/index.jsp

<%@ page language=”Java” %>

<html>

  <head><title>Tomcat node1</title></head>

  <body>

    <h1><font color=”blue”>Tomcat node1</font></h1></p>

    <% session.setAttribute(“linuxidc.com”,”xiaoxiao.com”); %>

    <h4>Session_ID:<%= session.getId() %></h4></p>

    <h4>Creat_time:<%= session.getCreationTime() %></h4></p>

  </body>

</html>

node2 上(192.168.1.127):

[root@node2 ~]# vim /tomcat/webapps/web/index.jsp

<%@ page language=”java” %>

<html>

  <head><title>Tomcat node2</title></head>

  <body>

    <h1><font color=”red”>Tomcat node2</font></h1></p>

    <% session.setAttribute(“linuxidc.com”,”xiaoxiao.com”); %>

    <h4>Session_ID:<%= session.getId() %></h4></p>

    <h4>Creat_time:<%= session.getCreationTime() %></h4></p>

  </body>

</html>

最后重启 tomcat 服务,进行测试:

Tomcat 的 session 集群和 session 服务器Tomcat 的 session 集群和 session 服务器

调度至不同的节点上,session 信息没有发上变化,测试完成。

基于 memcached+MSM 实现 session 服务器

实验拓扑

Tomcat 的 session 集群和 session 服务器

实验环境:

192.168.1.116  #http 服务器

192.168.1.106  #tomcat node1

192.168.1.127  #tomcat node2

192.168.1.121,192.168.1.122    #memcached 服务器

工作原理:

用户第一次访问时,服务器端会创建会话信息,保存在进程中,实时同步至 memcache,若下一次调度至其他节点上,该节点首先会检查自己的会话区域,若没有这个用户的会话,就去 memcache 中找这个会话信息,然后将这个会话信息从 memcache 读到自己的 web container 中,若会话更新也会立刻同步至 memcache 中。之后同一个客户端的某一次请求调度至之前访问过的节点,该节点会先去 memcache 中检查本地的会话信息是否和 memcache 上的同步,如果不同步从 memcache 读取新数据覆盖自己的原有数据。

memcached-session-manager 简介

memcached-session-manager(msm)为 Google 提供的一款工具,能够实现将 tomcat 会话信息保存至 memcache 中,并在需要时将对应信息读入 web container。它可以工作在两种模式下:1)会话有粘性,2)会话无粘性,即前端的代理服务器是否启用了 stickysession(同一客户端请求代理至同一服务器)。上述的工作原理是工作在会话无粘性的模式下,若在会话有粘性的场景中,当用户来访问时,就不需要每次去 memcache 中检查会话信息是不是最新的,会话更新后,也不需要将会话信息及时同步至 memcache 中,可以节约一些步骤和带宽。

memcached-session-manager 的下载地址,http://code.google.com/p/memcached-session-manager/,该项目基于 Java 开发,需要使用如下的 jar 文件(version 版本号):

memcached-session-manager-version.jar

memcached-session-manager-tc(6|7|8)-version.jar

spymemcached-version.jar

msm-javolution-serializer-version.jar

javolution-version.jar

其中 msm-javolution-serializer 为一款流式化工具,能够将会话信息转成流式数据存放在 memcache 上,在读取时再将其还原,类似的工具有很多,在实现过程中可以根据需要选择不同的流式化工具,相关的配置也不同,参考官方文档即可。

实现过程

1)在 192.168.1.121,192.168.1.122 上安装 memcached

[root@node1 ~]# tar xf libevent-2.0.21-stable.tar.gz

[root@node1 ~]# cd libevent-2.0.21

[root@node1 ~]# ./configure –prefix=/usr/local/libevent

[root@node1 ~]# make && make install

[root@node1 ~]# echo “/usr/local/libevent/lib” > /etc/ld.so.conf.d/libevent.conf

[root@node1 ~]# ldconfig

#####################################################

[root@node1 ~]#  tar xf memcached-1.4.15.tar.gz

[root@node1 ~]#  cd memcached-1.4.15

[root@node1 ~]#  ./configure –prefix=/usr/local/memcached –with-libevent=/usr/local/libevent

[root@node1 ~]#  make && make install

为 memcached 提供服务脚本,并配置为系统服务(脚本可以 copy 得到)

[root@node1 ~]# chmod +x /etc/init.d/memcached

[root@node1 ~]# chkconfig –add memcached

[root@node1 ~]# service memcached start

2)在 tomcat node1 和 node2 节点上添加虚拟主机(会话无粘性的模式下):

[root@node1 ~]# vim /usr/local/tomcat/conf/server.xml   

……..

<Host name=”www.linuxidc.com”  appBase=”/tomcat/webapps”

            unpackWARs=”true” autoDeploy=”true”>

            <Context path=”/web” docBase=”web” reloadable=”true”>

            <Manager className=”de.javakaffee.web.msm.MemcachedBackupSessionManager”

            memcachedNodes=”n1:192.168.1.121:11211,n2:192.168.1.122:11211″

            sticky=”false”

            sessionBackupAsync=”false”

            lockingMode=”uriPattern:/path1|/path2″

            requestUriIgnorePattern=”.*\.(ico|png|gif|jpg|css|js)$”

            transcoderFactoryClass=”de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory”

            />

            </Context>

      </Host>

会话有粘性的模式下:

[root@node1 ~]# vim /usr/local/tomcat/conf/server.xml   

……..

<Host name=”www.linuxidc.com”  appBase=”/tomcat/webapps”

            unpackWARs=”true” autoDeploy=”true”>

            <Context path=”/web” docBase=”web” reloadable=”true”>

            <Manager className=”de.javakaffee.web.msm.MemcachedBackupSessionManager”

            memcachedNodes=”n1:192.168.1.121:11211,n2:192.168.1.122:11211″

            failoverNodes=”n1″

            requestUriIgnorePattern=”.*\.(ico|png|gif|jpg|css|js)$”

            transcoderFactoryClass=”de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory”

            />

            </Context>

      </Host>

memcachedNodes 指定后端的 memcache 服务器地址和端口,这里使用了两个 memcache 服务器,目的是起到高可用的作用。在保存 session 信息时需要同时写到两个 memcache 服务器上。

3)将需要的 jar 文件(类库)复制到 tomcat 的 lib 目录下:

[root@node1 msm]# ls

javolution-5.5.1.jar                memcached-session-manager-tc7-1.8.2.jar  spymemcached-2.10.2.jar

memcached-session-manager-1.8.2.jar  msm-javolution-serializer-1.8.2.jar

[root@node1 msm]# cp ./* /usr/local/tomcat/lib/

复制到另外一个节点:

[root@node1 msm]# scp ./* 192.168.1.127:/usr/local/tomcat/lib/

然后重启两个节点上的 tomcat 服务:

[root@node1 ~]# service tomcat restart

利用上一个案例配置的负载均衡和添加的测试页面进行测试,测试结果与上述一致。……………..^_^

更多 Tomcat 相关教程见以下内容

CentOS 6.6 下安装配置 Tomcat 环境  http://www.linuxidc.com/Linux/2015-08/122234.htm

RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目  http://www.linuxidc.com/Linux/2015-02/113528.htm 

Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签)  http://www.linuxidc.com/Linux/2015-02/113062.htm 

Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm 

Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm 

CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm 

CentOS 6.5 下安装 Tomcat  http://www.linuxidc.com/Linux/2015-01/111415.htm 

Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-09/122948.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计9270字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7963165
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛 NAS-4:飞牛 NAS 安装 istore 旁路由,家庭网络升级的最佳实践 开始 大家好我是...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...