码迷,mamicode.com
首页 > 其他好文 > 详细

使用redis实现session复制

时间:2019-08-05 00:16:16      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:nta   config   event   install   查看   utf-8   session丢失   tor   gre   

使用redis实现session复制

一:概念
对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重启或者宕机的话,那么该session就会丢失,而客户端的操作会由于session丢失而造成数据丢失;如果当前用户访问量巨大,每个用户的Session里存放大量数据的话,那么就很占用服务器大量的内存,进而致使服务器性能受到影响。数据库持久化session,分为物理数据库和内存数据库。物理数据库备份session,由于其性能原因,不推荐;内存数据库可以使用redis和memcached,下面说下redis方式:
但是有一点需要清楚:就是Redis这种方式目前还暂不支持Tomcat8环境(因为现在网上插件不支持tomcat8,非要支持tomcat8,则需修改插件jar包的源代码)!下面就先说下Tomcat7+Redis+Nginx实现session会话共享的操作记录:
技术图片

实现达到的效果 当客户端访问Nginx服务器时,Nginx负载均衡会自动将请求转发到Tomcat1节点或Tomcat2节点服务器,以减轻Tomcat压力,从而达到Tomcat集群化部署,为了使各Tomcat之间共享同一个Session,将采用Redis缓存服务来集中管理Session存储。Nginx实现负载均衡,并使用Redis实现session共享。本案例采用的是redis单点方式(可以给这个redis节点配置一个从节点,采用redis主从模式,连接redis的master节点.redis默认不支持主主模式),如果使用redis集群方式,则采用Sentinels连接。

技术图片

二:基础信息
IP 主机名 应用 软件
192.168.10.101 Nginx-node Nginx反向代理 nginx-1.12.2.tar.gz
192.168.10.102 Redis-node Redis缓存 redis-3.2.9.tar.gz
192.168.10.103 Tomcat-node1 Tomcat服务器 Tomcat-7
commons-pool2-2.4.2.jar
jedis-2.9.0.jar
tomcat-redis-session-manager1.2.jar
192.168.10.104 Tomcat-node2 Tomcat服务器

三:部署流程

1:系统基本环境的设置
下面操作在三台机器上同样执行:
[root@Nginx-node ~]# cat /etc/redhat-release

为了方便测试,关闭iptables防火墙和selinux。如果是生产环境,开启iptables后,需要开放对应的应用端口。

[root@Nginx-node ~]# setenforce 0
[root@Nginx-node ~]# getenforce
Disabled

[root@Nginx-node ~]# cat /etc/sysconfig/selinux |grep "SELINUX=disabled"
SELINUX=disabled

[root@Nginx-node ~]# systemctl stop firewalld

2:安装Nginx
(在192.168.10.200机器上操作)
(1)安装依赖包
[root@Nginx-node ~]# yum -y install gcc*

(2)安装pcre库
[root@Nginx-node ~]# yum -y install pcre-devel

(3)安装zlib库
[root@Nginx-node ~]# yum -y install zlib-devel

(4)安装openssl
[root@Nginx-node ~]# yum -y install openssl

(5)安装nginx,特别注意要指定prce zlib openssl原码包位置
[root@Nginx-node ~]# tar zxvf nginx-1.12.2.tar.gz
[root@Nginx-node ~]# cd nginx-1.12.2
[root@Nginx-node nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@Nginx-node nginx-1.12.2]# make && make install

(6)安装成功后配置nginx

[root@Nginx-node nginx-1.12.2]# ln -s /usr/local/nginx/sbin/ /usr/local/sbin/
[root@Nginx-node nginx-1.12.2]# ln -s /usr/local/nginx/bin/
/usr/local/bin/

