1. 测试环境—高可用

两台nginx服务器,主:192.168.1.196,备:192.168.1.197
两台tomcat服务器:192.168.1.194 和 192.168.1.195
vip:192.168.1.198

nginx + keepalived实现HA部署图预览效果,如下图所示:



keepalived nginx高可用 不切换 nginx的高可用_高可用


图1-nginx + keepalived实现HA部署


  分别在nginx主服务器和nginx备服务器上部署keepalived软件,通过配置keepalived来模拟之前我们所说的三种状态:

  1. 正常状态,client通过vip发出请求时,由nginx主服务器提供服务,把请求转发到后台的tomcat服务器。
  2. 故障状态,当nginx主服务器宕机了,client通过vip发出请求时,由nginx备服务器提供服务,把请求转发到后台的tomcat服务器。
  3. 当nginx主服务器恢复时,nginx备服务器让出位置,由nginx主服务器继续提供服务。

2. 配置nginx主服务器

进入/etc/keepalived目录下,修改配置文件:

keepalived nginx高可用 不切换 nginx的高可用_服务器_02


nginx主服务器具体配置如下:

! 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 eth4         #设置实例绑定的网卡
    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.1.198       #可以多个虚拟IP,换行即可
    }
}

关于每个配置的详细介绍在前面2篇中已经说过,这里就不在赘述。




启动nginx主服务器的keepalived和nginx

./nginx
service keepalived start
tail -f /var/log/messages    #通过查看日志来判断keepalived是否启动成功

keepalived nginx高可用 不切换 nginx的高可用_服务器_03

MASTER STATE:主服务器状态
protocol VIPs::设置一个vip协议
Sending gratuitous ARPs on eth4:把192.168.1.198设置到eth4接口上
Netlink reflector reports IP 192.168.1.198 added:表示vip 192.168.1.198已经添加


3. 配置nginx备服务器

修改备nginx下/etc/keepalived/keepalived.conf文件

  注意:配置在设置nginx备服务器时state设置为BACKUP,priority的值要比MASTER低,virtual_router_id和master的值一致

! 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 BACKUP           #标示备份机状态为BACKUP
    interface eth5         #设置实例绑定的网卡
    virtual_router_id 51   #同一实例下virtual_router_id必须相同
    priority 99            #MASTER权重要高于BACKUP 比如BACKUP为99  
    advert_int 1           #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {       #设置认证
        auth_type PASS     #主从服务器验证方式
        auth_pass 8888
    }
    virtual_ipaddress {    #设置vip
        192.168.1.198       #可以多个虚拟IP,换行即可
    }
}

启动nginx备服务器的keepalived和nginx

./nginx
service keepalived start
tail -f /var/log/messages    通过查看日志来判断keepalived是否启动成功

keepalived nginx高可用 不切换 nginx的高可用_tomcat_04

到这里,基本上nginx主服务器和nginx备服务器已经配置完毕了。


4. 测试—初始状态

  通过ip add show eth4命令查看nginx主服务器的eth4网卡,发现VIP 192.168.1.198已经绑定到了eth4网卡上。

keepalived nginx高可用 不切换 nginx的高可用_nginx_05


查看nginx备服务器的eth5设置,vip没有绑定在nginx备服务器的eth5上。

keepalived nginx高可用 不切换 nginx的高可用_高可用_06

然后大家可以打开浏览器测试一下,看是否可以访问,这里,我就不测试了。


5. 主服务器宕机

  将nginx主服务器上的keepalived和nginx停止(相当于模拟服务器宕机),当通过命令service keepalived stop命令停止keepalived。

keepalived nginx高可用 不切换 nginx的高可用_nginx_07




  当keepalived停止时,我们通过命令tail -f /var/log/messages查看nginx服务器的keepalived日志打印了以下信息:

keepalived nginx高可用 不切换 nginx的高可用_tomcat_08

VRRP_Instance(VI_1) removing protocol VIPs.:VRRP实例删除了协议
Netlink reflector reports IP 192.168.1.198 removed:同时把vip 192.168.1.198删除掉了
Stopping Keepalived v1.2.13 (03/19,2015):表示keepalived已经停止了

注意这里模拟的是停止 keepalived进程没有模拟宕机,因此还需要通过将nginx停止掉。



我们再通过tail -f /var/log/message命令查看nginx备机上keeaplived的日志

keepalived nginx高可用 不切换 nginx的高可用_服务器_09

VRRP_Instance(VI_1) Transition to MASTER STATE:nginx备机的状态切换成master状态了
setting protocol VIPs.:添加了VIPs协议
Netlink reflector reports IP 192.168.1.198 added:表示VIP 192.168.1.198已经被添加了


keepalived nginx高可用 不切换 nginx的高可用_高可用_10


  通过ip add show eth5命令查看发现nginx备机上的eth5网卡上已经绑定了VIP 192.168.1.198,此时已经发生了IP漂移 。





  此时我们再访问192.168.1.198时,发现nginx备机同样可以实现把请求转发到了tomcat1和tomcat2服务器,说明keepalived确实可以实现HA高可用。

keepalived nginx高可用 不切换 nginx的高可用_服务器_11

keepalived nginx高可用 不切换 nginx的高可用_tomcat_12

到此,主服务器宕机状态的测试已经结束。


6. nginx主服务器恢复

  现在我们将nginx主服务器的nginx和keepalived启动,注意:一定要将nginx和keepalived都启动。

./nginx
service keepalived start

keepalived nginx高可用 不切换 nginx的高可用_keepalived_13

然后可以通过ps -aux | grep nginx命令查看nginx启动状态,这里不再演示了。



nginx主服务器上运行的keepalived软件日志打印了信息:

keepalived nginx高可用 不切换 nginx的高可用_高可用_14

VRRP_Instance(VI_1) Entering BACKUP STATE::nginx服务器的状态设置为了backup状态。

通过ip add show eth4查看nginx主机的eth4接口上也没有绑定VIP 192.168.1.198,即没有发生ip漂移。

keepalived nginx高可用 不切换 nginx的高可用_nginx_15

  这里肯定有很多小伙伴很奇怪,为什么nginx主机恢复了,状态却不是master,反而是backup呢,也没绑定vip呢?

  这是因为keepalived软件为了减少不必要的切换,默认开启了nopreempt属性。表示不抢占,也就是允许一个priority较低的backup竞选为master,因此nginx主机恢复了状态却成了backup的原因。需要说明的是nopreempt属性是可以手动设置为抢占或不抢占的。如果设置nopreempt为抢占的话,则nginx主机恢复时会切换回master,同时绑定VIP,即ip漂移回来。

  还有一个原因就是,如果主备机的防火墙没关闭的话,那么也不会发生主备切换,因此在做实验之前,一定要先检查防火墙是否关闭。