一.简介
对于生产环境有了一定规模的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-master | Centos7.5.1804 | 3.10.0-862.el7.x86_64 | nginx/1.12.2+keepalived | 192.168.10.101 |
nginx-master | Centos7.5.1804 | 3.10.0-862.el7.x86_64 | nginx/1.12.2+keepalived | 192.168.10.101 |
VIP | 192.168.10.100 |
Tomcat应用服务器信息:
主机名称 | 操作系统版本 | 内核版本 | 软件包版本 | JDK版本 | Ip地址规划 |
---|---|---|---|---|---|
tomcat-node1 | Centos7.5.1804 | 3.10.0-862.el7.x86_64 | tomcat-8.5.42 | 1.8.0_161-b14 | 192.168.10.107:8080 |
tomcat-node2 | Centos7.5.1804 | 3.10.0-862.el7.x86_64 | tomcat-8.5.42 | 1.8.0_161-b14 | 192.168.10.108:8080 |
Redis会话服务器信息:
主机名称 | 操作系统版本 | 内核版本 | 软件包版本 | Ip地址规划 |
---|---|---|---|---|
redis-master | Centos7.5.1804 | 3.10.0-862.el7.x86_64 | redis-5.0.5+sentine | 192.168.10.104:6379,26379 |
redis-slave | Centos7.5.1804 | 3.10.0-862.el7.x86_64 | redis-5.0.5+sentine | 192.168.10.105:6379,26379 |
redis-slave | Centos7.5.1804 | 3.10.0-862.el7.x86_64 | redis-5.0.5+sentine | 192.168.10.106:6379,26379 |
VIP | 192.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不变 这就代表成功了