您现在的位置是:首页 > 文章详情

#IT明星不是梦#nginx+tomcat集群redis共享session方案实战案例

日期:2020-02-10点击:367

一、常见的session一致性方案

在web集群系统中,为了使web能适应大规模的访问,需要实现应用的集群部署. 而实现集群部署首先要解决session的统一,即需要实现session的一致性,目前,实现session一致性主要有两个方案,分别是session复制和session共享。

session复制,是指session信息会在集群节点之间复制,每个节点服务器上都会有相同的session信息。 这种方案的优点是即使一个节点服务器宕机了,只要还有服务器存活,session信息就不会丢失,也就不影响用户使用。而缺点是集群节点之间通信频繁,对应用的响应速度有影响,在高并发、高频操作的情况下性能下降会更厉害。

第二种方案是session共享,也就是将session信息保存在内存数据库中,然后多个节点都可以来访问内存中的session信息,最常见的就是基于Memcache/Redis等数据库的session共享。

tomcat自带集群中,提供了session复制功能,session信息会在各个tomcat中同步,session复制对网络要求较高,session内存的消耗对tomcat影响非常大,对于小集群来说,这种session复制基本够用了,而对于大型集群,还是建议使用redis或者memcache进行session共享。

因此,在构建tomcat集群时,推荐使用tomcat基于redis的session共享机制。
在通过nginx构建集群时,也会涉及session的问题,根据设置的nginx负载均衡算法的不同,session的实现机制也不相同,例如轮询(默认),指定权重,fair(第三方),url_hash(第三方)负载算法时,集群各个节点之间必须通过session共享来实现。而使用IP绑定的 ip_hash算法时,用户的请求都会绑定在同一个节点服务器上,可不考虑session问题。但是,节点服务器宕机后,用户需要关掉浏览器重新打开登录才能恢复正常,这样体验会变得很差。因此,session共享在集群架构中有很大的用途。

二、应用环境介绍

1、session应用工具

Tomcat集群在企业应用中使用比较多,因此,必须要解决session共享的问题。这里主要介绍一个简单的session共享方案:redisson工具。

redisson是redis官网推荐的java语言实现分布式锁的项目。当然,redisson远不止分布式锁,还包括其他一些分布式结构。例如,分布式应用,分布式缓存,分布式回话管理,分布式服务(任务,延迟任务,执行器),分布式redis客户端等。而我们这里要使用的是redisson提供的Tomcat Session Manager功能。它支持最新的JDK和各个版本的tomcat(6/7/8/9),redisson官网地址为https://redisson.org/ 。
而Tomcat session共享的github地址为:
https://github.com/redisson/redisson/tree/master/redisson-tomcat
读者可根据自己不同的tomcat版本,选择下载不同的redisson即可。

2、环境准备

首先说明下此案例的应用环境,如下表所示:

操作系统 IP地址 安装软件 用途 centos7.6 172.16.213.37 Nginx1.14 负载均衡服务器 centos7.6 172.16.213.120 Redis5、tomcat9.0 Tomcat、redis服务器 centos7.6 172.16.213.106 tomcat9.0 Tomcat服务器

这是一个nginx与tomcat组合的web架构,两台tomcat组成集群,通过nginx实现负载均衡,而在这个集群中的session机制我们通过redis来实现session共享,下面就来看看这个集群架构中如何实现tomcat集群中的session共享。

三、nginx+tomcat+redis部署过程

这个web架构的部署过程很简单,主要分为三个步骤,下面依次介绍。

1、redis安装部署

redis安装部署比较简单,首先从https://redis.io 下载最新版本的redis,这里下载的是redis5.x版本,然后编译即可,过程如下:

[root@localhost ~]#wget http://download.redis.io/releases/redis-5.0.3.tar.gz [root@localhost ~]#tar zxvf redis-5.0.3.tar.gz [root@localhost ~]#cd redis-5.0.3 [root@localhost redis-5.0.3]#make [root@localhost redis-5.0.3]#make install [root@localhost redis-5.0.3]#cp redis.conf /etc [root@localhost redis-5.0.3]#cd src [root@localhost src]#cp redis-cli redis-server redis-sentinel /usr/sbin/
上面这个安装过程在前面章节已经做过详细介绍,这里不再过多说明。

2、配置redis并启动

对redis不需要过多配置,打开redis配置文件/etc/redis.conf,修改两个配置项的值为如下内容:

