基于KeepAlived双主模型的高可用Nginx的实现


简介

前面的一篇博客介绍了基于KeepAlived双主模型的高可用LVS的实现,详见(http://www.jianshu.com/p/0e8efc8fda3c),但是目前Nginx在企业使用的比较多,因为Nginx是基于七层的调度,工作在网路第7层,所以可以对HTTP应用实施分流策略,比如域名、结构等。相比之下,LVS并不具备这样的功能,所以Nginx可使用的场合远多于LVS。
基于这样的考量,下面将介绍一下基于KeepAlived双主模型的高可用Nginx的实现。

实验实现基于KeepAlived双主模型的高可用Nginx

需求分析

网络拓扑如下图所示


基于KeepAlived双主模型的高可用Nginx的实现_第1张图片
Keepalived实现Nginx的高可用.jpg
FQDN IP
images.king.com VIP1
172.18.1.100
app.king.com VIP2
172.18.1.200

当客户端访问images.king.com的时候,是通过VIP1访问,最终后端提供服务的是WEBSRV1和WEBSRV2;当客户端访问app.king.com的时候,是通过VIP2访问,后端提供服务的是WEBSRV3和WEBSRV4。当用户访问其中一个站点的时候,单个Nginx服务器可以提供负载均衡,将前端的请求调度到后端的两台WEBSRV上,但是一台Nginx无法避免单点失败的问题,所以考虑用两台Nginx服务器配合KeepAlived来实现高可用性。同时,企业提供两个站点的服务,如果每个站点都采用两台Nginx来实现高可用性,那么需要四台Nginx服务器,成本比较高,而且正常情况下,有两台Nginx服务器处于空闲中。可以考虑采用KeepAlived + Nginx 双主模型的方式来实现这种需求。
双主模型。即针对VIP1,Nginx1是MASTER,Nginx2是BACKUP,此时,VIP1漂在Nginx1上面,Nginx1负责调度后端的WEBSRV1和WEBSRV2。针对VIP2,Nginx2是MASTER,Nginx1是BACKUP,此时,VIP2漂在Nginx2上面,Nginx2负责调度后端的WEBSRV3和WEBSRV4。当Nginx1或者Nginx2服务器的nginx服务,或者keepalived服务出现故障,亦或是一台nginx服务器的网络出现故障的时候,那么此时出故障的Nginx服务器上面的VIP将漂移到另一台Nginx服务器上面,并且原来负责的两台后端WEBSRV将由正常的Nginx服务器接管。以上是大致的实现过程。

实验环境准备

搭建上图所示的实验环境,为了突出实验的重点,上面的路由器省略,确保CLIENT和NGINX1以及NGINX2在同一个物理网络即可。CLIENT上面配置了一块网卡,IP地址是172.18.1.6。NGINX1和NGINX2上面有两块网卡,分别配置了VIP和DIP,VIP用于面向CLIENT,而DIP则用来连接后端的四台WEBSRV。
确保所有虚拟机(centos7.3)上面的防火墙和selinux处于关闭状态。
各节点时间必须同步
找一台机器A与国内一台常用的NTP服务器同步时间,企业里面其他的机器与A机器同步时间。
各节点之间通过主机名互相通信,建议使用/etc/hosts文件实现
各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信

实验过程

一、配置客户端CLIENT

vim /etc/hosts
# 添加下面两行
172.18.1.100     images.king.com
172.18.1.200     app.king.com

二、在WEBSRV1和WEBSRV2上面
WEBSRV2的配置和WEBSRV1的配置大致相同,下面以WEBSRV1为例介绍一下。

# 如果没有安装httpd就安装
yum install httpd
# 启动服务
systemctl start httpd
# 准备页面,如果是WEBSRV2,就把WEBSRV1 改为WEBSRV2
# 这里是为了便于测试才区分的
echo "WEBSRV1 images" > /var/www/html/index.html

三、在WEBSRV3和WEBSRV4上面
WEBSRV4的配置和WEBSRV3的配置大致相同,下面以WEBSRV3为例介绍一下。

# 如果没有安装httpd就安装
yum install httpd
# 启动服务
systemctl start httpd
# 准备页面,如果是WEBSRV4,就把WEBSRV3 改为WEBSRV4
# 这里是为了便于测试才区分一下的
echo "WEBSRV3 app" > /var/www/html/index.html

四、配置NGINX1服务器

# 安装KeepAlived
yum install keepalived
# 配置keepalived
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from node1@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1 
   vrrp_mcast_group4 224.111.111.111
}

vrrp_script chk_down {
        script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
        interval 1
        weight -20
}

vrrp_script chk_nginx {
        script "killall -0 nginx &> /dev/null  && exit 0 || exit 1"
        interval 1
        weight -20
        fall 2
        rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens37
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 411fa9f6
    }
    virtual_ipaddress {
        172.18.1.100/16
    }
    track_script {
        chk_down
        chk_nginx
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface ens37
    virtual_router_id 66
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123fa9f6
    }
    virtual_ipaddress {
        172.18.1.200/16
    }
}
# 安装nginx
yum install nginx
# 配置nginx
vim /etc/nginx/nginx.conf
# http{}里面添加
upstream webgroup1{
          server 192.168.1.14:80 weight=1;
          server 192.168.1.15:80 weight=2;
          server 127.0.0.1:80 backup;
 }
