tomcat msm

准备工作

准备三台虚拟机, 均为CentOS-7-x86_64最小化安装, iptables与SELinux均处于关闭状态, 配置好yum源(base和epel). 做好快照, 以便每次实验后快速恢复.

HostA
OS: CentOS-7-x86_64
hostname: 80e54d87.twoyang.com
eno16777736: 172.18.71.101/16
gateway: 172.18.0.1

HostB
OS: CentOS-7-x86_64
hostname: b9cf468b.twoyang.com
eno16777736: 172.18.71.102/16
gateway: 172.18.0.1

HostC
OS: CentOS-7-x86_64
hostname: 1f5fafa6.twoyang.com
eno16777736: 172.18.71.103/16
gateway: 172.18.0.1

先不管Memcached和MSM, 按照nginx负载均衡tomcat部署好集群.

集群初始化

建立主机信任, 时间同步, 统一增加yum源. 这一步其实在哪个节点上做都可以, 我这里选择HostA.

# 写了个脚本来做这个事情
[[email protected] ~]# wget https://raw.githubusercontent.com/wqiang0917/LearnInMagedu/master/shell/sshtrust.sh
# 将集群中所有节点IP地址(包括本机)都加入这个主机列表数组
[[email protected] ~]# vim sshtrust.sh
HOSTS=("172.18.71.101" "172.18.71.102" "172.18.71.103")
# 分发密钥, 建立主机信任.
[[email protected] ~]# bash sshtrust.sh --key
# 同步时间
[[email protected] ~]# bash sshtrust.sh "ntpdate 172.18.0.1"
[[email protected] ~]# bash sshtrust.sh "hwclock --systohc"
[[email protected] ~]# bash sshtrust.sh date
Tue Jun  7 21:54:22 CST 2016
Tue Jun  7 21:54:22 CST 2016
Tue Jun  7 21:54:22 CST 2016

HostA

# 安装`OpenJDK`和`Tomcat`
[[email protected] ~]# yum install -y java-1.7.0-openjdk java-1.7.0-openjdk-devel tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps
[[email protected] ~]# echo "export JAVA_HOME=/usr" > /etc/profile.d/java.sh
[[email protected] ~]# exec bash
# 创建sessapp应用, 并提供session测试主页.
[[email protected] ~]# mkdir -p /var/lib/tomcat/webapps/sessapp/{classes,lib,WEB-INF,META-INF}
[[email protected] ~]# cat << EOF > /var/lib/tomcat/webapps/sessapp/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA.magedu.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("magedu.com","magedu.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>
EOF
# 启动服务, 并检查监听端口.
[[email protected] ~]# systemctl start tomcat.service 
[[email protected] ~]# ss -tnl | grep "\(4000\|8009\|8080\)"
LISTEN     0      100         :::8009                    :::*                  
LISTEN     0      100         :::8080                    :::*                  
LISTEN     0      50        ::ffff:172.18.71.101:4000                    :::*

HostB

# 安装`OpenJDK`和`Tomcat`
[[email protected] ~]# yum install -y java-1.7.0-openjdk java-1.7.0-openjdk-devel tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps
[[email protected] ~]# echo "export JAVA_HOME=/usr" > /etc/profile.d/java.sh
[[email protected] ~]# exec bash
[[email protected] ~]# mkdir -p /var/lib/tomcat/webapps/sessapp/{classes,lib,WEB-INF,META-INF}
# 创建sessapp应用, 并提供session测试主页.
[[email protected] ~]# cat << EOF > /var/lib/tomcat/webapps/sessapp/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB.magedu.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("magedu.com","magedu.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>
EOF
# 启动服务, 并检查监听端口.
[[email protected] ~]# systemctl start tomcat.service 
[[email protected] ~]# ss -tnl | grep "\(4000\|8009\|8080\)"
LISTEN     0      100         :::8009                    :::*                  
LISTEN     0      100         :::8080                    :::*                  
LISTEN     0      50        ::ffff:172.18.71.101:4000                    :::*

HostC

