利用Redis高速缓存实现Tomcat集群在Nginx负载均衡机制下的Session共享

本文主要是介绍利用Redis高速缓存实现Tomcat集群在Nginx负载均衡机制下的Session共享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么要共享session?

我们使用单台Tomcat的时候不会有共享sesssion的疑虑,只要使用Tomcat的默认配置即可,session即可存储在Tomcat

但是随着业务的扩大,增加Tomcat节点构成Tomcat集群大势所趋,分布式带来了增加更大规模并发请求的优势,但是也随之到来了一个问题,每个Tomcat只存储来访问自己的请求产生的session,如果Tomcat-A已经为客户端C创建了会话session,那么Tomcat-B并不知道客户端已与集群中的Tomcat-A产生了会话,在访问时就会为C再创建一份session,如果是基于session的验证会话权限的接口(如用户登录认证后才可访问的数据接口),将会导致在访问集群中不同节点的时候重复认证。session的不共享导致原来的会话管理机制在Tomcat集群中无法工作。

所以,如果有一个Tomcat集群都能访问的公共session存取区就好了,虽然tomcat自带的session共享的例子,对于小集群够用了。大集群就会引发效率问题,基于这个概念,我们想到了使用Redis来做这个session公共存取区,这样子的话就有一个统一管理回话的地方了。如果Tomcat-A已经为客户端C创建了会话session,这个session信息会直接存储在公共的Redis里面,那么Tomcat-B就可以到公共session存储区里获得已为C产生的session,这样的结果是集群的公共session存取区在逻辑上就像一个tomcat的内部session存取区一样了。

怎么做呢?

有了上述基本的概念,我们就要开始真正施行了。

1. 安装Redis(以windows为例)

下载地址:https://github.com/MSOpenTech/redis/releases。

Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis

打开文件夹,内容如下:

设置redis密码,配置文件修改

打开redis.windows.conf找到requirepass值修改密码,如下

      # requirepass foobaredrequirepass 123456//此处注意,行前不能有空格,123456为密码

打开一个 cmd 窗口 使用 cd 命令切换目录到 C:\redis 运行:

          redis-server.exe redis.windows.conf

如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:

Redis 安装

这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。

2. 持久化Tomcat Session到Redis中

Tomcat提供了一个开放的session管理和持久化的org.apache.catalina.session.ManagerBase,继承这个抽象类并做一些简单的配置,即可让你的session管理类接管Tomcat的session读取和持久化。当然,我在这里使用了一个流行的开源项目:
https://github.com/jcoleman/tomcat-redis-session-manager
,它已经为我们准备好了这样的一个管理类,只要将这个管理类配置在Tomcat中即可发挥功能。它可以帮助我们将tomcat的session存入我们指定的redis,甚至支持redis在sentinel模式调度的redis集群,以后我也将用一篇文章详述这样的redis集群该如何部署。

使用这个项目非常简单,如果在tomcat8下部署,直接使用项目release出的jar文件(或者链接:https://pan.baidu.com/s/1gD60LCyi-qql8Ae_0tJCGA    提取码:35q4 )到Tomcat的lib下即可

commons-pool2-2.0.jarjedis-2.5.2.jartomcat8_redis_session_manager.jar

引入后需要在tomcat下修改conf/context.xml

<Valve className="com.demo.redis_session.RedisSessionHandlerValve" /><Manager className="com.demo.redis_session.RedisSessionManager"host="127.0.0.1"port="6379"database="0"password="123456"maxInactiveInterval="60" />

这样一来我们的tomcat即可把session的管理交由我们配置的redis来处理。

3. 启动两个tomcat(apache-tomcat-8.0.17-A和apache-tomcat-8.0.17-B

其中:

apache-tomcat-8.0.17-A 端口为:8080

apache-tomcat-8.0.17-B 端口为:8081

apache-tomcat-8.0.17-A 下的web项目代码为:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
session.setAttribute("username", "wangru");
String   username   =  session.getAttribute("username")==null?"": session.getAttribute("username").toString();
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'index.jsp' starting page</title></head><body>I am from slaver 111111111111111<br><%=username %></body>
</html>

apache-tomcat-8.0.17-B 下的web项目代码为:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String   username   =  session.getAttribute("username")==null?"": session.getAttribute("username").toString();
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'index.jsp' starting page</title></head><body>I am from slaver 222222222222222222<br><%=username %></body>
</html>

 

4. 修改nginx配置文件

(1).  下载nginx1.8.0版本:

           http://nginx.org/download/nginx-1.8.0.zip

(2). 解压软件到对应位置(D:\develop\nginx),并重命名文件夹为nginx

(3).打开安装目录D:\develop\nginx\conf下nginx.conf文件,修改如下:

   


#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;#服务器的集群  upstream  myTomcats {  #服务器集群名字   server 127.0.0.1:8081 weight=1;#服务器配置 weight是权重的意思,权重越大,分配的概率越大。  server 127.0.0.1:8080  weight=2;  }server {listen       8090;server_name  localhost;location / {proxy_pass http://myTomcats;  proxy_redirect default;  }error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443 ssl;#    server_name  localhost;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.key;#    ssl_session_cache    shared:SSL:1m;#    ssl_session_timeout  5m;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers  on;#    location / {#        root   html;#        index  index.html index.htm;#    }#}}

5. 启动nginx服务 

在nginx.exe的目录下(例如,进入到D:\develop\nginx ,执行cd /d D:\develop\nginx (不加 "/d" 的话,当前驱动跳转不过去)),执行DOS命令:start nginx

6. 验证nginx服务是否启动成功:

执行DOS命令:tasklist /fi "imagename eq nginx.exe"  如果出现下图说明nginx启动成功

7. 验证利用Redis高速缓存是否实现了Tomcat集群在Nginx负载均衡机制下的Session共享

在浏览器中输入http://127.0.0.1:8090/   ,重复刷新出现下面两个tomcat切换,说明Session共享成功

综上,利用Redis高速缓存就实现了Tomcat集群在Nginx负载均衡机制下的Session共享。

但是,当redis服务不幸挂掉,每台tomcat就会无法请求redis,进而造成Session雪崩,从而引起整个tomcat集群挂掉,影响业务系统正常访问。优化方案是再搭建redis集群避免因一个redis服务挂掉造成session雪崩。后面我会以另外一篇博文介绍redis集群的搭建。

这篇关于利用Redis高速缓存实现Tomcat集群在Nginx负载均衡机制下的Session共享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130110

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount