11.1、前言:

1、多个tomcat要一起协同工作可以考虑的方案如下:

(1)使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,

在大并发下表现并不好。

(2)利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但如果应用是

某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。

(3)利用redis把多个tomcat的session集中管理,前端再利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时

又能保证较高的性能。

2、分布式Session管理的必要性:

Web应用在单机部署的情况下,Session是被单个应用服务器存储管理的,由于只有一个应用服务器,用户的所有请求都是通过

它进行响应处理的,所以能够很容易实现会话跟踪和保持。随着业务量的增长,系统架构需要做出调整以适应发展的需要,可能

会使用分布式架构或微服务架构,无论使用哪种架构方式,应用系统单机部署的模式已经不能满足需求,所以会将应用系统部署

到多台应用服务器上,用户的请求也会通过负载均衡转发到某个具体应用服务器上执行,可能会出现在A1系统登录后创建并保存

Session,再次发起请求,请求被转发到A2系统上显示未登录的情况,此时单机部署模式下的Session机制已不能满足要求。所以,

在分布式架构或微服务架构下,必须保证一个应用服务器上保存Session后,其它应用服务器可以同步或共享这个Session。

3、分布式Session有如下几种实现方式:

(1)Session复制机制:

在支持Session复制的Web服务器上,通过修改Web服务器的配置,可以实现将Session同步到其它Web服务器上,达到每个Web

服务器上都保存一致的Session。

1)优点:代码上不需要做支持和修改。

2)缺点:需要依赖支持的Web服务器,一旦更换成不支持的Web服务器就不能使用了,在数据量很大的情况下不仅占用网络资源,

而且会导致延迟。

3)适用场景:只适用于Web服务器比较少且Session数据量少的情况。

4)可用方案:开源方案tomcat-redis-session-manager。

(2)Session粘滞机制:

将用户的每次请求都通过某种方法强制分发到某一个Web服务器上,只要这个Web服务器上存储了对应Session数据,就可以实现

会话跟踪。

1)优点:使用简单,没有额外开销。

2)缺点:一旦某个Web服务器重启或宕机,相对应的Session数据将会丢失,而且需要依赖负载均衡机制。

3)适用场景:对稳定性要求不是很高的业务情景。

(3)Session集中管理机制:

在单独的服务器或服务器集群上使用缓存技术,如Redis存储Session数据,集中管理所有的Session,所有的Web服务器都从这个

存储介质中存取对应的Session,实现Session共享。

1)优点:可靠性高,减少Web服务器的资源开销。

2)缺点:实现上有些复杂,配置较多。

3)适用场景:Web服务器较多、要求高可用性的情况。

4)可用方案:开源方案Spring Session,也可以自己实现,主要是重写 HttpServletRequestWrapper中的getSession方法。

(4)基于Cookie管理机制:

这种方式每次发起请求的时候都需要将Session数据放到Cookie中传递给服务端。

1)优点:不需要依赖额外外部存储,不需要额外配置。

2)缺点:不安全,易被盗取或篡改;Cookie数量和长度有限制,需要消耗更多网络带宽。

3)适用场景:数据不重要、不敏感且数据量小的情况。

(5)总结:

以上四种方式,相对来说,Session集中管理更加可靠,使用也是最多的。

4、基本环境:

主机名

IP地址

安装服务

slave-node1

172.16.1.91

nginx1.16.0(负载均衡)、tomcat8.5.37(8080、8081实例)、redis5.0.0(session存储)、jdk1.8.0_212

nginx(负载均衡)、tomcat(8080、8081实例)、redis、jdk 软件的安装这里就不赘述了,本文主要讲

如何通过 redis 实现 tomcat 8080、tomcat 8081 实例的 session 共享。

5、架构图:

11.2、配置:

1、下载实现 tomcat session 共享所需的依赖包:

(1)下载地址:https://github.com/cc-chen/tomcat8.5-redis-session-manager

(2)下载后的安装包如下:

注意:不同的tomcat版本所使用的tomcat-redis-session-manager.jar的版本可能不同,否则会出现错误。

