高可用负载均衡+nginx+会话共享web集群部署+redis哨兵

高可用负载均衡+nginx+会话共享web集群部署+redis哨兵
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第1张图片
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第2张图片
对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重启或者宕机的话,那么该session就会丢失,而客户端的操作会由于session丢失而造成数据丢失;如果当前用户访问量巨大,每个用户的Session里存放大量数据的话,那么就很占用服务器大量的内存,进而致使服务器性能受到影响。数据库持久化session,分为物理数据库和内存数据库。物理数据库备份session,由于其性能原因,不推荐;内存数据库可以使用redis和memcached,下面说下redis方式:
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第3张图片
实现达到的效果 当客户端访问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.101.101
Vip:192.168.10.100
nginx-backup Centos7.5.1804 3.10.0-862.el7.x86_64 nginx/1.12.2+keepalived 192.168.101.102
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+sentinel 192.168.10.104:6379,26379
redis-slave Centos7.5.1804 3.10.0-862.el7.x86_64 redis-5.0.5+sentinel 192.168.10.105:6379,26379
redis-slave Centos7.5.1804 3.10.0-862.el7.x86_64 redis-5.0.5+sentinel 192.168.10.106:6379,26379

注意事项:每台服务器所做的一样操作
[root@localhost ~]# mkdir /media/cdrom
[root@localhost ~]# mount /dev/cdrom /media/cdrom/ //以为我采用的是本地yum源所以挂载的是本地光盘
[root@localhost ~]# systemctl stop firewalld && setenforce 0 //以为实验的进度 我关闭了防火墙 以及Linux 内核
**

先配置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

<%= request.getSession().getId() %>

192.168.10.107

port:8080

this is Tomcat-node1!

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%> SessionID:<%=session.getId()%>
SessionIP:<%=request.getServerName()%>
SessionPort:<%=request.getServerPort()%><% out.println("This is Tomcat server 107 !"); %> 下面的是192.168.10.108上面的index.jsp配置文件
<%= request.getSession().getId() %>

192.168.10.108

port:8080

this is Tomcat-node2!

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%> SessionID:<%=session.getId()%>
SessionIP:<%=request.getServerName()%>
SessionPort:<%=request.getServerPort()%><% out.println("This is Tomcat server 108 !"); %> [root@localhost ROOT]# /usr/local/tomcat/bin/startup.sh //启动tomcat

下面是访问结果
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第4张图片
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第5张图片
配置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;
}
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第6张图片
#max_fails=2连续检测失败两次认为该节点不可用
##fiil_timeout=2 每次检测超过2秒未响应为检测失败
[root@localhost conf]# nginx -t //检擦语法是否正确
在这里插入图片描述
[root@localhost conf]# nginx //启动服务
下面是访问结果 以轮询的方式
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第7张图片
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第8张图片
[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 [ “KaTeX parse error: Expected 'EOF', got '#' at position 23: … -eq 0 ];then #̲/usr/sbin/nginx…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

下面是访问结果
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第9张图片
高可用负载均衡+nginx+会话共享web集群部署+redis哨兵_第10张图片
下面是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 //启动哨兵机制

[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 S T A T U S i f [ " STATUS if [ " STATUSif["STATUS" -eq 0 ];then
exit 1
else
exit 0
fi
[root@localhost keepalived]# systemctl start keepalived //启动

接下来回到 Tomcat 上面做 会话共享
[root@localhost ~]# cd /usr/local/tomcat/conf/
[root@localhost conf]# vim context.xml

WEB-INF/web.xml ${catalina.base}/conf/web.xml 把之前下好的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服务 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190907120648458.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/20190907120642533.png) 会发现IP在变 sessionid不变

你可能感兴趣的:(高可用负载均衡+nginx+会话共享web集群部署+redis哨兵)