问题:
vip无法ping通
keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭,原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
环境:
虚拟IP:172.16.10.49
nginx1:172.16.10.50 主
nginx2:172.16.10.51 备
分别在两台机器上安装nignx和keepalived,这里采用yum的方式安装。
keepalived应该说是lvs的衍生项目,与lvs的配合比较紧密。当用于做其他服务的HA的时候,只能依靠脚本去扩展相应的功能。
在keepalived+nginx的组合中,包括了两个层次上的HA:
主机层HA,这个依赖keepalived本身的功能,当主机down掉的时候,可以自动将VIP切换到备机上;
服务层HA,这部分是通过脚本结合keepalived的来实现的,通过脚本判断服务是否正常,从而操控keepalived的进程来实现vip在主备机之间的漂移。
1.设置nginx的yum源
创建文件/etc/yum.repos.d/nginx.repo
加入以下内容:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1
将其中的OS改成当前系统的类型(rhel|centos),OSRELEASE改成当前的版本(5|6|7)
yum install -y nginx
启动nginx:
/etc/init.d/nginx restart
查看当前端口 有80端口出现刚nginx安装完成。在备机上按上述安装nginx.
2.安装keepalived
在centos的源里有keepalived这个软件,这里不再采用源码安装的方式,直接
yum install keepalived -y
________________________________________
3.配置
nginx的配置正常进行,主服务器跟备机上nginx的配置要保持一致。(此处配置只供实验,且在K+N的配合中,nginx配置并无特别要求,只要主备上配置一致即可)
为了验证keepalived的效果,启动两台机器的上nginx,在Web目录下创建一个文件,index.html主备机上的文件稍有不同以区别当前生效的是哪台服务器。
nignx1: this is the master server
nginx2: this is the backup server
3.1 keepalived配置
配置文件:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vvrp_script chk_ngx { !定义脚本
script "/root/bin/chk_nginx.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP !(主:MASTER,备:BACKUP)
interface eth0
virtual_router_id 51 !(主备一致)
priority 200 !(主 > 备)
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.10.49/16 dev eth0
}
track_script { !调用脚本
chk_ngx
}
}
3.2 nginx服务检测脚本
功能很简单:
检测-->nginx进程--存活-->检测结束
|
|-->不存在nginx进程-->启动nginx-->等待-->再次检测-->存活-->检测结束
|
|-->进程不存在-->shutdown keepalived让vip漂移到备机-->结束
FN=`ps -C nginx --no-header | wc -l`
if [ $FN -eq 0 ]; then
echo stop
/etc/init.d/nginx start
sleep 2
SN=`ps -C nginx --no-header | wc -l`
if [ $SN -eq 0 ];then
echo sec-stop
/etc/init.d/keepalived stop
fi
fi
注:这个脚本有一个问题,在nginx假死,即nginx进程在,但无法正常提供http服务的情况下,无法完成杀掉keepalived使用vip漂移的功能。可采用检测http服务的方式来改善,用wget(curl)去访问80端口,正常返回结果刚正常,否则重启nginx,再次检测,如果还失败,刚杀掉keepalived进程。
code=`curl -I http://172.16.10.50/sfe | head -n 1 | awk '{print $2}'`
if [ $code != "200" ];then
/etc/init.d/keepalived stop
fi
4.启动
/etc/init.d/keepalived start
启动后执行ip add 可以看到vip已经绑定到eth0上了。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:ca:8f:b1 brd ff:ff:ff:ff:ff:ff
inet 172.16.10.50/16 brd 172.16.255.255 scope global eth0
inet 172.16.10.49/16 scope global secondary eth0
inet6 fe80::5054:ff:feca:8fb1/64 scope link
valid_lft forever preferred_lft forever
停掉主服务器的nginx,检测脚本在检测到后会先启动一次nginx,当再次检测到nginx失败的时候,杀掉keepalived进程,vip漂移到backup服务器上:
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:de:f8:42 brd ff:ff:ff:ff:ff:ff
inet 172.16.10.51/16 brd 172.16.255.255 scope global eth1
inet 172.16.10.49/16 scope global secondary eth1
inet6 fe80::5054:ff:fede:f842/64 scope link
valid_lft forever preferred_lft forever
5.应用模式
常用的为MASTER-BACKUP(可以有多个)模式,配置主备服务器大部分一致只有两个地方需要注意:
MASTER--BACKUP
主 | 备 |
priority 200 virtual_router_id 51 interface eth0 state MASTER | priority 100 virtual_router_id 51 interface eth0 state BACKUP |
在这种模式下,当主机Down之后,vip会漂移到备机,但当主机恢复重启后,vip会再次漂移回主机,但这个过程可能会发生一些预料之外的问题。既然备机已经绑定vip正常工作了,这里就可以考虑通过设置实现,主机恢复后,VIP不再自动漂移回主机,而是在备机出现故障的时候再漂移,或者是在人工维护时再漂移回主机。
BACKUP--BACKUP
主 | 备 |
priority 200 virtual_router_id 51 interface eth0 state BACKUP nopreempt | priority 100 virtual_router_id 51 interface eth0 state BACKUP |
当主机备机同时启动时,keepalived通过priority来动态决定谁作为MASTER,主机增加nopreempt项,确认主机在down机重启后不会抢占vip. 继续由备机绑定VIP提供服务。