Tomcat7 session同步集群搭建

Tomcat session同步集群搭建

一、如何保持session会话

为了使web能适应大规模的访问,需要实现应用的集群部署。集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现session的共享机制。

因为我这边提供web服务的是两台Tomcat服务器,也会有session共享的议题存在,经过与开发人员的交谈中了解到,他们应用的session是由JVM产生的,所以为了让一台tomcat服务器出现故障时,另外一台可以继续承接服务,并保持原先会话,即在故障服务器上处于登入状态的用户,不需要再次登入。

二、在集群系统下实现session统一的有如下三种方案:

1、请求精确定位产生session的web服务器:sticky session,即当前用户的请求都集中定位到一台服务器中,这台服务器保存了用户的session登录信息,如果宕机,

则等同于单点部署,会丢失,会话也不会复制。

#注:上述情况适用于在web端做好session共享,负载均衡层做好sticky session,则就可以实现精准定位又实现解除故障的情况。

2、session复制共享:session replication,如tomcat自带session共享,主要是指集群环境下,多台应用服务器之间同步session,使session保持一致,对外透明。

如果其中一台服务器发生故障,根据负载均衡的原理,调度器会遍历寻找可用节点,分发请求,由于session已同步,故能保证用户的session信息不会丢失,实现会话复制。

但必须在同一种中间件之间完成(如:tomcat-tomcat之间).

session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化较快时, 性能下降更加显著,会消耗系统性能。这种特性使得web应用的水平扩展受到了限制。

Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈,在大并发下表现也并不好。

#注:上述2适用于并发量小的集群需求

3.基于 memcache/redis缓存的 session 共享

即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cache DB中查找,如果找到则复制到本机,这样实现session共享和高可用。

二、本文主要讲第二种集群方式,配置基于tomcat7环境,通过tomcat集群自带的session复制,session信息将会被自动复制到各个节点。

涉及环境:

主机                操作系统        IP地址           主要软件

Nginx       centos7.2         172.16.22.2       nginx-1.10.1

tomcat01        centos7.2         172.16.22.3        jdk-8u102-linux-x64.tar.gz、apache-tomcat-7.0.72.tar.gz

tomcat02        centos7.2         172.16.22.4        jdk-8u102-linux-x64.tar.gz、apache-tomcat-7.0.72.tar.gz

三、安装软件工作

1.安装Nginx

a.首先安裝nginx前需要安裝一些依賴庫 openssl-devel 、zlib-devel 、pcre-devel

[[email protected]~]# yum install -y openssl-devel 、zlib-devel 、pcre-devel

因为程序默认是使用 nobody 身份运行的,我们为了便于查看可以创建nginx 用户来运行,首先添加nginx组和用户,可不创建家目录,并且不允许登陆系统

[[email protected]~]# groupadd  nginx

[[email protected]~]# useradd  -M  -s /sbin/nologin  -g  nginx  nginx

b.解压nginx-1.10.1.tar.gz,并编译

[[email protected]~]# tar xf nginx-1.10.1.tar.gz

[[email protected]~]# cd nginx-1.10.1

#  ./configure \

--prefix=/data0/nginx   \

--pid-path=/data0/nginx/logs/nginx.pid  \

--lock-path=/var/lock/nginx.lock \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_flv_module \

--with-http_stub_status_module \

--with-http_gzip_static_module \

--http-client-body-temp-path=/var/tmp/nginx/client/ \

--http-proxy-temp-path=/var/tmp/nginx/proxy/ \

--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \

--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

--http-scgi-temp-path=/var/tmp/nginx/scgi \

--with-pcre

结果如下:

Configuration summary

+ using system PCRE library

+ using system OpenSSL library

+ md5: using OpenSSL library

+ sha1: using OpenSSL library

+ using system zlib library

nginx path prefix: "/data0/nginx"

nginx binary file: "/data0/nginx/sbin/nginx"

