问题:

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提供服务。