Nginx+Tomcat实现高可用和Session会话共享

5 篇文章 0 订阅
4 篇文章 0 订阅

一.简介

在这里插入图片描述
在这里插入图片描述
对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重启或者宕机的话,那么该session就会丢失,而客户端的操作会由于session丢失而造成数据丢失;如果当前用户访问量巨大,每个用户的Session里存放大量数据的话,那么就很占用服务器大量的内存,进而致使服务器性能受到影响。数据库持久化session,分为物理数据库和内存数据库。物理数据库备份session,由于其性能原因,不推荐;内存数据库可以使用redis和memcached,下面说下redis方式:
在这里插入图片描述
实现达到的效果 当客户端访问Nginx服务器时,Nginx负载均衡会自动将请求转发到Tomcat1节点或Tomcat2节点服务器,以减轻Tomcat压力,从而达到Tomcat集群化部署,为了使各Tomcat之间共享同一个Session,将采用Redis缓存服务来集中管理Session存储。Nginx实现负载均衡,并使用Redis实现session共享。本案例采用的是redis单点方式(可以给这个redis节点配置一个从节点,采用redis主从模式,连接redis的master节点.redis默认不支持主主模式),如果使用redis集群方式,则采用Sentinels连接。

二.准备

清单: (在这里因为时间和资源的问题 我把nginx和keepalived放在同一台服务器上)
所用的包自行下载

Nginx代理服务器信息:

主机名称操作系统版本内核版本软件包版本Ip地址规划
nginx-masterCentos7.5.18043.10.0-862.el7.x86_64nginx/1.12.2+keepalived192.168.10.101
nginx-masterCentos7.5.18043.10.0-862.el7.x86_64nginx/1.12.2+keepalived192.168.10.101
VIP192.168.10.100

Tomcat应用服务器信息:

主机名称操作系统版本内核版本软件包版本JDK版本Ip地址规划
tomcat-node1Centos7.5.18043.10.0-862.el7.x86_64tomcat-8.5.421.8.0_161-b14192.168.10.107:8080
tomcat-node2Centos7.5.18043.10.0-862.el7.x86_64tomcat-8.5.421.8.0_161-b14192.168.10.108:8080

Redis会话服务器信息:

主机名称操作系统版本内核版本软件包版本Ip地址规划
redis-masterCentos7.5.18043.10.0-862.el7.x86_64redis-5.0.5+sentine192.168.10.104:6379,26379
redis-slaveCentos7.5.18043.10.0-862.el7.x86_64redis-5.0.5+sentine192.168.10.105:6379,26379
redis-slaveCentos7.5.18043.10.0-862.el7.x86_64redis-5.0.5+sentine192.168.10.106:6379,26379
VIP192.168.10.192

注意事项:每台服务器所做的一样操作

[root@localhost ~]# mkdir /media/cdrom
[root@localhost ~]# mount /dev/cdrom /media/cdrom/       //以为我采用的是本地yum源所以挂载的是本地光盘
[root@localhost ~]# systemctl stop firewalld  && setenforce 0    //以为实验的进度 我关闭了防火墙 以及Linux 内核

三、部署Tomcat

先配置Tomcat :(两台服务器上的操作一样唯一不同的是网页的代码不同)
[root@localhost ~]# tar zxvf apache-tomcat-7.0.90.tar.gz

[root@localhost ~]# mv apache-tomcat-7.0.90 /usr/local/tomcat

[root@localhost ~]# cd /usr/local/tomcat

在这里插入图片描述

[root@localhost tomcat]# cd webapps/ROOT/
这是192.168.10.107上面的index.jsp配置文件

[root@localhost ROOT]# vim index.jsp

<html>
    <body bgcolor="yellow">
    <center>
    <%=  request.getSession().getId()  %>
    <h1>192.168.10.107</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 107 !");     %>

下面的是192.168.10.108上面的index.jsp配置文件

<html>
    <body bgcolor="yellow">
    <center>
    <%=  request.getSession().getId()  %>
    <h1>192.168.10.108</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 108 !");     %>

[root@localhost ROOT]# /usr/local/tomcat/bin/startup.sh //启动tomcat