bind 0.0.0.0 daemonize yes

最后,启动redis服务即可:

[root@localhost ~]#/usr/sbin/redis-server /etc/redis.conf
这样redis服务就安装完毕并且启动起来了。默认redis的启动端口为6379。

3、tomcat安装部署

这里先在172.16.213.120这台机器上部署tomcat,部署tomcat之前,需要先安装JDK,这里选择JDK1.8版本,从oracle官网下载linux-64版本的JDK,下载时,选择适合自己机器运行环境的版本,oracle官网提供的JDK都是二进制版本的,因此,JDK的安装非常简单,只需将下载下来的程序包解压到相应的目录即可。安装过程如下:

[root@localhost ~]# mkdir /usr/java [root@localhost ~]# tar -zxvf jdk-8u181-linux-x64.tar.gz -C /usr/java/

这里我们将JDK安装到了/usr/java/目录下。接着,要让程序能够识别JDK路径,还需要设置JDK的环境变量,这里我们将JDK环境变量设置到/etc/profile文件中。添加如下内容到/etc/profile文件最后:

export JAVA_HOME=/usr/java/jdk1.8.0_181 export PATH=$PATH:$JAVA_HOME/bin exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

然后执行如下命令让设置生效:

[root@localhost ~]# source /etc/profile

最后,在Shell提示符中执行“java -version”命令,如果显示如下结果,说明安装成功:

[root@localhost ~]# java -version java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

JDK部署成功后,就可以部署tomcat了,tomcat的安装很简单,从http://tomcat.apache.org/ 下载最新的tomcat,然后解压即可,这里下载tomcat9版本,安装到/usr/loca/目录下,执行如下操作:

[root@localhost ~]# tar zxvf apache-tomcat-9.0.16.tar.gz -C /usr/local [root@localhost ~]# mv /usr/local/apache-tomcat-9.0.16 /usr/local/tomcat9

这样,tomcat也安装完成了。由于还需要配置tomcat和redis的整合,所以tomcat服务暂时先不启动。

4、tomcat与redis整合实现session共享

tomcat安装完成后,接下来就是配置tomcat了,要配置tomcat和redis整合,实现session管理,需要如下几个步骤。

(1)、部署jar包
首先从https://github.com/redisson/redisson/tree/master/redisson-tomcat 下载两个jar包,根据tomcat版本的不同,下载对应的redisson-tomcat的jar包即可,这里我们使用的是tomcat9版本,所以下载的redisson-tomcat为redisson-tomcat-9-3.11.5.jar,还需要下载一个jar包是redisson-all-3.11.5.jar,这两个jar包的版本会不断升级更新,具体版本号可能跟本文不完全相同,但不影响我们使用,将下载下来的jar包放到$TOMCAT_BASE/lib目录下,我们这里的路径是/usr/local/tomcat9/lib。

(2)、增加RedissonSessionManager配置
这个步骤是在tomcat的配置文件$TOMCAT_BASE/conf/context.xml中,添加如下配置:

 <Manager className="org.redisson.tomcat.RedissonSessionManager" configPath="${catalina.base}/conf/redisson.json" readMode="REDIS" updateMode="DEFAULT"/> 其中,{catalina.base}/conf/redisson.json文件内容如下: { "singleServerConfig":{ "idleConnectionTimeout":10000, "connectTimeout":10000, "timeout":3000, "retryAttempts":3, "retryInterval":1500, "password":null, "subscriptionsPerConnection":5, "clientName":null, "address": "redis://172.16.213.120:6379", "subscriptionConnectionMinimumIdleSize":1, "subscriptionConnectionPoolSize":50, "connectionMinimumIdleSize":32, "connectionPoolSize":64, "database":0, "dnsMonitoringInterval":5000 }, "threads":0, "nettyThreads":0, "codec":{ "class":"org.redisson.codec.FstCodec" }, "transportMode":"NIO" }

这个json文件主要是配置tomcat和redis连接的属性信息,需要注意json文件里面的"address"一项的值,如果tomcat和redis安装在一起,可以写成127.0.0.1:6379,如果redis在独立的一台机器上,就写redis所在机器的IP地址。这里redis所在的IP为172.16.213.120,所以上面就写这个地址即可。

到此为止,tomcat与redis的互联配置完成。

5、添加获取session的jsp文件