upstream webgroup2{
          server 192.168.1.16:80 weight=1;
          server 192.168.1.66:80 weight=2;
          server 127.0.0.1:80 backup;
 }
# server{} 修改如下
server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /app/website;
        index index.jsp index.html;
}
# 新建/etc/nginx/conf.d/real_server.conf,添加server
vim /etc/nginx/conf.d/real_server.conf
server {
        listen       172.18.1.100:80;
        server_name  images.king.com;
        root         /app/images;

        location / {
            proxy_pass http://webgroup1;
        }
    }

server {
    listen       172.18.1.200:80;
    server_name  app.king.com;
    root         /app/app;

    location / {
        proxy_pass http://webgroup2;
    }
}
# 准备目录以及sorry server
mkdir /app/website
echo "sorry server" > /app/website/index.html
mkdir /app/app
mkdir /app/images
# 启动nginx和keepalived
nginx
systemctl start keepalived

五、配置NGINX2服务器

# 安装KeepAlived
yum install keepalived
# 配置keepalived
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from node2@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2 
   vrrp_mcast_group4 224.111.111.111
}

vrrp_script chk_down {
        script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
        interval 1
        weight -20
}

vrrp_script chk_nginx {
        script "killall -0 nginx &> /dev/null  && exit 0 || exit 1"
        interval 1
        weight -20
        fall 2
        rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens37
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 411fa9f6
    }
    virtual_ipaddress {
        172.18.1.100/16
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens37
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123fa9f6
    }
    virtual_ipaddress {
        172.18.1.200/16
    }
    track_script {
        chk_down
        chk_nginx
    }
}
# 安装nginx
yum install nginx
# 配置nginx
vim /etc/nginx/nginx.conf
# http{}里面添加
upstream webgroup1{
          server 192.168.1.16:80 weight=1;
          server 192.168.1.66:80 weight=2;
          server 127.0.0.1:80 backup;
        }
upstream webgroup2{
      server 192.168.1.14:80 weight=1;
      server 192.168.1.15:80 weight=2;
      server 127.0.0.1:80 backup;
    }
# server{} 修改如下
server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /app/website;
        index index.jsp index.html;
}
# 新建/etc/nginx/conf.d/real_server.conf,添加server
vim /etc/nginx/conf.d/real_server.conf
server {
        listen       172.18.1.200:80;
        server_name  app.king.com;
        root         /app/app;

        location / {
            proxy_pass http://webgroup1;
        }

}

server {
        listen       172.18.1.100:80;
        server_name  images.king.com;
        root         /app/images;

        location / {
            proxy_pass http://webgroup2;
        }

    }

# 准备目录以及sorry server
mkdir /app/website
echo "sorry server" > /app/website/index.html
mkdir /app/app
mkdir /app/images
# 启动nginx和keepalived
nginx
systemctl start keepalived  

六、在CLIENT上进行测试
测试一:
for i in {1..15};do curl images.king.com; done
for i in {1..15};do curl app.king.com; done
按照调度算法正常进行服务调度。
测试二:
for i in {1..50};do sleep 0.5; curl images.king.com;done
for i in {1..50};do sleep 0.5; curl app.king.com;done
断开NGINX1或者NGINX2的网络,两个站点依然正常访问。
停掉其中一台NGINX的keepalived服务,两个站点正常访问。
此时,VIP1和VIP2集中在一台正常工作的NGINX服务器上面。
测试三:
for i in {1..50};do sleep 0.5; curl images.king.com;done
停掉WEBSRV1或者WEBSRV2,images.king.com站点依然可以正常访问。
for i in {1..50};do sleep 0.5; curl app.king.com;done
停掉WEBSRV3或者WEBSRV4,app.king.com站点依然可以正常访问。
测试四:
for i in {1..50};do sleep 0.5; curl images.king.com;done
停掉NGINX1服务器上面的nginx服务,发现images.king.com依然可以访问。
for i in {1..50};do sleep 0.5; curl app.king.com;done
停掉NGINX2服务器上面的nginx服务,发现app.king.com依然可以访问。
测试五:
for i in {1..50};do sleep 0.5; curl images.king.com;done
把WEBSRV1和WEBSRV2的httpd服务都停掉,发现显示的是sorry,server,前端调度器NGINX充当了WEBSRV。
for i in {1..50};do sleep 0.5; curl app.king.com;done
把WEBSRV3和WEBSRV4的httpd服务都停掉,发现显示的是sorry,server,前端调度器NGINX充当了WEBSRV。


至此,实验介绍结束,不足之处,请多指正!

你可能感兴趣的:(基于KeepAlived双主模型的高可用Nginx的实现)