Nginx+keepalived主从模式

nginx的安装参考:nginx

keepalived的安装参考:keepalived

背景:很多企业都在使用nginx做反向代理,负载均衡,一旦nginx挂了,任何请求都转发不到应用服务器,网站就GG了,所以nginx要实现高可用的,怎么实现呢,一般用keepalived。

keepalived的介绍:

Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

原理:每一台Keepalived都有一个自己的 ip,那就是一共有n个ip,但是只有一个虚拟ip,n个ip都去抢这个虚拟ip,前端发起的请求将会落在抢到虚拟ip的那台机器上。同理,2个机器,每一台机器上都有nginx和keepalived,配置nginx主从模式,一般主的优先级大于从的,所以主是好的话,主能抢到虚拟ip,一般的请求会访问这个虚拟ip,进而请求就会落在主这台机器上;但是如果主宕了的话,keepalived会检测到主已经挂了,就让从去抢到这个虚拟ip,所以来访问的时候,请求就会落在从机器上,达到高可用效果。

keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。
core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
check负责健康检查,包括常见的各种检查方式。
vrrp模块是来实现VRRP协议的。



一、环境说明:
操作系统:centos7,64位
master机器(master-node):192.168.116.128
slave机器(slave-node):192.168.116.129
公用的虚拟IP(VIP):192.168.116.120     //负载均衡器上配置的域名都解析到这个VIP上

二、配置服务

先查看防火墙状态:

/bin/systemctl status firewalld.service (centOS 7)

/bin/systemctl status iptables.service (centOS 6)
如果是开启的话,关闭:

/bin/systemctl stop firewalld.service (centOS 7)

/bin/systemctl stop iptables.service(centOS 6)

1、mater-node负载机上的keepalived配置

修改配置文件:

vi /etc/keepalived/keepalived.conf
#MASTER节点

global_defs {

}

vrrp_instance VI_1 {
    state MASTER    #指定A节点为主节点 备用节点上设置为 BACKUP 即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 51    #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 100        #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1       #组播信息发送间隔,两个节点设置必须一样
    authentication {  #设置验证信息,两个节点设置必须一样
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    #指定虚拟IP,两个节点设置必须一样

        192.168.116.120/32    #如果两个nignx的ip分别是192.168.116.128,.......129,则此处的虚拟ip跟他俩同一个网段即可

       # 192.168.200.16
       # 192.168.200.17
       # 192.168.200.18
    }

}

#BACKUP节点

global_defs {

}

vrrp_instance VI_1 {
    state BACKUP    #指定A节点为主节点 备用节点上设置为 BACKUP 即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 51    #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 99        #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1       #组播信息发送间隔,两个节点设置必须一样
    authentication {  #设置验证信息,两个节点设置必须一样
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    #指定虚拟IP,两个节点设置必须一样

        192.168.116.120/32    #如果两个nignx的ip分别是192.168.116.128,.......129,则此处的虚拟ip跟他俩同一个网段即可

       # 192.168.200.16
       # 192.168.200.17
       # 192.168.200.18
    }

}

#分别启动两台机器上的keepalived

service keepalived start

两个机器上分别查看 ip addr

主:由下图可见,主拿到了虚拟ip 192.168.116.120

从:由下图可见,从在eth0这个网卡上只有一个自己的ip

如果我们把主这台服务器的keepalived进程杀掉的话,会出现什么情况呢?

主:由下图可见,主这台服务器挂了,上面只有自己的ip,那我们去看从

从:由下图可见,从已经拿到 虚拟ip 192.168.116.120,主已经挂了,那请求都会落在从这台机器上。

我们再让主的keepalived进程恢复,看会发生什么情况?

主:又下图可见,主又重新接管虚拟ip了(VIP)

从:


总结:

经过前面的配置,如果master主服务器的keepalived停止服务,slave从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。
但这并不是我们需要的,我们需要的是当NginX停止服务的时候能够自动切换。

原理:
keepalived支持配置监控脚本,我们可以通过脚本监控NginX的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复NginX则杀掉keepalived,使得从服务器能够接管服务。

思路:
由于keepalived并不跟nginx耦合,他俩完全不是一家人,但是keepalived提供了一个机制:让用户自定义一个shell脚本去检测用户自己的程序,返回状态给keepalived就可以了


#MASTER节点

global_defs {

}

vrrp_script chk_health {

    script "[[`ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit1"

    interval 1    #每隔1秒执行上述的脚本,去检查用户的程序ngnix

    weight -2

}

vrrp_instance VI_1{

    state MASTER

    interface eth0

    virtual_router_id 1

    priority 100

    advert_int 2

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

        chk_health

    }

    virtual_ipaddress {

       192.168.116.120/32

       # 192.168.200.16
       # 192.168.200.17
       # 192.168.200.18

    }

    notify_master"/usr/local/keepalived/sbin/notify.sh master"

    notify_backup"/usr/local/keepalived/sbin/notify.sh backup"

    notify_fault"/usr/local/keepalived/sbin/notify.sh fault"
}

#添加切换通知脚本

vi /usr/local/keepalived/sbin/notify.sh
#!/bin/bash

case "$1" in
    master)
        /usr/local/nginx/sbin/nginx
        exit 0
    ;;
backup)
        /usr/local/nginx/sbin/nginx -s stop
        /usr/local/nginx/sbin/nginx
        exit 0
    ;;
    fault)
        /usr/local/nginx/sbin/nginx -s stop
        exit 0
    ;;
    *)
        echo 'Usage: notify.sh {master|backup|fault}'
        exit 1
    ;;
esac

#添加执行权限

chmod +x/usr/local/keepalived/sbin/notify.sh

#BACKUP节点

global_defs {

}

vrrp_scriptchk_health {

    script "[[ `ps -ef | grep nginx | grep-v grep | wc -l` -ge 2 ]] && exit 0 || exit 1"

    interval 1

    weight -2

}

vrrp_instance VI_1{

    state BACKUP

    interface eth0

    virtual_router_id 1

    priority 99

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

 

    track_script {

        chk_health

    }

 

    virtual_ipaddress {

        192.168.116.120/32

       # 192.168.200.16
       # 192.168.200.17
       # 192.168.200.18

    }

        

    notify_master"/usr/local/keepalived/sbin/notify.sh master"

    notify_backup "/usr/local/keepalived/sbin/notify.shbackup"

    notify_fault"/usr/local/keepalived/sbin/notify.sh fault"
}

#在第二台机器上添加notify.sh脚本

#分别在两台机器上启动keepalived

service keepalived start

chkconfig keepalived on

即可



  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

maple 枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值