# 首先测试使用curl直接访问HostA与HostB的sessapp.
[[email protected] ~]# curl http://172.18.71.101:8080/sessapp/

<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA.magedu.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    
        <td>4D5C16AFE6FDA767E506729B0781A0B7</td>
      </tr>
      <tr>
        <td>Created on</td>
        <td>1465284908776</td>
     </tr>
    </table>
  </body>
</html>
[[email protected] ~]# curl http://172.18.71.102:8080/sessapp/

<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB.magedu.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    
        <td>185E2BDA227CB166CA75B7FDC1A07BE4</td>
      </tr>
      <tr>
        <td>Created on</td>
        <td>1465284924384</td>
     </tr>
    </table>
  </body>
</html>
# 安装nginx作为前端调度器反代.
[[email protected] ~]# yum install -y nginx
[[email protected] ~]# vim /etc/nginx/nginx.conf
    ...
    upstream tcsrvs {
        server 172.18.71.101:8080 weight=1;
        server 172.18.71.102:8080 weight=2;
    }

    server {
        ...
        location / {
            proxy_pass http://tcsrvs;
        }
    }
    ...
# 测试语法
[[email protected] ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 启动服务
[[email protected] ~]# systemctl start nginx.service 
[[email protected] ~]# ss -tnl | grep 80
LISTEN     0      128          *:80                       *:*                  
LISTEN     0      128         :::80                      :::*

使用浏览器访问http://172.18.71.103/sessapp/, 持续刷新页面. 可以看到通过前端调度器nginx在按照权重轮调后端服务器, 并且SessionID一直在变化. 此时使用Memcached和MSM存储会话.
注意: 不要使用curl来测试, curl不是daemon进程, 执行完就退出了, 没有办法保存会话.

Memcached和MSM

在HostA和HostB两个后端tomcat主机上均要执行以下操作, 以HostA为例.

# 安装memcached
[[email protected] ~]# yum install -y memcached
[[email protected] ~]# systemctl start memcached.service
[[email protected] ~]# ss -tnl | grep 11211
LISTEN     0      128          *:11211                    *:*                  
LISTEN     0      128         :::11211                   :::*
# 下载MSM的类库放置在tomcat的公共类库目录中
[[email protected] ~]# ls msm/
javolution-5.4.3.1.jar               memcached-session-manager-tc7-1.8.3.jar  spymemcached-2.11.1.jar
memcached-session-manager-1.8.3.jar  msm-javolution-serializer-1.8.3.jar
[[email protected] ~]# cp msm/*.jar /usr/share/java/tomcat/
# 增加配置
[[email protected] ~]# vim /etc/tomcat/server.xml
...
<Host ...>
    <Context path="/sessapp" docBase="/var/lib/tomcat/webapps/sessapp" reloadable="true">
      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:172.18.71.101:11211,n2:172.18.71.102:11211"
        # 使用non-sticky sessions模式, 请参照参考资料中关于非粘性session的解释.
        sticky="false"
        # session备份使用同步模式
        sessionBackupAsync="false"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
      />
    </Context>
</Host>
...
# 重启服务
[[email protected] ~]# systemctl restart tomcat.service

测试验证

  • 使用浏览器访问http://172.18.71.103/sessapp/, 持续刷新页面.

可以观察到调度器一直在按照权重轮调后端服务器, 但是SessionID一直没有变化. 此时使用的是标识为n2的memcached作为主session server. 说明session可以全局共享.
注意: 不要使用curl来测试, curl不是daemon进程, 执行完就退出了, 没有办法保存会话.

  • 关闭当前作为主session server的HostB上的memcached, 再来刷新页面.
[[email protected] ~]# systemctl stop memcached.service


可以观察到SessionID没有变化, 而session server已经切换到了是标识为n1的memcached. 说明单个session server发生故障, 会话也不会丢失.

时间: 2024-10-11 20:33:59

tomcat msm的相关文章

tomcat session server实现会话绑定

tomcat session server 此前已经进行过Tomcat的其他配置信息,这里不再进行重复的描述,会把重要的地方写上,不会影响实验 要想能够实现追踪有状态的web apps,对应的状态信息,有三种方式 session stickysession replication clustersession server 这里实现session server的实现方式 memcached可以借助于第三方的项目所提供的功能,实现使用memcached保存用户的session信息,项目称为MSM,

tomcat-msm-memcached

环境准备 Tomcat+msm+memcached 俩个节点 1 ,172.16.31.1    tomcat 2 ,172.16.31.31   tomcat +memcached 3, 172.16.31.32  memcached 1 安装tomcat 安装包为apache-tomcat-7.0.55.tar.gz tar xf apache-tomcat-7.0.55.tar.gz  -C /usr/local/ vim /etc/profile.d/tomcat.sh export C

Tomcat集群环境下session共享方案梳理(1)-通过memcached(MSM)方法实现

对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式: 一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据: 另一种就是在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据. Tomcat集群session同步方案有以下几种方式: 1)使用tomcat自带的

