Keepalived+Nginx+Redis+Tomcat实现高可用web负载均衡

一、系统环境

  • 操作系统:CentOS 7

  • tomcat 8.0.47

  • Nginx 1.12.2

  • Redis 4.0.2

  • 192.168.124.128 tomcat1+Nginx+Redis

  • 192.168.124.130 tomcat2

具体如何安装这些软件,这里就不再介绍了,请大家自己去网上查找资料。

安装完成后,修改下tomcat2的端口号,如果每台服务器上只有一个tomcat,不修改也可以。端口号修改在conf目录下的server.xml文件。

这里写图片描述

如果一台服务上有多台tomcat,那么还要修改其它两处。

为了更好的展示效果,这里将tomcat的ROOT项目中的index.jsp稍作修改:

tomcat1:

<% HttpSession session = request.getSession(); %> <%= session.getId() %>

另一台同样如此修改,并将tomcat1改为tomcat2即可。完成后分别启动两台服务器上的tomcat。

二、修改Nginx配置

在配置文件nginx.conf文件中做如下修改

#在http下面添加如下内容
upstream tomcat {
     server 192.168.124.130:8081 weight=1;
     server 192.168.124.128:8080 weight=2;
 }
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
     #此处tomcat名称与上面一致
        proxy_pass http://tomcat;
        root   html;
        index  index.html index.htm;
	}
	
	error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
    }
	...
}

配置完成后,通过sbin/nginx命令启动Nginx。在浏览器中输入http://localhost
发现,网页可以成功打开。
这里写图片描述

这是第一个tomcat中的页面,刷新一下浏览器。

这里写图片描述
这次打开的是第二个tomcat中的页面,并且它们的sessionId是不相同的。这并不是我们想要,这种差异不应让访问者感知到。下面我们的要做的就是在访问这两个tomcat时保持它们的session一致,也就是共享一个session,就像是访问同一个tomcat。这里使用Redis来实现。

Keepalived+Nginx+Redis+Tomcat实现高可用web负载均衡_第1张图片

三、保持session共享

1、 首先将下面四个jar包放入tomcat的lib目录中,所需jar包:

  • commons-logging-1.2.jar
  • jedis-2.9.0.jar
  • commons-pool2-2.4.2.jar
  • TomcatClusterEnabledRedisSessionManager-1.0.jar

2、在Tomcat的conf目录中使用touch命令生成RedisDataCache.properties文件,并加入如下内容(redis的服务地址):

redis.hosts=192.168.124.128:6379

3、修改conf下的context.xml文件,在最后一个上边添加 如下代码:



4、打开Redis服务,分别重启Tomcat。这时已经不能使用Session对象去获取sessionId,重启tomcat请应先去除上面在index.jsp中添加有关获取sessionId的代码。

此时在通过Nginx来访问tomcat,每次sessionId都是一致的。

Keepalived+Nginx+Redis+Tomcat实现高可用web负载均衡_第2张图片

这样我们的tomcat使用redis实现session共享就实现了,并且用ngnix 实现了负载均衡,但是我们想一下,如果我们使用一个nginx,如果该nginx所在的服务器,宕机了,那么我们的程序就挂掉了。那么我们该如何实现一个高可用的方案呢。

实际上实现Session共享的方案很多, Spring-Session实现Session共享

四、nginx+keepalived 实现高可用

通过下面的命令安装keepalived

yum install -y keepalived

配置keepalived的主从模式。

主机(192.168.124.128)keepalived.conf配置

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0

}

vrrp_script chk_nginx {
  script "/etc/keepalived/nginx_check.sh"
  interval 3 #(检测脚本执行的间隔)
  weight 2
}
vrrp_instance VI_1 {
    state MASTER #主机为MASTER,备机为BACKUP
    interface eno16777736 #本机的网卡,需支持MULTICAST
    virtual_router_id 51 # 主从需一致
    priority 100 #主机优先级高于从机
    advert_int 1
    authentication {
        auth_type PAS
        auth_pass 1111
    }
    track_script {
       chk_nginx
    }
    virtual_ipaddress {
        192.168.124.131 #虚拟ip,主从应一致
    }

}

从机(192.168.124.130)配置

! Configuration File for keepalived

global_defs {
   ...
}

rrp_script chk_nginx {
  script "/etc/keepalived/nginx_check.sh"
  interval 3
  weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.124.131
    }
}

编写nginx状态检测脚本 /etc/keepalived/nginx_check.sh,如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalived将虚拟 ip 绑定到 BACKUP 机器上。内容如下:

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /home/wangzi/soft/nginx/sbin/nginx
    sleep 5
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

分别启动主从机器上的keepalived(systemctl start keepalived.service)以及nginx(sbin/nginx)。

使用ip a命令查看VIP信息。

Keepalived+Nginx+Redis+Tomcat实现高可用web负载均衡_第3张图片

Keepalived+Nginx+Redis+Tomcat实现高可用web负载均衡_第4张图片

可以看到此时虚拟VIP已经在128机器上了。我们在浏览器中输入192.168.124.131访问该地址。

Keepalived+Nginx+Redis+Tomcat实现高可用web负载均衡_第5张图片

此时将主机keepalived服务关闭,虚拟VIP已经在130机器上,浏览器中访问192.168.124.131,仍可以正常访问。

Keepalived+Nginx+Redis+Tomcat实现高可用web负载均衡_第6张图片

你可能感兴趣的:(tomcat)