keepalived 高可用 nginx

之前我们用 keepalived 高可用了 lvs 的 dr 模型,是通过 keepalived 自带的添加 ipvs 规则的方式实现的高可用。下面我们来对 nginx 实现高可用,并且实现双主高可用。

删除之前配置的 vip,执行下面的脚本即可。

#!/bin/bash
#
vip="192.168.2.246"
vip2="192.168.2.244"
eth="lo"
host="-host"
case $1 in
start)
	echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        ifconfig $eth:1 $vip/32 broadcast $vip up
        route add $host $vip dev $eth:1
        ifconfig $eth:2 $vip2/32 broadcast $vip2 up
        route add $host $vip2 dev $eth:2
        ;;
stop)

	echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        ifconfig $eth:1 down
        ifconfig $eth:2 down
        ;;
esac

高可用 nginx

在 node1 和 node2 上安装Nginx

# yum install nginx -y

接下来,配置nginx,让 nginx 能够反向代理至 node1 和 node4

upstream webservers {
  server 192.168.2.11:80 weight=1;
  server 192.168.2.14:80 weight=1;
}

location   /    {
    proxy_pass  http://webservers;  
}

node2同样的配置  

我们要让keepalived能够探测nginx是否在线,可以手动写一个脚本来实现:

复制代码
vrrp_script chk_nginx {
    script "killall -0 nginx"
    interval 1
    weight -10
}
在vrrp_instance中进行检测:
vrrp_instance VI_1 {
  track_script {
    chk_nginx
  }
}

Virtual server的内容可以都删掉,因为用不到 ipvs的规则
Note:node1和node2都要实现

这时候,浏览器中访问:http://192.1682.110; 能够实现负载均衡的效果;如果我们将node1上的nginx服务停止掉,浏览器访问依然能够实现负载均衡的效果。如果我们让node上nginx再启动服务,虚拟地址又流转到node上了。

如果我们要让虚拟地址在哪个节点上,哪个节点就运行nginx;没有虚拟地址的节点就停止nginx。

1、如果出现故障,即nginx没启动时,优先级都减去20:

初始优先级:
MASTER:100
BACKUP:99
MASTER启动nginx时,备节点不启动nginx
MASTER:100
BACKUP:99 --> 79 
当MASTER节点出现故障:
MASTER: 100 -->80
BACKUP:79  //备节点因为优先级低于MASTER,所以虚拟地址抢不过来

 如果出现故障时,优先级减去不同的值,让一个多减一点,一个少一点,总是会出现优先级的问题而虚拟地址抢不过来。

这时候,我们可以通过让主备节点都一直运行nginx,只要主节点在线就让它来服务,优先级高的不在了就让优先级低的来服务,优先级高的回来了就流转地址让优先级高的来服务。所以我们可以这么做:

在之前的 notify.sh 中加上: 

#!/bin/bash
# Author: 
# Description: An example of notify script
#

vip="192.168.2.18"
contact="root@localhost"

notify() {
    mailsubject="$(hostname) to be $1: $vip floating"
   mailbody="$(date +'%F %H:%M:%S'): vrrp transition,$(hostname) changed to be $1"
  echo $mailbody | mail -s "$mailsubject" $contact
}

case $1 in
master)
        notify master
      service nginx restart  //成为主节点,我们让nginx重启
         exit 0
        ;;
backup)
        notify backup
     service nginx restart  //成为备节点,我们也让nginx重启
        exit 0
        ;;
fault)
        notify fault
        exit 0
        ;;
*)
        echo "Usage:$(basename $0) {master|backup|fault}"
 exit 1
        ;;
esac

这样,我们就能保证 nginx 一直在线。这种是单主模式的,我们要实现双主模式,让 nginx 都能同时接收请求,怎么实现呢?

接下来,我们实现双主模式的应用。

只需要在 keepalived 配置文件中各添加一个实例就可以了。

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1122
    }
    virtual_ipaddress {
        192.168.2.28/32 dev eth0 label eth0:2
    }
    track_script {
        chk_nginx
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

  

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1122
    }
    virtual_ipaddress {
        192.168.2.28/32 dev eth0 label eth0:2
    }
    track_script {
        chk_nginx
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

还有要在notify.sh脚本中将重启nginx的命令去掉,我们实际应用中不应该使用脚本去控制 nginx 的开启,而是让其他监控软件来实现这个功能,比如 zabbix 等。

这样,我们就实现双主模式,主备节点上都配有 vip , 浏览器访问这两个 vip 时都能得到响应。主备下线一个,两个 vip 依然能够工作。手动启动下线的 nginx ,vip 又会流转到启动的节点。

 

posted @ 2022-01-08 10:09  coocoo  阅读(26)  评论(0编辑  收藏  举报