1. 原理
    keepalived 可以给指定网卡设置一个额外的虚拟IP,并且这个VIP,会更具keepalived的存活情况选择合适活跃的keepalived节点。
    比如有两台主机,他们上都装有keepalived,他们可以指定一个集群ID,他们都可以给自己所在的节点的某个网课设置同一个虚拟IP。同一时间这个虚拟IP只会映射到一台主机。如果这个 虚拟IP指向的主机所在节点的keepalived挂了,那么别的keepalived节点中的一个就会把这个虚拟IP指向自己的节点。
  2. nginx 安装
    centos7安装nginx: 
  3. keepalived安装
    centos7安装keepalived和双活主机配: 
  4. keepalived的配置
    /ect/keepalived/keepalived.conf文件内容(主节点)
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id vm200
}



#检查nginx的脚本,这脚本需要定义在调用之间,否者会找不到
vrrp_script chk_nginx{
     script "/usr/checknginx.sh"       #监控脚本
     interval 2                        #监控脚本检测周期秒
     weight  10
     rise 2                             #表示需要连续成功2次才能认为是成功的
     fall 2                             #表示需要连续失败2次才能认为是失败的
     timeout 2                          #脚本检测超时时间,超过这个时间则认为检测失败
}

#定义实例
vrrp_instance VI_101.250 {
    state BACKUP                   //我们想用非抢占式,所有都设置为BACKUP
    interface ens33
    virtual_router_id 166          //路由ID(路由的集群ID,ID相同是一组),主从要一直
    priority 100				  //优先级,主比从高,非抢占模式下,实际是那个先启动就默认用的那个
    advert_int 1
    nopreempt                     //非抢占式
    authentication {              //主从识别认证,参数一样就能通过
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.100.250           //vip
    }
    #指定追踪脚本
    track_script {
        chk_nginx                //检查nginx的 脚本和周期参数
    }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.

/ect/keepalived/keepalived.conf文件内容(从节点)

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id vm200
}



#检查nginx的脚本,这脚本需要定义在调用之间,否者会找不到
vrrp_script chk_nginx{
     script "/usr/checknginx.sh"       #监控脚本
     interval 2                        #监控脚本检测周期秒
     weight  10
     rise 2                             #表示需要连续成功2次才能认为是成功的
     fall 2                             #表示需要连续失败2次才能认为是失败的
     timeout 2                          #脚本检测超时时间,超过这个时间则认为检测失败
}

#定义实例
vrrp_instance VI_101.250 {
    state BACKUP            //我们想用非抢占式,所有都设置为BACKUP
    interface ens33
    virtual_router_id 166  //路由ID(路由的集群ID,ID相同是一组)
    priority 80 
    advert_int 1
    nopreempt              //非抢占式
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.100.250      //vip
    }
    #指定追踪脚本
    track_script {
        chk_nginx
    }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  1. 插件nginx是否活着的脚本
    这个脚本里面检查nginx如果死了,尝试启动nginx,如果起不来,就会把当前节点的keepalived杀了,这样就会触发VIP的飘逸,VIP就会指向活着的节点
    /usr/checknginx.sh
#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
    systemctl start nginx
    sleep 1
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        systemctl stop keepalived
    elif [ `ps -C keepalived --no-header |wc -l` -eq 0 ];then
        systemctl restart keepalived
    fi
fi
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  1. 需要注意的是,如果nginx启动后需要重启keepalived,才能继续保持高可用。