nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕(dang)机,后端web服务器将无法提供服务,为了解决这个问题,需要建立一个备份机。
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
keepalived工作流程,它可以对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址),
域名会绑定到这个vip上面,vip动态绑定主备机,请求来的时候,会先到达vip,然后传到主服务器,然后传到tomcat集群上去。如下图,备份机时时刻刻会往主服务器发送心跳包,"你还活着么",当主服务器没有反馈的时候,vip会自动跳转到备用机上面,当主服务器修好后,它又会自动跳转到主服务器上。
其实keepalived切换主备机是根据keepalived自身是否宕机来切换的,如果keepalived宕机了它就切换到备份机上,所以自己写个脚本,监听nginx是否宕机,如果nginx宕机就让keepalived也宕机了,这样就实现了主备之间的切换了。

nginx主动探活 nginx主从_tomcat

高可用环境搭建:

两台虚拟机每台上面都安装一个keepalived、nginx、tomcat,并且实现tomcat反向代理
keepalived安装步骤: nginx反向代理:

配置主nginx上的keepalived:

两台虚拟机随便指定一台为主nginx,修改主nginx下/etc/keepalived/keepalived.conf文件

 

ifconfig查出来的是eth几上面的interface就写几

nginx主动探活 nginx主从_nginx主动探活_02

下面这是每行配置的意思,上面的截图是我实际配的 

 

! Configuration File for keepalived
 
#全局配置
global_defs {
   notification_email {  #指定keepalived在发生切换时需要发送email到的对象,一行一个
     XXX@XXX.com
   }
   notification_email_from XXX@XXX.com  #指定发件人
   #smtp_server XXX.smtp.com                             #指定smtp服务器地址
   #smtp_connect_timeout 30                               #指定smtp连接超时时间
   router_id LVS_DEVEL                                    #运行keepalived机器的一个标识
}
 
vrrp_instance VI_1 { 
    state MASTER           #标示状态为MASTER 备份机为BACKUP
    interface eth0         #设置实例绑定的网卡
    virtual_router_id 51   #同一实例下virtual_router_id必须相同
    priority 100           #MASTER权重要高于BACKUP 比如BACKUP为99  
    advert_int 1           #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {       #设置认证
        auth_type PASS     #主从服务器验证方式
        auth_pass 8888
    }
    virtual_ipaddress {    #设置vip
        192.168.137.129       #可以多个虚拟IP,换行即可
    }
}

修改备份机nginx下/etc/keepalived/keepalived.conf文件
配置备nginx时需要注意:需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致

nginx主动探活 nginx主从_tomcat_03

nginx主动探活 nginx主从_nginx_04

进行测试:

主备nginx都启动keepalived及nginx:
1、service keepalived start
2、./nginx

查看主nginx的eth1设置:   /sbin/ip add show eth1
vip绑定在主nginx的eth1上。

nginx主动探活 nginx主从_nginx主动探活_05

查看备nginx的eth2设置:
vip没有绑定在备nginx的eth2上。

nginx主动探活 nginx主从_nginx主动探活_06

 

把window下hosts文件把虚拟ip配置域名就可以了

nginx主动探活 nginx主从_nginx主动探活_07


通过访问虚拟ip就可以通过keepalived访问到主的nginx上,我主nginx下配置的tomcat为8080,备nginx配置的8181

nginx主动探活 nginx主从_tomcat_08

keepalived是通过查看keepalived的进程在不在来判断切换主备nginx,所以现在把主nginx的keepalived关闭掉,发现129ip已经不绑定了,我130的ip是主nginx,131ip是备nginx

nginx主动探活 nginx主从_服务器_09


发现keepalived已经移动到备nginx上了

nginx主动探活 nginx主从_tomcat_10

再访问的时候发现切换到8181tomcat了

nginx主动探活 nginx主从_nginx_11

然后把主nginx的keepalived启动,等一会儿发现keepalived又回到主nginx上了

nginx主动探活 nginx主从_nginx主动探活_05

备nginx上就没有keepalived了

nginx主动探活 nginx主从_nginx主动探活_06

现在我们要做的是当nginx主宕机的时候,切换到备nginx,但是keepalived它是通过keepalived的进程在不在来切换,所以我们需要写个脚本来监控nginx进程是否存在,如果nginx不存在就将keepalived进程杀掉。

这样就做到了当主nginx宕机时,keepalived就自动切换了。
编写check_nginx.sh脚本 进入到/etc/keepalived/目录下:
1、cd /etc/keepalived/

2、vim check_nginx.sh

#!/bin/bash
# 如果进程中没有nginx则将keepalived进程kill掉
A=`ps -C nginx --no-header |wc -l`      ## 查看是否有 nginx进程 把值赋给变量A 
if [ $A -eq 0 ];then                    ## 如果没有进程值得为 零
       service keepalived stop          ## 则结束 keepalived 进程
fi

脚本测试:

将nginx停止,将keepalived启动,执行脚本:sh /etc/keepalived/check_nginx.sh
发现当nginx关闭的时候,执行这个脚本,它就会把keepalived进程关闭,说明好用

修改主nginx的keepalived.conf,添加脚本定义检测:就是时时刻刻检查nginx是否存活,如果宕机就执行那个脚本把keepalived进程删掉。

! 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 LVS_DEVEL
}
vrrp_script check_nginx {
    script "sh /etc/keepalived/check_nginx.sh"         ##监控脚本
    interval 2                                      ##时间间隔,2秒
    weight 2                                        ##权重
}
vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 8888
    }
    
    track_script {
        check_nginx        #监控脚本
   }
 
    virtual_ipaddress {
        192.168.64.138
    }
}

回到负载均衡高可用的初始状态,保证主、备上的keepalived、nginx全部启动。
停止主nginx服务
观察keepalived日志:
tail -f /var/log/keepalived.log
发现当nginx一停止,keepalived自动关闭进程

nginx主动探活 nginx主从_nginx主动探活_14

keepalived已经切换到备机上来了

nginx主动探活 nginx主从_服务器_15

nginx主动探活 nginx主从_服务器_16

nginx主动探活 nginx主从_nginx主动探活_17