架构系列三:使用Keepalived+Nginx+tomcat实现集群部署

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kity9420/article/details/80687032

在前面的一篇文章《架构系列二:使用Nginx+tomcat实现集群部署》,介绍了通过Nginx配置Tomct集群,当其中一个Tomcat服务停止后,Nginx可自动识别并选择另一个服务器响应用户请求,达到了Tomcat集群的效果,那如果Nginx服务器停掉后,就会导致整个应用不可用,因此引入了keepalived,通过keepalived配置Nginx集群,保证Nginx的高可用性。

一、环境介绍
VM1:Ubuntu-S100 IP:192.168.130.128
VM2:Ubuntu-S101 IP:192.168.130.129
物理机:192.168.1.101 用于作客户端
JDK:1.8.0_171
Tomcat:apache-tomcat-7.0.62
Keepalived:

二、集群架构图
先看下引入keepalived后的集群架构图
这里写图片描述
我在两台VM上都安装了Nginx及Keepalived,一台作Master,另一台作Backup,同时在VM上还部署了Web应用,要实现的场景是,当Master不工作后,作为Backup的这台Nginx接替原来Master的工作,继续提供服务,保证应用的高可用

三、在VM2上安装Nginx
安装nginx就不介绍了,请参考《架构系列二:使用Nginx+tomcat实现集群部署》

安装完成后,进入到nginx安装目录/usr/local/nginx/sbin,进行sudo ./nginx -t检查nginx是否安装成功,如果出现如下结果,说明nginx已经安装成功

ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

启动Nginx服务并校验

#启动nginx服务
ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx 
#检查nginx启动进程,发现启动了两个进程,一个master,一个worker
ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ ps -ef | grep nginx
root     109164   8174  0 16:27 ?        00:00:00 nginx: master process ./nginx
nobody   109165 109164  0 16:27 ?        00:00:00 nginx: worker process
ubuntu   109245 101144  0 16:34 pts/4    00:00:00 grep --color=auto nginx

在浏览器中输入IP地址,校检nginx服务是否成功启动,如下结果说明Nginx服务已经启动成功
这里写图片描述

四、配置VM2上的Nginx+Tomcat集群
进入安装路径/usr/local/nginx/conf编辑nginx.conf文件,内容如下

