keepalived+nginx+tomcat+redis高可靠性WEB部署框架

1.序

最近看很多文章,总是很难看懂。主要是感觉作者上手就来,没有整理整个方案的思路,导致我费了半天心思来理解整个框架。好吧,我们不能沉浸在自己的世界里写文章,这样的文章是没有灵魂的:)
好了!我先整理一下这个搭建框架的思路。

2.概述

keepalived+nginx+tomcat+redis ,这么一长串英文,索性就用KNTR来表示了,下文中提到KNTR,就是代表这个框架。
KNTR是一套完善的服务防灾体系,通过软件服务的有机结合,将tomcat数量增加,通过数量优势,可以有效防止服务出现宕机的现象。
我们一般的web服务只有一个tomcat,一即所有,一损俱损。如果有两个tomcat、三个tomcat,甚至更多的tomcat,那么坏一个又有什么关系呢?本着这种思想,KNTR就出现了。
本篇文章,就重点说明一下如何通过KNTR实现有效的防灾,实现应用服务的高可靠性。

3.结构示意

keepalived+nginx+tomcat+redis高可靠性WEB部署框架_第1张图片

3.1.keepalived

顾名思义,keepalived就是保持活着的意思。在KNTR框架中,keepalived一直监控着本机的nginx的状态,同时也时刻监听着备用机器上的心跳,此外,keepalived还虚拟生成一个IP,简称VIP。简言之:
(1)监控nginx
(2)主备心跳同步
(3)虚拟IP

这里解释一下,为什么要增加keepalived。
这个方案使用nginx来保障tomcat的稳定运行,那么靠什么来保障nginx的稳定运行的呢?答案就是keepalived。
keepalived通过定时执行nginx的监控脚本,来保障nginx的稳定,同时通过监控主备机间的心跳,通过权重的大小产生主备的切换(虚拟ip的飘移)。

3.2.nginx

这里nginx的作用主要是实现负载均衡,使得tomcat互为主备。负载均衡就是平均(或按权重)分配任务,使得web服务之间分摊任务。

3.3.tomcat

tomcat的作用主要是发布web服务。我们能访问到的网页页面,都是tomcat的功劳。

3.4.redis

redis这里是作session共享之用。所谓session共享,就是将用户的请求在tomcat之间共享,让所有的tomcat保持同步。(好像不是很严谨)

3.5.安装规划

192.168.10.13 192.168.10.14
主机 备机
tomcat-1 tomcat-2
nginx-1 nginx-2
keepalived-1 keepalived-2
/ redis

4.环境准备

本次操作案例是在centos7.3版本下进行的,在操作之前,请准备以下工具:

4.1.软件安装包

名称 版本/安装包
操作系统 centos7.3_DVD
JDK java 1.8.0_102
keepalived keepalived-2.0.20.tar.gz
nginx nginx-1.17.10.tar.gz
tomcat apache-tomcat-8.5.54.tar.gz
redis redis-5.0.8.tar.gz

4.2.IP

用途 IP
主节点 192.168.10.13
备节点 192.168.10.14
虚拟IP 192.168.10.15

注:将安装包统一放置到linux操作系统的/opt目录下。

5.环境安装

环境安装这里还是简单介绍一下吧,因为很多基本的东西,看似很简单,但是也往往容易忽略,而且忽略了就很麻烦,这里还是再多说一下吧!

5.1.操作系统

操作系统安装的时候,千万不要偷懒图快,最好不要选择最小化安装,最好选择最大化安装。这里的软件安装包都是需要编译安装,其中需要很多依赖关系。如果操作系统是最小化安装,请做个yum源吧。。。

5.2.JDK

之前写过一个jdk一键安装的脚本,需要的话可以自行获取。
一键安装,简单方便。
传送门:https://download.csdn.net/download/weixin_43968988/11390695

6.redis的安装与配置

6.1.安装

这里下载的是二进制的安装包,所以采用编译安装的方法。编译安装可以指定安装目录,安装位置如下表所示:

项目 内容
安装位置 /usr/local/redis
配置文件 /usr/local/redis/redis.conf

(1)解压

cd /opt
tar -zxvf redis-5.0.8.tar.gz

(2)安装

cd /opt/redis-5.0.8
make
make install PREFIX=/usr/local/redis

(3)启动

cd /usr/local/redis/bin
./redis-server

执行成功,无报错,使用ps -ef|grep redis命令检查进程,进程存在即说明安装成功。

注:redis配置文件安装后是不会存在于/usr/local/redis/目录下的,需要从解压后的文件中拷贝一份至/usr/local/redis/中。
(4)复制配置文件

cp /opt/redis-5.0.8/redis.conf /usr/local/redis/

至此安装结束…

6.2配置

