Tomcat集群在Nginx负载均衡机制下的Session共享

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

  • 为什么要共享session?
    • 搭建步骤
    • 1. 安装Redis(以windows为例)
    • 2.持久化Tomcat Session到Redis中
    • 3. 启动两个tomcat(apache-tomcat-8.0.17-A和apache-tomcat-8.0.17-B)
    • 4. 修改nginx配置文件
    • 5. 启动nginx服务
    • 6. 验证nginx服务是否启动成功
    • 7. 验证利用Redis高速缓存是否实现了Tomcat集群在Nginx负载均衡机制下的Session共享

为什么要共享session?

我们使用单台Tomcat的时候不会有共享sesssion的疑虑,只要使用Tomcat的默认配置即可
Tomcat集群在Nginx负载均衡机制下的Session共享_第1张图片
session即可存储在Tomcat,但是随着业务的扩大,增加Tomcat节点构成Tomcat集群大势所趋,分布式带来了增加更大规模并发请求的优势,但是也随之到来了一个问题,每个Tomcat只存储来访问自己的请求产生的session,如果Tomcat-A已经为客户端C创建了会话session,那么Tomcat-B并不知道客户端已与集群中的Tomcat-A产生了会话,在访问时就会为C再创建一份session,如果是基于session的验证会话权限的接口(如用户登录认证后才可访问的数据接口),将会导致在访问集群中不同节点的时候重复认证。session的不共享导致原来的会话管理机制在Tomcat集群中无法工作。
Tomcat集群在Nginx负载均衡机制下的Session共享_第2张图片
所以,如果有一个Tomcat集群都能访问的公共session存取区就好了,虽然tomcat自带的session共享的例子,对于小集群够用了。大集群就会引发效率问题,基于这个概念,我们想到了使用Redis来做这个session公共存取区,这样子的话就有一个统一管理回话的地方了。如果Tomcat-A已经为客户端C创建了会话session,这个session信息会直接存储在公共的Redis里面,那么Tomcat-B就可以到公共session存储区里获得已为C产生的session,这样的结果是集群的公共session存取区在逻辑上就像一个tomcat的内部session存取区一样了。
Tomcat集群在Nginx负载均衡机制下的Session共享_第3张图片

搭建步骤

1. 安装Redis(以windows为例)

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

Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。
Tomcat集群在Nginx负载均衡机制下的Session共享_第4张图片
设置redis密码,配置文件修改

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

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

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

     redis-server.exe redis.windows.conf

这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。
Tomcat集群在Nginx负载均衡机制下的Session共享_第5张图片

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.jar
jedis-2.5.2.jar
tomcat8_redis_session_manager.jar

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

 
   

这样一来我们的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

4. 修改nginx配置文件

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

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

(2). 解压软件到对应位置(D:\develop\nginx),并重命名文件夹为nginx
打开安装目录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启动成功

Tomcat集群在Nginx负载均衡机制下的Session共享_第6张图片

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

在浏览器中输入http://127.0.0.1:8090/ ,重复刷新出现下面两个tomcat切换,说明Session共享成功
Tomcat集群在Nginx负载均衡机制下的Session共享_第7张图片
综上,利用Redis高速缓存就实现了Tomcat集群在Nginx负载均衡机制下的Session共享。但是,当redis服务不幸挂掉,每台tomcat就会无法请求redis,进而造成Session雪崩,从而引起整个tomcat集群挂掉,影响业务系统正常访问。优化方案是再搭建redis集群避免因一个redis服务挂掉造成session雪崩。后面我会以另外一篇博文介绍redis集群的搭建。

你可能感兴趣的:(架构,tomcat集群,redis)