nginx modules path: "/data0/nginx/modules"

nginx configuration prefix: "/data0/nginx/conf"

nginx configuration file: "/data0/nginx/conf/nginx.conf"

nginx pid file: "/data0/nginx/nginx.pid"

nginx error log file: "/data0/nginx/logs/error.log"

nginx http access log file: "/data0/nginx/logs/access.log"

nginx http client request body temporary files: "/var/tmp/nginx/client/"

nginx http proxy temporary files: "/var/tmp/nginx/proxy/"

nginx http fastcgi temporary files: "/var/tmp/nginx/fcgi/"

nginx http uwsgi temporary files: "/var/tmp/nginx/uwsgi"

nginx http scgi temporary files: "/var/tmp/nginx/scgi"

c.上述配置完,就進行編譯安裝

[[email protected]~]# make && make install

[[email protected]~]# mkdir /var/tmp/nginx/client/ -pv

等编译安装完成后在 /data0 下就会出现 nginx 这个目录了,进入这个目录后发现目录非常简单。

它的配置文件存放在 conf 目录中,网页文件存放在 html 中,日志文件存放在 logs 中,

sbin 目录下只有一个可执行程序 "nginx"

d.进入/data0/nginx/conf,配置nginx.conf

配置nginx.conf文件

[[email protected] ] vim nginx.conf

user  nginx;

#user root;

worker_processes  auto;

error_log /data0/nginx/logs/error.log crit;

pid  /data0/nginx/logs/nginx.pid;

worker_rlimit_nofile 100000;

events {

worker_connections  2048;

multi_accept on;

use epoll;

}

http {

include /data0/nginx/conf/mime.types;

default_type  application/octet-stream;

server_tokens off;

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout  10;

client_header_timeout 10;

client_body_timeout 10;

reset_timedout_connection on;

send_timeout 10;

limit_conn_zone $binary_remote_addr zone=addr:5m;

limit_conn addr 100;

gzip_disable "msie6";

gzip_proxied any;

gzip_min_length 1000;

gzip_comp_level 6;

gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

open_file_cache max=100000 inactive=20s;

open_file_cache_valid 30s;

open_file_cache_min_uses 2;

open_file_cache_errors on;

#load balance

upstream tomcat {

server 172.16.22.3:8080;

server 172.16.22.4:8080;

}

#load balance

server {

listen       80;

server_name  localhost;

charset utf-8;

location  ~ /uploads/.*\.(gif|jpg|jpeg|png|pdf|doc|xls|docx|xlsx|apk|htm|html|mp4|flv)$ {

expires 24h;

root /data0/nginx/res/home/;

access_log off;

proxy_store on;

proxy_store_access user:rw group:rw all:rw;

proxy_temp_path         /data0/nginx/res/home/;

proxy_redirect          off;

proxy_set_header        Host $host;

proxy_set_header        X-Real-IP $remote_addr;

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size    20m;

client_body_buffer_size 1280k;

proxy_connect_timeout   900;

proxy_send_timeout      900;

proxy_read_timeout      900;

proxy_buffer_size       40k;

proxy_buffers           40 320k;

proxy_busy_buffers_size 640k;

proxy_temp_file_write_size 640k;

if ( !-e $request_filename)

{

proxy_pass  http://127.0.0.1:80;

}

}

location / {

client_max_body_size    20m;

proxy_pass http://localhost:8080/;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#       allow 113.28.26.107

#       deny all;

}

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   html;

}

e.检测配置文档是否准确无误

[[email protected]~] # /data0/nginx/sbin/nginx -t

nginx: the configuration file /data0/work/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /data0/work/nginx/conf/nginx.conf test is successful

#注:如果有问题,通过提示内容进行解决即可

f.启动nginx服务

[[email protected]~] # /data0/nginx/sbin/nginx

g.但是記得關閉防火牆或将端口加入防火墙规则

因为在CentOS 7 以後不再用iptables作為防火牆,直接使用firewall

[[email protected]~]# systemctl stop firewalld.service && systemctl disable firewalld.service

或者

[[email protected]~]# firewall-cmd --permanet --add-port=80/tcp

[[email protected]~]# firewall-cmd --reload

h.打开浏览器访问http://172.16.22.2或者在本机使用[[email protected]~] curl http://localhost:80访问,如果能打开nginx默认网页出现Welcome to nginx字样,则nginx安装成功

2.安裝配置java 與tomcat

a.在安裝tomcat前需要安裝Java

解壓並且進入安裝包

[[email protected]~]# tar -zxvf jdk-8u101-linux-x64.tar.gz

[[email protected]~]# mkdir /usr/local/java

[[email protected]~]mv jdk1.8.0_101/ /usr/local/java/

b.配置環境變量

[[email protected]~]# vim /etc/profile

在最后一行添加上下列信息

# java

export JAVA_HOME=/usr/local/java/jdk1.8.0_101

export JRE_HOME=/usr/local/java/jdk1.8.0_101/jre

export CLASSPATH=.:$JRE_HOME/lib/dt.jar:$JRE_HOME/lib/tools.jar

export PATH=$JRE_HOME/bin:$JRE_HOME/bin:$PATH

c.讓配置生效查看版本

[[email protected]~]# source /etc/profile

[[email protected]~]# java -version

java version "1.8.0_101"

Java(TM) SE Runtime Environment (build 1.8.0_101-b13)

Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

d.首先tomcat是一個免安裝軟件直接進行解壓即可,查看tomcat版本及JVM配置環境信息

[[email protected]~]# tar -xf apache-tomcat-7.0.72.tar.gz

[[email protected]~]# sh /data0/tomcat01/bin/version.sh

Using CATALINA_BASE:   /data0/tomcat01

Using CATALINA_HOME:   /data0/tomcat01

Using CATALINA_TMPDIR: /data0/tomcat01/temp

Using JRE_HOME:        /usr/local/java/jdk1.8.0_101/jre

Using CLASSPATH:       /data0/tomcat01/bin/bootstrap.jar:/data0/tomcat01/bin/tomcat-juli.jar

Server version: Apache Tomcat/7.0.72

Server built:   Sep 14 2016 12:12:26 UTC

Server number:  7.0.72.0

OS Name:        Linux

OS Version:     3.10.0-327.el7.x86_64

Architecture:   amd64

JVM Version:    1.8.0_101-b13

JVM Vendor:     Oracle Corporation

e.启动tomcat服務

[[email protected]~]# sh /data0/tomcat01/bin/startup.sh

f.查看是否開放了tomcat端口 8080 8009 8005,服务是否正常

[[email protected]~]# netstat -nltp

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:8009            0.0.0.0:*               LISTEN      9844/java

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      9844/java

tcp        0      0 0.0.0.0:80                0.0.0.0:*               LISTEN      32434/nginx: master

tcp        0      0 127.0.0.1:8005         0.0.0.0:*               LISTEN      9844/java

3.呈现访问测试session页面的准备工作

在上述步骤完毕后,便修改tomcat配置文件

a.注:设置默认主机,并增加jvmRoute

[[email protected]~]# vim /data0/tomcat01/conf/server.xml

找到第102行

102  <!-- You should set jvmRoute to support load-balancing via AJP ie :

103     <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

104     -->

在下面添加下列内容,该jvmRoute改为Tomcat01

如: <Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat01">

目的是为了在使用负载均衡层访问页面时,了解承接服务的是哪一台tomcat服务器

#注:tomcat02也是这么做,只是jvmRoute不同,只要把Tomcat01更换成Tomcat02即可

b.在发布文档目录内添加测试文件

[[email protected]~]# vim /data0/tomcat01/webapps/ROOT/jsp/index.jsp

<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head>

<title>tomcat01</title>

</head>

<body>

<h1><font color="red">Session serviced by tomcat </font></h1>

<table aligh="center" border="1">

<tr>

<td>Session ID </td>

<td><%=session.getId() %></td>

<% session.setAttribute("abc","adc");%>

</tr>

<tr>

<td>Created on</td>

<td><%=session.getCreationTime() %></td>

</tr>

</table>

</body>

<html>

#注:另外Tomcat02节点与tomcat01节点配置基本类似,另外为了区分由哪个节点提供访问,测试页标题也不同。其他的配置都相同

c.重启tomcat服务,分别进行测试访问index.jsp

访问Tomcat01测试页面

访问Tomcat02测试页面

可以看到访问结果中页面呈现的session ID 不同,到这,可以说准备工作就基本完成,下面我们来配置tomcat的负载均衡,通过session复制实现会话保持。

4.配置tomcat集群环境:

配置会话共享集群,分别在tomcat01和tomcat02完成下面的操作

a.配置server.xml文件

[[email protected]~]# vim /data0/tomcat01/conf/server.xml

找到110行左右

110   <!--

111       <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

112       -->

在下面添加下列内容:

<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="auto"

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=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>

<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>

#上述添加集群的内容来自于官网配置文档,请参考:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

b.配置应用代码目录下的web.xml文件

修改应用的web.xml文件,加入标签<distributable/>,这是tomcat集群实现session复制的的关键,如果没有添加,Tomcat集群可以说就无法实现。设置很简单如下所示:

[[email protected]~]# vim /data0/tomcat01/webapps/ROOT/WEB-INF/web.xml

<welcome-file>index.shtml</welcome-file>

<welcome-file>index.jspx</welcome-file>

</welcome-file-list>

<distributable/>  --添加的

</web-app>

#注:直接加在</web-app>之前就可以了。

c.两台Tomcat均按上述步骤修改了配置文档后,我们重启下两台Tomcat服务器,并通过浏览器访问jsp测试页面

我们重启下两台Tomcat服务器Tomcat服务

tomcat02重启Tomcat服务

[[email protected]~]#sh /data0/tomcat02/bin/shutdown.sh

[[email protected]~]#sh /data0/tomcat02/bin/startup.sh

再对tomcat01重启Tomcat服务

[[email protected]~]#sh /data0/tomcat01/bin/shutdown.sh

[[email protected]~]#sh /data0/tomcat01/bin/startup.sh

查看先启动那台机器上的catalina.out日志

[[email protected] ~]# tail -f /data0/work/tomcat02/logs/catalina.out

May 11, 2017 11:46:29 AM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded

INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{172, 16, 22, 3}:4000,{172, 16, 22, 3},4000, alive=1011, securePort=-1, UDP Port=-1, id={-66 109 3 57 13 98 70 60 -86 23 -103 16 91 -52 -91 -49 }, payload={}, command={}, domain={}, ]

