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


简介

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

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

需求分析

网络拓扑如下图所示


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。


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容