下面是访问结果
在这里插入图片描述
在这里插入图片描述

四、部署Nginx

配置nginx上的操作:(主和从一样的操作)

[root@localhost ~]# yum -y install gcc* pcre* zlib*
[root@localhost ~]# tar zxvf nginx-1.12.2.tar.gz
[root@localhost ~]# cd nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install && useradd -M -s /sbin/nologin nginx

配置所需要的模块 以及 安装 和 添加一个nginx的用户 (用户这样写不能登入到系统)

[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/  //优化路径
[root@localhost nginx-1.12.2]# cd /usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf         //配置文件
upstream tomcat {                                //在34行添加即可
        server 192.168.10.107:8080 max_fails=2 fail_timeout=2;
        server 192.168.10.108:8080 max_fails=2 fail_timeout=2;
        } 
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcat;
 }

在这里插入图片描述

#max_fails=2连续检测失败两次认为该节点不可用
##fiil_timeout=2 每次检测超过2秒未响应为检测失败

[root@localhost conf]# nginx -t //检擦语法是否正确
在这里插入图片描述
[root@localhost conf]# nginx //启动服务
下面是访问结果 以轮询的方式
在这里插入图片描述
在这里插入图片描述

一、Nginx实现主从热备

[root@localhost ~]# yum -y install keepalived //在两个nginx上面安装keepalived

[root@localhost ~]# cd /etc/keepalived/
下面是主的keepalived的配置文件

[root@localhost keepalived]# vim keepalived.conf //配置文件

! Configuration File for keepalived
global_defs {				##默认配置段
   router_id nginx-proxy-master		##定义设备名称
}
vrrp_script chk_ngx {				##定义nginx服务状态检查规则
   script "/etc/keepalived/scripts/chk_ngx.sh"	##检查脚本的位置
   interval 3				##每3秒执行一次脚本检查
   fail 2 					##连续失败2次就认定为状态检查失败
   rasi 1 					##只要成功1次就认定为成功
   weight -2				##检测失败本设备优先级减2
}
vrrp_instance nginx-proxy {			##定义备份组实例
    state MASTER				##定义本设备在实例中的角色
    interface eth0				##vip要绑定的网卡
    virtual_router_id 22			##routeid,同一个组要一致
    priority 100				##本设备的优先级
    advert_int 3				##设备间每3秒进行一次心跳检测
    authentication {				##验证信息
        auth_type PASS			##验证类型
        auth_pass nginx-proxy		##验证的密码
    }
    virtual_ipaddress {			
        192.168.10.100                          ##定义一个漂移IP
    }
    track_script {
        chk_ngx				##调用nginx健康检查脚本
    }   
}

[root@localhost keepalived]# mkdir scripts/

[root@localhost keepalived]# vim scripts/chk_ngx.sh //写个脚本

#!/bin/bash
#此脚本为检测nginx状态,如果正常则退出0,nginx服务未开启则会自动启动一次,如果启动失败则退出返回1
STATUS=`netstat -anpt | grep 80 |wc -l`
if [ "$STATUS" -eq 0 ];then
	#/usr/sbin/nginx		#如果开启当nginx死掉会尝试自动启动一次服务
	sleep 4
	STATUS=`netstat -anpt | grep 80 |wc -l`
	if [ "$STATUS" -eq 0 ];then
		exit 1
	else
		exit 0
	fi
else
	exit 0

下面是从的keepalived配置文件

! Configuration File for keepalived
global_defs {
   router_id nginx-proxy-slave
}
vrrp_instance nginx-proxy {
    state BACKUP
    interface eth0
    virtual_router_id 22
    priority 99
    advert_int 3
    authentication {
        auth_type PASS
        auth_pass nginx-proxy
    }
    virtual_ipaddress {
        192.168.10.100
    }
}

[root@localhost keepalived]# systemctl start keepalived //启动keepalived

下面是访问结果
在这里插入图片描述
在这里插入图片描述

五、部署Redis

下面是redis哨兵的配置文件 (三台的配置一模一样 keepalived不一样)