Tomcat基于MSM+Memcached实现Session共享

前言 在Tomcat集群中,当一个节点出现故障,其他节点该如何接管故障节点的Session信息呢?本文带来的解决方案是基于MSM+Memcached实现Session共享. 相关介绍 MSM MSM--Memcached Session Manager是一个高可用的Tomcat Session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用Memcached存取Session,以实现高可用. 工作原理 Sticky Session(黏性) 模式

MSM实现tomcat集群中session共享的高可用

目录 1.测试环境概述 2.MSM简介 2.1.MSM的特性 2.2.MSM要解决的问题 2.3.MSM的工作原理 3.环境搭建 3.1.memcached安装 3.2.jkd与tomcat安装配置 3.3.MSM sticky session + kryo模式的配置 3.4.MSM no-sticky session + kryo模式的配置 4.思考与总结 1.测试环境概述 采用两台linux x64主机,主机上分别安装memcached与tomcat,memcached提供key/value

Tomcat实现session保持的三种方式、使用msm方式搭建jsp网站

Tomcat简单的来说类似于php的功能,主要实现java程序的编译,最后呈现给用户的是html格式的代码,使用用户可以在浏览器中访问.Tomcat是Java语言研发的,所以依赖于java的虚拟机(jvm). 一.使用前端调度器实现实现session保持 实现的原理如下图,会话保持使用前端的调度器实现.例如:使用Ngnix调度时,使用ip_hash算法就可以实现. 配置步骤: 1.安装配置 Tomcat 操作系统: CentOS 6,5 目标主机:172.16.10.122  172.10.10

38 tomcat lb cluster、memcached和msm、msm及jvm虚拟机性能监控、tcpdump和nc工具的使用

01 tomcat lb cluster 配置环境 node1 192.168.1.131 CentOS 7.2 node4 192.168.1.132 CentOS 7.2 node3 192.168.1.133 CentOS 7.2 1.如何部署多个tomcat实例向用户提供服务 #node4结点配置tomcat [[email protected] ~]# tar xf apache-tomcat-8.0.38.tar.gz -C /usr/local/ [[email protected

Memcached + MSM 实现Tomcat Session保持

Memcached + MSM 实现Tomcat Session保持 tomcat memcached 大纲 前言 Memcached介绍 MSM介绍 实验拓扑 实验环境 实验步骤 安装配置Tomcat 安装配置Nginx负载均衡 安装配置Memcached + MSM 总结 前言 上篇文章我们实现了session sticky和session cluster实现用户session的保持, 这篇文章主要介绍使用Memcached + MSM来实现用户session的保持 Memcached介绍

tomcat基于session会话保持以及msm会话保持

实验一.基于tomcat集群会话保持 一.实验环境: 一台nginx服务器,两台tomcat集群,出于实验的原因,我就把nginx也放在其中一台的tomcat服务器上.也就是一共两台机器,都是centos7的环境. 二.实验原理: DeltaManager会话管理器是tomcat默认的集群会话管理器,它主要用于集群中各个节点之间会话状态的同步维护.集群增量会话管理器的职责是将某节点的会话该变同步到集群内其他成员节点上,它属于全节点复制模式,所谓全节点复制是指集群中某个节点的状态变化后需要同步到集