[root@Nginx-node nginx-1.12.2]# cd /usr/local/nginx/conf/
[root@Nginx-node conf]# cp nginx.conf nginx.conf.bak
[root@Nginx-node conf]# vim 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;
include vhosts/*.conf;

}

[root@Nginx-node conf]# mkdir vhosts
[root@Nginx-node conf]# cd vhosts/
[root@Nginx-node vhosts]# vim lb_tomcat.conf
upstream tomcat-lb {
server 192.168.10.103:8080;
server 192.168.10.104:8080;
}

  server {
  listen  80;
  server_name www.benet.com;
  location / {
      proxy_pass http://tomcat-lb;
    }
location ~ .*\.(gif|jpg|png|htm|html|css|ico|flv|swf)(.*) {
      proxy_pass http://tomcat-lb;
    }

}

[root@Nginx-node vhosts]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@Nginx-node conf]# /usr/local/nginx/sbin/nginx
[root@Nginx-node vhosts]# netstat -anpt | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 69640/nginx: master

3:安装tomcat
(在192.168.10.103和192.168.10.104两台机器上操作)

(1)检查java8环境
[root@localhost ~]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)

(2)安装配置tomcat7
[root@Tomcat-node1 ~]# tar zxvf apache-tomcat-7.0.90.tar.gz
[root@Tomcat-node1 ~]# mv apache-tomcat-7.0.90 /usr/local/tomcat7

(3)配置tomcat7
[root@Tomcat-node1 ~]# cd /usr/local/tomcat7/conf/
[root@Tomcat-node1 conf]# cp server.xml server.xml.bak
[root@Tomcat-node1 conf]# vim server.xml
<Engine name="Catalina" defaultHost="localhost"> #这一行不需要修改,没必要动.......
<Host name="localhost" appBase="/data/webapps/" unpackWARS="true" autoDeploy="true">
<Context path="" docBase="/data/webapps" reloadable="true" />

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
           prefix="web1_access_log." suffix=".txt"
           pattern="%h %l %u %t "%r" %s %b" />

</Host>

创建项目目录
[root@Tomcat-node1 conf]# mkdir -p /data/webapps/{WEB-INF,META-INF,classes,lib}
[root@Tomcat-node1 conf]# mkdir /data/logs

创建测试文件
[root@Tomcat-node1 ~]# touch /data/webapps/index.jsp
[root@Tomcat-node1 ~]# vim /data/webapps/index.jsp
<html>
<body bgcolor="green">
<center>
<%= request.getSession().getId() %>
<h1>192.168.10.103</h1>
<h1>port:8080</h1>
<h1>this is Tomcat-node1! </h1>
</center>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%><%out.println("This is Tomcat server 103 !");%>

另一个节点的测试文件为:
[root@Tomcat-node2 ~]# vim /data/webapps/index.jsp
<html>
<body bgcolor="yellow">
<center>
<%= request.getSession().getId() %>
<h1>192.168.10.104</h1>
<h1>port:8080</h1>
<h1>this is Tomcat-node2! </h1>
</center>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%><%out.println("This is Tomcat server 104!");%>

4:测试
使用客户端访问nginx地址http://192.168.10.101

技术图片

技术图片

从测试结果来看,网站并没有形成session复制
SessionID在两个网站上是不同的

4:配置Redis+Session共享
(1)为tomcat配置redis会话复制功能(两个tomcat节点都要设置)
[root@Tomcat-node1 ~]# cd /usr/local/tomcat7/conf/
[root@Tomcat-node1 conf]# cp context.xml context.xml.bak
[root@Tomcat-node1 conf]# cat context.xml

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
         host="192.168.10.102"  
         port="6379"  
         database="0" 
         maxInactiveInterval="60" />

注意:此配置项添加到模块中间,不然无法识别。 即</Context>上方即可

提示:
如果远程redis设置了密码,则就多加一行配置:password="123456"

(2)将依赖的三个jar包拷贝到tomcat7的lib目录下(两个tomcat节点都要设置)
[root@Tomcat-node1 ~]# cp *.jar /usr/local/tomcat7/lib/

(3)重新启动tomcat(两个tomcat节点首要设置)
[root@Tomcat-node1 ~]# /usr/local/tomcat7/bin/shutdown.sh
[root@Tomcat-node1 ~]# /usr/local/tomcat7/bin/startup.sh
[root@Tomcat-node1 ~]# ps -ef | grep tomcat

五: redis安装
1:安装redis
(1)修改主机名
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# hostname redis-node
[root@localhost ~]# bash

(2)安装
[root@redis-node ~]# yum -y install gcc*
[root@redis-node ~]# tar zxvf redis-3.2.9.tar.gz -C /usr/src
[root@redis-node ~]# cd /usr/src/redis-3.2.9/
[root@redis-node redis-3.2.9]# make
[root@redis-node redis-3.2.9]# make install

注意:默认安装在当前目录下,如果要安装在指定目录,可以使用命令:make PREFIX=路径 install

[root@redis-node redis-3.2.9]# cd /usr/src/redis-3.2.9/utils/
[root@redis-node utils]# ./install_server.sh
安装向导使用默认参数

[root@redis-node utils]# netstat -anpt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 9660/redis-server 1

(3):配置参数
[root@redis-node ~]# vi /etc/redis/6379.conf
bind 192.168.10.102

(4):重启redis
[root@redis-node ~]# /etc/init.d/redis_6379 restart

最好在tomcat两个节点上使用"telnet 192.168.10.203 6379"验证下redis是否能成功连接

(5)测试
tomcat通过redis共享session测试 访问http://192.168.10.101,不断刷新页面,发现页面的其他信息改变,但是sessionid保持不变,即说明实现了session共享!

技术图片

技术图片

关闭两个节点中的任意一个tomcat服务,继续访问页面,发现sessionid任然保持不变!
然后在redis机器上查看有没有上面sessionid的key值存在

使用redis实现session复制

标签:nta   config   event   install   查看   utf-8   session丢失   tor   gre   

原文地址:https://blog.51cto.com/14355475/2426399

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!