从上面的SimpleTcpCluster memberAdded来看tomcat01和tomcat02成了集群成员了。

然后访问负载均衡层的测试页面

刷新,再看测试页面

大家可以从图中看到,不管你怎么刷新SessionID都不会变,只有承载的服务器在变化而已,从而说明我们的Tomcat的DeltaManager集群配置完成,实现了会话共享。

时间: 2024-08-25 16:26:42

Tomcat7 session同步集群搭建的相关文章

Tomcat:基于Apache+Tomcat的集群搭建

根据Tomcat的官方文档说明可以知道,使用Tomcat配置集群需要与其它Web Server配合使用才可以完成,典型的有Apache和IIS. 这里就使用Apache+Tomcat方式来完成基于Tomcat在集群配置. 软件准备 1)Apache HTTP Server: 使用百度搜索httpd-2.2.25-win32-x86-no_ssl.msi,应该可以找到很多相关的下载链接.这里也提供一个:http://vdisk.weibo.com/s/C3trk_uGGkrmc 2)Tomcat

solr+zookeeper集群搭建

一.前期准备工作 相关工具: 1.虚拟机(VMware) 2.tomcat7 64位  下载地址:http://tomcat.apache.org/download-70.cgi 3.centos6.4  64位 4.linux下的64位jdk安装包,版本为6或以上 5. solr-4.3.1.tgz包  下载:http://archive.apache.org/dist/lucene/solr/ 6. zookeeper-3.4.5.tar.gz包  下载:http://hadoop.apac