redis最关键的是修改redis.conf文件,修改以下两项内容:

项目
redis.conf 修改bind 127.0.0.1为 bind 192.168.10.14
密码 redis123

6.2.1.设置允许其他服务器访问

vi /usr/local/redis/redis.conf

将bind 其余信息全部注释,在其下方增加下面一行内容:

bind 192.168.10.14

注:要想其他服务器可以远程访问,一定要将redis绑定本机IP,其他服务器可以远程访问本机IP连接redis。若是bind127.0.0.1,其他主机是没有办法访问的。

6.2.2.修改密码

在redis配置文件中找到requirepass 这一行,将其注释掉,并在下方增加下面命令。

reqiurepass redis123

6.3.测试

首先在192.168.10.14上将redis启动后,在192.168.10.13上测试redis的连接。
在192.168.10.13上执行如下命令:
(1)连接

redis-cli -h 192.168.10.14 -p 6379 -a redis123

(2)获取密码

192.168.10.14:6379>config get requirepass

(3)结果

1)"reqiurepass"
2)"redis123"

出现以上信息,即说明redis安装配置成功,可进行下一步。
附:
redis安装教程

7.tocmat的安装与配置

7.1.安装

tomcat的安装就不细说了,因为确实没有什么内容。
tomcat安装教程

7.2.配置

tomcat配置需要尤为注意,此处涉及如何连接redis。

7.2.1.查看/配置server.xml文件

cd /opt/tomcat/conf
cat server.xml

找到下面一段代码,这里规定了tomcat开放的端口8080,可以根据自己喜好修改,只要端口不冲突就行。

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />

7.2.2.配置tomat连接redis

此次实操,使用的tomcat8.5版本,所以配置文件、jar包都是按照这个标准进行配置的。
(1)修改context.xml文件

vi /opt/tomcat/conf/context.xml

在context文件中增加一句话

<context>
...省略部分内容
 <Valve className="com.naritech.nicole.gump.RedisSessionHandlerValve" />
    <Manager className="com.naritech.nicole.gump.RedisSessionManager"
        host="192.168.10.14"
        port="6379"
        password="redis123"
        database="0"
        maxInactiveInterval="60"
     />
</context>

(2)增加jar包工具
在/opt/tomcat/lib文件夹下增加jar包工具,用来连接redis。工具如下:
commons-pool2-2.3.jar
jedis-2.7.3.jar
tomcat-redis-session-manager-master-2.0.0.jar
下载链接:tomcat连接redis的jar包

7.3.增加web页面(测试时使用)

7.3.1.增加获取session的web页面

在/opt/tomcat/webapps/test/下增加index.jsp文件

mkdir -p /opt/tomcat/webapps/test/
touch /opt/tomcat/webapps/test/index.jsp

192.168.10.13 上tonmcat的index.jsp文件内容:

<html>
    <body bgcolor="red">    
    <div>   
    <%=  request.getSession().getId()  %>   
    <h1>192.168.10.13</h1>
    </div>
    </body>
</html>
  
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>

192.168.10.14 index.jsp文件内容:

<html>
    <body bgcolor="yellow">    
    <div>   
    <%=  request.getSession().getId()  %>   
    <h1>192.168.10.14</h1>
    </div>
    </body>
</html>
  
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>

7.4.启动

重启两台服务器上tomcat,保证日志没有报错,可以通过在浏览器上输入访问地址,正常打开页面。
http://139.2.136.13:8080/test/index.jsp
http://139.2.136.14:8080/test/index.jsp

8.nginx安装与配置

8.1安装

(1)解压

cd /opt
tar -xvf nginx-1.17.10.tar.gz

(2)编译

cd /opt/nginx-1.17.10
make
make install --prefix=/usr/local/nginx

(3)启动

cd /usr/local/nginx/sbin
./nginx

(4)关闭

./nginx -s stop

8.2.配置

因为使用编译安装,可以指定安装目录,在安装目录下知道nginx的配置文件,并编辑。

cd /usr/local/nginx/conf/
vi 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;

upstream tocmat{
     server 192.168.10.13:8080
     server 192.168.10.14:8080
}

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://tomcat;
            proxy_set_header X-NGINX "NGINX-1" ;
                   }
        }
}

配置文件的核心内容如上文件所示,修改完IP端口后,可以直接复用。

8.3.启动

使用命令,启动nginx.

cd /usr/local/nginx/sbin
./nginx

保证可以实现访问任意一个nginx,均可访问到tomcat发布的web服务页面。在浏览器上分别输入以下两个IP地址访问:
http://139.2.136.13:80/test/index.jsp
http://139.2.136.14:80/test/index.jsp
在不断的刷新中,页面背景颜色在红色和黄色之间进行切换,切换比例是1:1。

