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 又会流转到启动的节点。

浙公网安备 33010602011771号