大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单机的搭建,是因为作为个人学习的话,单机已足以,好吧,说实话是自己的电脑不行,使用虚拟机实在太卡了... 整个的集群搭建是在公司的测试服务搭建的,在搭建的时候遇到各种各样的坑,当然也收获颇多.在成功搭建大数据集群之后,零零散散的做了写笔记,然后重新将这些笔记整理了下来.于是就有了本篇博文. 其实我在搭

JAVAEE——宜立方商城08:Zookeeper+SolrCloud集群搭建、搜索功能切换到集群版、Activemq消息队列搭建与使用

1. 学习计划 1.solr集群搭建 2.使用solrj管理solr集群 3.把搜索功能切换到集群版 4.添加商品同步索引库. a) Activemq b) 发送消息 c) 接收消息 2. 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求. So

2. zookeeper介绍及集群搭建

ZooKeeper 概述 Zookeeper 是一个分布式协调服务的开源框架. 主要用来解决分布式集群中 应用系统的一致性问题,例如怎样避免同时操作同一数据造成脏读的问题. ZooKeeper 本质上是一个分布式的小文件存储系统. 提供基于类似于文件系 统的目录树方式的数据存储,并且可以对树中的节点进行有效管理.从而用来维 护和监控你存储的数据的状态变化.通过监控这些数据状态的变化,从而可以达 到基于数据的集群管理. 诸如: 统一命名服务(dubbo).分布式配置管理(solr的配置集中管理).

rabbitmq集群搭建(centos6.5)

一:rabbitmq的安装: 参考:http://www.blogjava.net/hellxoul/archive/2014/06/25/415135.html http://blog.haohtml.com/archives/15249 说明:修改机器名字后再安装(为后面集群做准备) vi /etc/sysconfig/network 修改名字 vi /etc/hosts 修改地址映射表,如192.168.1.112   rabbitmq-node1.com rabbitmq-node1 #

linux 下heartbeat简单高可用集群搭建

Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统.通过Heartbeat我们可以实现双机热备,以实现服务的持续性. linux下基于heartbeat的简单web服务的高可用集群搭建 首先规划好两台主机作为heartbeat的双机热备,命名为node1.lvni.cc(主) ;node2.lvni.cc, node1的eth0IP :192.168.157.148  Vip eth0:0:192.168.157.149 node2的eth0IP :19

mysql5.7 MGR集群搭建

mysql5.7 MGR集群搭建部署 此文章由队员(谆谆)拟写 此文章来自 乌龟运维 官网 wuguiyunwei.com QQ群 602183872 最近看了一下mysql5.7的MGR集群挺不错的,有单主和多主模式,于是乎搭建测试了一下效果还不错,我指的不错是搭建和维护方面都比较简单.网上绝大多数都是单主模式,当然我这里也是,为了加深印象,特意记录一下搭建过程,等以后再去尝试多主模式,相信大家现在数据库的瓶颈基本都是在写,读写分离虽然是一种可行的解决方案,但是如果数据量很大,写一样会有问题,

kafka学习(二)-zookeeper集群搭建

zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是hadoop的一个子项目,其发展历程无需赘述.在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制 不适合在某些应用中使用,因此需要有一种可靠的.可扩展的.分布式的.可配置的协调机制来统一系统的状态.Zookeeper的目的就在于此. 1.角色 Zookeeper中的角色主要有以下三