[root@localhost ~]# tar zxvf redis-3.2.9.tar.gz
[root@localhost redis-3.2.9]# make && make install
[root@localhost redis-3.2.9]# ./utils/install_server.sh    //一路回车就好
[root@localhost redis-3.2.9]# cp src/redis-sentinel /etc/redis/    //哨兵启动脚本
[root@localhost redis-3.2.9]# cp sentinel.conf /etc/redis/        //哨兵配置文件
[root@localhost redis-3.2.9]# cd /etc/redis/

[root@localhost redis]# vim 6379.conf //redis 配置文件

#bind 127.0.0.1                            //注释掉,监听所有
protected-mode no                   //no掉  否则tomcat连接不上

[root@localhost redis]# vim sentinel.conf //哨兵的配置文件

sentinel monitor mymaster 192.168.10.104 6379 2         //指定主的redis    6379是端口     2代表两个从
daemonize yes               //开启后台守护进程

[root@localhost redis]# /etc/init.d/redis_6379 restart //重启redis
[root@localhost redis]# ./redis-sentinel sentinel.conf //启动哨兵机制

一、Redis实现VIP自动跳转

[root@localhost ~]# yum -y install keepalived
[root@localhost ~]# cd /etc/keepalived/

下面是主的配置文件

[root@localhost keepalived]# vim keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id redis-104			##设备名称
}
vrrp_instance VI_redis {
    state MASTER				##当前设备为master
    interface eth0				##vip绑定的网卡
    virtual_router_id 79			##备份组id,同一备份组要一致
    priority 100				##优先级,优先级高的成为master
    advert_int 3				##每多少秒进行一次健康检查
    authentication {
        auth_type PASS
        auth_pass redis
    }
    virtual_ipaddress {
        192.168.10.192
    }
}

下面是从的配置文件

! Configuration File for keepalived
global_defs {
   router_id redis-105
}
vrrp_script chkmaster {
        script "/etc/keepalived/scripts/chkmaster.sh"	#检查当前redis是否为master
        interval 3			#每3秒检查一次
        weight 2			#当本机为master检测结果返回1,将优先级加2
        fall 2   			##检测失败多少次就才认为是真的失败
        rise 1    			##检测成功1为就认为是成功的
    }
vrrp_instance VI_redis {
    state BACKUP			#本机的状态信息
    interface eth0			#vip绑定的网卡
    virtual_router_id 79		##备份组id,同一备份组要一致
    priority 99			##优先级,优先级高的成为master
    advert_int 3			##每多少秒进行一次健康检查
    authentication {
        auth_type PASS
        auth_pass redis
    }
    virtual_ipaddress {
        192.168.10.192
    }
    track_script {			##调用状态检查
        chkmaster
    }
}

[root@localhost keepalived]# mkdir scripts/

[root@localhost keepalived]# vim scripts/chkmaster.sh

#!/bin/bash
STATUS=`/usr/local/bin/redis-cli info | grep role:master | wc -l`
echo $STATUS
if [ "$STATUS" -eq 0 ];then
    exit 1
else
    exit 0
fi

[root@localhost keepalived]# systemctl start keepalived //启动

六、Tomcat实现会话共享

接下来回到 Tomcat 上面做 会话共享

[root@localhost ~]# cd /usr/local/tomcat/conf/

[root@localhost conf]# vim context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
             host="192.168.10.192"  
             port="6379"  
             database="0" 
             maxInactiveInterval="60" />

</Context>

把之前下好的jar包放到lib里面 包自行下载

[root@localhost ~]# cp commons-pool2-2.3.jar /usr/local/tomcat/lib/
[root@localhost ~]# cp tomcat-redis-session-manager-master-2.0.0.jar /usr/local/tomcat/lib/
[root@localhost ~]# cp jedis-2.7.3.jar /usr/local/tomcat/lib/
[root@localhost ~]# /usr/local/tomcat8.5/bin/shutdown.sh ##停止tomcat服务
[root@localhost ~]# /usr/local/tomcat8.5/bin/startup.sh ##启动tomcat服务

在这里插入图片描述

在这里插入图片描述
会发现IP在变 sessionid不变 这就代表成功了

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值