#user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream myserver{
       server 192.168.130.129:8080 weight=5 max_fails=2;
       server 192.168.130.128:8080 weight=1 max_fails=2;
    }
    server {
        listen       80;#监听80端口
        server_name  myserver;

        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://myserver; #这里的myserver必须要和upstream中指定的一致
            #proxy_redirect on;
            proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

重新检查并加载配置文件

ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx -t
ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx -s reload

由于我用的域名访问,因此还需要修改hosts文件,在/etc/hosts中增加如下记录

#192.168.130.129是当前VM2的IP
192.168.130.129 myserver

五、在VM1、VM2上安装Keepalived
登录http://www.keepalived.org/download.html,下载keepalived安装包,这里下载的是keepalived-1.4.5.tar.gz,先在VM1上安装keepalived
解压keepalived-1.4.5.tar.gz,得到keepalived-1.4.5目录

tar -xf keepalived-1.4.5.tar.gz

进入到keepalived-1.4.5目录下,执行如下命令安装keepalived

cd keepalived-1.4.5/
# 配置,指定安装目录
./configure --prefix=/usr/local/keepalived-1.4.5
# 编译nginx
sudo make
# 安装nginx
sudo make install

为了将keepalived做成系统服务,需要拷贝一些文件到指定的路径下,如下:

sudo mkdir /etc/sysconfig

sudo cp /usr/local/keepalived-1.4.5/etc/sysconfig/keepalived  /etc/sysconfig/

sudo cp /usr/local/keepalived-1.4.5/sbin/keepalived /usr/sbin/

#注意这里是copy源码包中的文件,不是在安装目录的,这是一个启动keepalived服务的脚本,以守护进程方式运行
#Startup script for the Keepalived daemon
sudo cp /home/ubuntu/dev_tools/keepalived-1.4.5/keepalived/etc/init.d/keepalived  /etc/init.d/

sudo mkdir /etc/keepalived

sudo cp /usr/local/keepalived-1.4.5/etc/keepalived/keepalived.conf /etc/keepalived/

注意,经过以上步骤后,keepalived的配置文件是/etc/keepalived/keepalived.conf,keepalived启动时,默认会读这个配置文件

在/usr/local/keepalived-1.4.5/bin目录下创建check_nginx.sh脚本文件,用于检测nginx的状态,脚本内容如下

#!/bin/sh
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
    /usr/local/nginx/sbin/nginx
fi

sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
    service keepalived stop
fi

解释下上面脚本
1.统计nginx的进程,如果数量为0,则认为nginx没有启动,就启动nginx服务
2.等待2秒,再次统计nginx进程,如果数量还是0,则停止keepalived服务

配置VM1为Master
先看下VM1上的网卡信息

ubuntu@ubuntu-virtual-machine:~$ ifconfig
ens33     Link encap:以太网  硬件地址 00:0c:29:88:a0:46  
          inet 地址:192.168.130.128  广播:192.168.130.255  掩码:255.255.255.0
          inet6 地址: fe80::414b:266b:ba4f:57e9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:519535 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:128982 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000 
          接收字节:752557831 (752.5 MB)  发送字节:9951982 (9.9 MB)

发现VM的网卡设备是ens33,这个参数在配置keepalived.conf文件时要用到,下面开始修改配置文件/etc/keepalived/keepalived.conf,最终配置如下

! Configuration File for keepalived
# global setting , notify email setting
global_defs {
   #存在于同一个网段中,一组keepalived的各个节点都有不同的名字
   #在全局设置中,我们还可以设置管理员的email信息等。
   router_id LVS_V1
}

#这个上面介绍的检查脚本,我们保存在这个文件中(注意文件权限)
vrrp_script chknginx {
    script "/usr/local/keepalived-1.4.5/bin/check_nginx.sh"
    #每2秒钟,检查一次
    interval 2
}

#keepalived实例设置,是最重要的设置信息
vrrp_instance VI_1 {
    #state状态MASTER表示是主要工作节点。
    #一个keepalived组中,最多只有一个MASTER节点,当然也可以没有
    state MASTER
    #实例所绑定的网卡设备
    interface ens33
    #同一个keepalived组,节点的设置必须一样,这样才会被识别
    virtual_router_id 52
    #节点优先级,BACKUP的优先级一定要比MASTER的优先级低
    priority 100
    #组播信息发送间隔,两个节点设置必须一样
    advert_int 1
    #实际的ens33上的固定ip地址
    mcast_src_ip=192.168.130.128
    #验证信息,只有验证信息相同,才能被加入到一个组中。
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟地址和绑定的端口,如果有多个,就绑定多个
    #dev 是指定浮动IP要绑定的网卡设备号
    virtual_ipaddress {
        192.168.130.100 dev ens33
    }

    #设置的检查脚本
    #关联上方的“vrrp_script chknginx”
    track_script {
        chknginx
    }
}

按以上步骤,在VM2上安装keepalived,安装完成后配置VM2为backup
配置VM2为BACKUP
先看下VM2上的网卡信息

ubuntu@ubuntu-virtual-machine:/usr/local/keepalived-1.4.5/bin$ ifconfig
ens33     Link encap:以太网  硬件地址 00:0c:29:40:cf:6a  
          inet 地址:192.168.130.129  广播:192.168.130.255  掩码:255.255.255.0
          inet6 地址: fe80::37cf:3643:3082:32e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:509261 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:152992 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000 
          接收字节:747391907 (747.3 MB)  发送字节:10269294 (10.2 MB)

发现VM的网卡设备是ens33,这个参数在配置keepalived.conf文件时要用到,下面开始修改配置文件/etc/keepalived/keepalived.conf(这里将keepalived.conf文件作了下备份keepalived.conf.back),最终配置如下

! Configuration File for keepalived
# global setting , notify email setting
global_defs {
   #存在于同一个网段中,一组keepalived的各个节点都有不同的名字
   #在全局设置中,我们还可以设置管理员的email信息等。
   router_id LVS_V1
}

#这个上面介绍的检查脚本,我们保存在这个文件中(注意文件权限)
vrrp_script chknginx {
    script "/usr/local/keepalived-1.4.5/bin/check_nginx.sh"
    #每2秒钟,检查一次
    interval 2
}

#keepalived实例设置,是最重要的设置信息
vrrp_instance VI_1 {
    #这里和Master不一样
    state BACKUP
    #实例所绑定的网卡设备
    interface ens33
    #同一个keepalived组,节点的设置必须一样,这样才会被识别
    virtual_router_id 52
    #节点优先级,BACKUP的优先级一定要比MASTER的优先级低
    priority 99
    #组播信息发送间隔,两个节点设置必须一样
    advert_int 1
    #这里和Master不一样,是VM2的IP
    mcast_src_ip=192.168.130.129
    #验证信息,只有验证信息相同,才能被加入到一个组中。
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟地址和绑定的端口,如果有多个,就绑定多个
    #dev 是指定浮动IP要绑定的网卡设备号
    virtual_ipaddress {
        192.168.130.100 dev ens33
    }

    #设置的检查脚本
    #关联上方的“vrrp_script chknginx”
    track_script {
        chknginx
    }
}

启动VM1,VM2上的keepalived服务

#启动
service keepalived start
#停止
service keepalived stop

我们配置的绑定在VM1上的浮动IP:192.168.130.100,通过ifconfig是查看不到的,要通过ip addr 命令才能查看到
这里写图片描述
到此,keepalived配置nginx集群就已经配置完成

配置集群后,怎么快速部署我们的应用呢?如果还一台一台机器部署,效率就太低了,能否实现一键部署的功能呢,请看:《架构系列四:一键部署应用到Tomcat集群中》

参考博文:https://blog.csdn.net/love_is_simple/article/details/47903527

展开阅读全文

没有更多推荐了,返回首页