9.keepalived 安装与配置

9.1.简介

项目 绝对路径
安装包 /opt/keepalived-2.0.20.tar.gz
安装位置 /usr/local/keepalived/
配置文件 /etc/keepalived/keepalived.conf
应用程序 /usr/local/keepalived/sbin/keepalived

9.2.安装

(1)解压

cd /opt
tar -zxvf keepalived-2.0.20.tar.gz

(2)编译

cd /opt/keepalived-2.0.20
make
make install --prefix=/usr/local/keepalived

(3)启动

cd /usr/local/keepalived/sbin
./keepalived

(4)关闭

killall keepalived

9.2.主机配置

(1)配置

cd /etc/keepalived
vi keepalived.conf

可将如下文件直接替换原文件,根据情况修改修改。

【主机配置文件】

! Configuration File for keepalived
#邮件配置,不需要可以忽略
global_defs {
   notification_email {
     root@localhost #改为本机
   }
   notification_email_from [email protected]
   smtp_server localhost #改为localhost
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#nginx探测脚本
vrrp_script check_nginx {
    script "/ect/keepalived/chech_nginx.sh"
    interval 3 #执行周期,3秒一次
    weight -20 #权重
  }
#核心配置
vrrp_instance VI_1 {
    state MASTER #主机配置MASTER,备机配置BACKUP
    interface eth0 #网卡名称,以本机在用网卡为准
    virtual_router_id 51
    priority 100  #权重,主机值要大于备机值,主备间抢夺虚拟IP
    advert_int 1
    authentication {
        auth_type PASS #主备间的验证方式,密码验证
        auth_pass 1111 #主备相同
    }
    virtual_ipaddress {
        192.168.10.15/16 dev eth0 #虚拟IP,亦VIP
    }
track_script {
check_nginx #追踪脚本执行
   }
}
#还有很多不用的配置内容,这里直接删了

(2)增加nginx监测脚本
①编辑

vi /etc/keepalived/chech_nginx.sh

②添加内容

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]; then
/usr/local/nginx/sbin/nginx
sleep 3
 if [ `ps -C nginx --no-header |wc -l` -eq 0 ]; then
 killall keepalived
 fi
fi

③保存

:wq

④授权

cd /etc/keepalived/
chmod 777 chech_nginx.sh

(3)启动

cd /usr/local/keepalived/sbin
./keepalived

至此,主机安装配置完成。

9.3.备机配置

备机与主的配置基本一致,其中keepalived的配置文件替换一下即可。
【备机配置文件】

! Configuration File for keepalived
#邮件配置,不需要可以忽略
global_defs {
   notification_email {
     root@localhost #改为本机
   }
   notification_email_from [email protected]
   smtp_server localhost #改为localhost
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#nginx探测脚本
vrrp_script check_nginx {
    script "/ect/keepalived/chech_nginx.sh"
    interval 3 #执行周期,3秒一次
    weight -20 #权重
  }
#核心配置
vrrp_instance VI_1 {
    state BACKUP #主机配置MASTER,备机配置BACKUP
    interface eth0 #网卡名称,以本机在用网卡为准
    virtual_router_id 51
    priority 99  #权重,主机值要大于备机值,主备间抢夺虚拟IP
    advert_int 1
    authentication {
        auth_type PASS #主备间的验证方式,密码验证
        auth_pass 1111 #主备相同
    }
    virtual_ipaddress {
        192.168.10.15/16 dev eth0 #虚拟IP,主备一致
    }
  track_script {
   check_nginx 
   }
}

9.4.启动

先将主机192.168.10.13和备机192.168.10.14两台服务器上的keepalived开启,观察IP的状态
输入命令

ip a

正常情况下应该如下所示:
192.168.10.13结果

eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:14:59:9d brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.13/24 brd 192.168.63.255 scope global dynamic eth0
    inet 192.168.10.15/24 brd 192.168.63.255 scope global dynamic eth0
       valid_lft 299523255sec preferred_lft 299523255sec

192.168.10.14结果

eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:14:59:9d brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.14/24 brd 172.17.191.255 scope global dynamic eth0
       valid_lft 299523255sec preferred_lft 299523255sec

10.测试

(1)关闭1个tomcat,检查页面访问情况
(2)关闭1个nginx,检查页面访问情况
(3)关闭1个keepalived,检查页面访问情况

11.说明

编译过程中,如果缺少依赖关系,注意看报错日志,遵循“缺什么,补什么”的原则,将所需要的的依赖包补齐。安装过程中,必须是上一步成功后,再执行下一步,不要越级执行命令。
配置过程中,一定要注意注释部分小心配置。

你可能感兴趣的:(nginx,tomcat,redis)