在tomcat服务器172.16.213.120上对应的目录$TOMCAT_BASE/webapps/ROOT下创建一个testsession.jsp文件,内容如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>tomcat1</title> </head> <body> <center><h1>tomcat1</h1></center> <center> <h3>sessionId:</h3><%=session.getId()%> <h3>session创建时间:</h3><%=session.getCreationTime()%> <center> </body> </html>

接着,启动tomcat服务,执行如下命令:

[root@localhost ~]#/usr/local/tomcat9/bin/startup.sh

启动tomcat后,在浏览器访问:http://172.16.213.120:8080/testsession.jsp, 如下图所示:
#IT明星不是梦#nginx+tomcat集群redis共享session方案实战案例

然后,登录redis客户端,查看key信息,操作如下:

[root@localhost tomcat9]# redis-cli -h 172.16.213.120 -p 6379 172.16.213.120:6379> keys * 1) "redisson:tomcat_session:56BC7C926C3673F8F7CFEC52442B10EA" 172.16.213.120:6379>

可以看到,redis里面已经生成了session信息。redis里面的session信息跟testsession.jsp获取到的完全一致。

6、部署第二个tomcat实例

上面已经部署好了第一台tomcat实例tomcat1,接着在172.16.213.106上部署另一个tomcat实例tomcat2,最简单的部署方法是直接拷贝第一个tomcat1实例到172.16.213.106上对应的位置即可。

为了两个tomcat实例进行区分,这里需要修改testsession.jsp文件中的一些标识信息,修改后的内容如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>tomcat2</title> </head> <body> <center><h1>tomcat2</h1></center> <center> <h3>sessionId:</h3><%=session.getId()%> <h3>session创建时间:</h3><%=session.getCreationTime()%> <center> </body> </html>

这里主要是将testsession.jsp文件中的tomcat1修改为了tomcat2,最后,还需要在172.16.213.106上安装和配置JDK,这个上面已经做了介绍,这里不再说明。

所有修改完成后,启动tomcat2服务,然后访问http://172.16.213.106:8080/testsession.jsp, 如下图所示:

#IT明星不是梦#nginx+tomcat集群redis共享session方案实战案例

可以看到,通过172.16.213.120和172.16.213.106访问testsession.jsp页面得到的session信息是不一样的。这是正常的。因为这是不同的服务器,得到的session当然不同。

7、部署nginx负载均衡

根据上面的定义,nginx是安装在172.16.213.37服务器上,从nginx官网http://nginx.org/ 下载最新的nginx版本,这里是nginx-1.14版本,然后进行编译安装,过程如下:

[root@centos ~]# yum -y install zlib pcre pcre-devel openssl openssl-devel [root@centos ~]# useradd -s /sbin/nologin www [root@centos ~]#tar zxvf nginx-1.14.1.tar.gz [root@centos ~]#cd nginx-1.14.1 [root@centos nginx-1.14.1]# ./configure \ --user=www \ --group=www \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --conf-path=/usr/local/nginx/conf/nginx.conf \ --error-log-path=/usr/local/nginx/logs/error.log \ --http-log-path=/usr/local/nginx/logs/access.log \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/lock/subsys/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-pcre [root@centos nginx-1.14.1]# make [root@centos nginx-1.14.1]# make install

这样,nginx就安装完成了。接下来,就是配置nginx了,打开nginx配置文件nginx.conf,重点修改如下部分内容:

user www; worker_processes 8; events { worker_connections 65536; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream tomcat { server 172.16.213.120:8080 weight=1; server 172.16.213.106:8080 weight=1; } server { listen 80; server_name localhost; location / { proxy_pass http://tomcat; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; include fastcgi_params; } } }

这个nginx配置中,启用了nginx的负载均衡功能,集群的后端节点就是两台tomcat服务器,配置完成,启动nginx服务,操作如下:

[root@centos nginx-1.14.1]# /usr/local/nginx/sbin/nginx 

四、测试nginx+tomcat+redis的session共享功能

nginx配置完成后,就可以通过http://172.16.213.37/testsession.jsp 访问两个tomcat实例了,如下图所示:

#IT明星不是梦#nginx+tomcat集群redis共享session方案实战案例

可以尝试不停刷新这个页面的话,页面会在两个tomcat实例之间来回轮询切换,但session值并不发生变化,这说明两个tomcat实例都共享了redis里面存储的session信息,也就是实现了nginx+tomcat+redis的session共享功能。

原文链接:https://blog.51cto.com/ixdba/2470151
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章