2、将下载的3个jar包分别上传到tomcat多实例的lib目录下:

[root@slave-node1 ~]# cd /application/tomcat-8080/lib/

[root@slave-node1 lib]# rz -y

[root@slave-node1 lib]# cd /application/tomcat-8081/lib/

[root@slave-node1 lib]# rz -y

3、分别在tomcat多实例的context.xml文件中的<Context>标签下添加如下内容:

<Valve className="com.s.tomcat.redissessions.RedisSessionHandlerValve"/>

<Manager className="com.s.tomcat.redissessions.RedisSessionManager"

host="172.16.1.91"

port="6379"

database="0"

password="root"

maxInactiveInterval="60" />

注释:

host:redis的主机IP。

port:redis的端口号。

database:使用redis第几个数据库。

password:redis的连接密码,如果redis没有设置访问密码,需要将改参数注释掉。

maxInactiveInterval:redis超时时间为60秒,60秒后就会变化session值。

[root@slave-node1 lib]# cd /application/

[root@slave-node1 application]# vim tomcat-8080/conf/context.xml

[root@slave-node1 application]# vim tomcat-8081/conf/context.xml

4、创建测试页面:

[root@slave-node1 application]# vim /data/www/tomcat/ROOT/test.jsp

Server Info:

SessionID:<%=session.getId()%>

<br>

SessionIP:<%=request.getServerName()%>

<br>

SessionPort:<%=request.getServerPort()%>

<br>

<%

out.println("lc");

//标记后端节点

%>

[root@slave-node1 application]# chown -R tomcat.tomcat /data/www/tomcat/

# 为测试页面赋权

11.3、启动相关服务:

1、启动redis服务:

[root@slave-node1 application]# redis-server /data/6379/redis.conf

2、启动tomcat多实例:

[root@slave-node1 application]# for n in {0..1};do su - tomcat /application/tomcat-808$n/bin/startup.sh;sleep 10s;done

3、启动nginx服务:

[root@slave-node1 application]# /application/nginx/sbin/nginx

4、查看启动服务的端口号:

[root@slave-node1 application]# netstat -tunllp | grep -E "6379|8080|8081|80"

11.4、测试:

1、在浏览器中使用nginx负载均衡访问test.jsp测试文件:

#无论怎么刷新,SessionID值都不会变。

2、在浏览器中使用8080端口访问test.jsp测试文件:

3、在浏览器中使用8081端口访问test.jsp测试文件:

4、在redis服务器上查看存储的SessionID:

[root@slave-node1 application]# redis-cli -h 172.16.1.91 -p 6379

#存储的SessionID和上面个验证的结果一致。

5、综上测试,说明 nginx+tomcat+redis_session 共享搭建成功。

11.5、补充-tomcat7操作:

1、以上实验用的是tomcat8.5,如果是tomcat7的话需要更换tomcat8.5-redis-session-manager.jar

为tomcat-redis-session-manager-1.2-tomcat-7.jar,下载地址为如下:

https://github.com/downloads/jcoleman/tomcat-redis-session-manager/tomcat-redis-session-manager-1.2-tomcat-7.jar

https://github.com/jcoleman/tomcat-redis-session-manager/downloads?spm=a2c4e.10696291.0.0.28dc19a4cr7dVp

2、分别在tomcat多实例的context.xml文件中的<Context>标签下添加如下内容:

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />

<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"

host="172.16.1.91"

port="6379"

database="0"

password="root"

maxInactiveInterval="60" />

11、nginx+tomcat+redis_session共享的更多相关文章

  1. nginx+tomcat+session共享(转)

    1 起因   最近对新开发的web系统进行了压力测试,发现tomcat默认配置下压到600人的并发登录首页响应速度就有比较严重的影响,一轮出现2000多个的 500和502错误.我把登录的时间统计做了 ...

  2. 【nginx】nginx tomcat session 共享配置

    tomcat,redis下载忽略. 一.从github上下载源码,https://github.com/jcoleman/tomcat-redis-session-manager, 将源码复制到开发工 ...

  3. 征服 Nginx + Tomcat

    2年前一直折腾Apache,现如今更习惯Nginx. 搭建网站又遇到2年前遇到的问题——Session同步. (参考我以前的帖子——征服 Apache + Tomcat)只不过现今担当负载均衡的Apa ...

  4. 征服 Nginx + Tomcat【转】

    征服 Nginx + Tomcat Server Architecture/Distributed nginxtomcatsessioncluster  2年前一直折腾Apache,现如今更习惯Ngi ...

  5. LVS+Keepalived+Nginx+Tomcat高可用负载均衡集群配置(DR模式,一个VIP,多个端口)

    一.概述 LVS作用:实现负载均衡 Keepalived作用:监控集群系统中各个服务节点的状态,HA cluster. 配置LVS有两种方式: 1. 通过ipvsadm命令行方式配置 2. 通过Red ...

  6. 【转】Nginx+Tomcat+Memcached集群Session共享

    cookie是怎样工作的? 例 如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header如下面所示,这里假设访问者的注册名 是“Michael J ...

  7. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...

  8. Nginx+Tomcat+Memcache实现负载均衡及Session共享

    第一部分 环境介绍 部署环境: Host1:Nginx.Memcached.Tomcat1 Host2:Tomcat2 Tomcat_version:8.0.38 第二部分 Nginx+Tomcat实 ...

  9. Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享

    Nginx+Tomcat+Redis实现负载均衡.资源分离.session共享 CentOS安装Nginx http://centoscn.com/CentosServer/www/2013/0910 ...

随机推荐

  1. 客户端保存token到sessionStorage

    将token保存到客户端的sessionStorage 一.区分localStorage和sessionStorage localStorage是本地持久化存储 sessionStorage是浏览器会 ...

  2. [刷题] 435 Non-overlapping Intervals

    要求 贪心算法与动态规划的关系 给定一组区间,最少删除多少个区间,可以让这些区间之间互相不重叠 给定区间的起始点永远小于终止点 示例 [[1,2],[2,3],[3,4],[1,3]], 返回1 [[ ...

  3. node.js的包加载机制

    加载一个模块 require('moduleName'); 现在核心模块中加载,如果核心模块中没有,那么就去node_modules目录下去找,核心模块的优先级最高. 如果加载模块式省略了文件的后缀名 ...

  4. 7.12-7.19 id、w、who、last、lastb、lastlog

    7.12-7.19 id.w.who.last.lastb.lastlog 目录 7.12 id:显示用户与用户组的信息 7.13 w:显示已登录用户信息 7.14 who:显示已登录用户信息 显示最 ...

  5. python3 摆放家具练习

    摆放家具 需求: 1)房子有户型,总面积和家具名称列表 新房子没有任何家具 2)家具有名字和占地面积.其中: 床:占4平米 衣柜:占2平米 餐桌:占1.5平米 3)将以上三件家具添加到房子中 4)打印 ...

  6. 高德Serverless平台建设及实践

    导读 高德启动Serverless建设已经有段时间了,目前高德Serverless业务的峰值早已超过十万QPS量级,平台从0到1,QPS从零到超过十万,成为阿里集团内Serverless应用落地规模最 ...

  7. 『动善时』JMeter基础 — 27、通过JMeter函数助手实现参数化

    目录 1.测试计划中的元件 2.数据文件内容 3.函数助手配置 (1)函数助手的打开方式 (2)函数助手界面介绍 (3)编辑后的函数助手界面 4.HTTP请求组件内容 5.线程组元件内容 6.脚本运行 ...

  8. 企业微信三种token

    http://www.upwqy.com/doc/28.html 基本配置介绍 区分三种类型access_token 服务商的token 说明:以corpid(服务商CorpID).provider_ ...

  9. python做反被爬保护的方法

    python做反被爬保护的方法 网络爬虫,是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.但是当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护.于是,很 ...

  10. MindInsight训练可视整体设计介绍

    MindInsight训练可视整体设计介绍 MindInsight是MindSpore的可视化调试调优组件.通过MindInsight可以完成训练可视.性能调优.精度调优等任务. 训练可视功能主要包括 ...