Nginx一般用来做服务网关,虽然Nginx的性能非常高,但是还是有宕机的风险,所以Nginx的高可用也是我们需要考虑的。常见的Nginx的高可用方案是使用keepalived
浮动IP技术来实现。
通过keepalived
虚拟一个vip
出来作为虚拟网关,所有请求都先通过虚拟网关找到真正网关,再往下走。当主宕机了后,从会接过主的责任对外提供服务,当主复活后从又会将权限还给主,如图:
keepalived主要功能
- 管理LVS负载均衡软件
- 实现LVS集群节点的健康检查
- 作为系统网络服务的高可用性(failover)
使用keepalived来监控nginx
keepalived
通过shell
脚本的方式来监控nginx
的进程数量,从而判断nginx
是否死掉,如果死掉就通过命令重启Nginx,脚本文件/usr/local/src/chk_nginx_pid.sh
如下:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l` #统计nginx进程数
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #重启nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
killall keepalived #杀掉,vip就漫游到另一台机器
fi
fi
- 统计nginx进程数 ,如果进程数为0则重启nginx。
- 重启nginx后重新统计nginx进程数,如果还是0表示nginx重启失败。
- nginx重启失败,则杀掉本机
keepalived
进程,这时虚IP就会浮动到从Nginx服务器上。
keepalived配置
keepalived
需要和nginx
安装在一台机器上,然后打开/etc/keepalived/keepalived.conf
配置keepalived。
keepalived主:
! Configuration File for keepalived
global_defs {
router_id LVS_1
}
vrrp_script chk_http_port {
script "/usr/local/src/chk_nginx_pid.sh" #心跳执行的脚本
interval 2 #(检测脚本执行的间隔,单位是秒)
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0 #系统网卡
virtual_router_id 51 #主备两机器一致
priority 100 #值大的机器,胜出
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress { #可虚拟多个ip
192.168.244.200
}
}
keepalived从:
! Configuration File for keepalived
global_defs {
router_id LVS_2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.244.200
}
}
主从差异配置只有两个,如下:
-
state BACKUP
:指定keepalived
的角色,MASTER
为主,BACKUP
为备。 -
priority 50
:优先级,数值越大,处理请求的优先级越高,备用数字小些。
keepalived脑裂
keepalived
的主节点会定期往备节点发送心跳包,当备节点没有接收到心跳包的时候,会认为主节点挂了,那么他就会接过主节点的责任对外提供服务,表现形式就是备节点上出现了虚拟IP。这时有可能发生脑裂情况,所以我们还需要通过shell
脚本监控keepalived
的脑裂情况,脚本如下:
#!/bin/bash
# 检查脑裂的脚本,在备节点上进行部署
LB01_VIP=10.10.10.229
LB01_IP=10.10.10.129
LB02_IP=10.10.10.130
while true
do
ping -c 2 -W 3 $LB01_VIP &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$LB01_VIP"|wc -l` -eq 1 ];then
echo "ha is brain."
else
echo "ha is ok"
fi
sleep 5
done
网友评论