暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

记一次keepalived的问题

爱可可的人生记录仪 2019-09-05
1907
因为我们的流量入口只有一台nginx,上次nfs的卡死,导致业务的全面瘫痪,因此最近在测试keepalived的高可用方案。但是,当我每次停掉master节点测试的时候,master的vip却没有得到释放,会出现backup和master同时拥有vip的神奇景象,nginx服务无法访问,也就是说并没有真正切换,高可用失败。

先看配置,backup的配置我就不放了:

    #/etc/keepalived/keepalived.conf
    vrrp_script chk_nginx {
           script "/data/scripts/nginx_check.sh"
           interval 2  #每2秒检测一次nginx的运行状态
    weight -20
    }
    vrrp_instance VI_1 {
    state MASTER
    interface eth0
        # 虚拟路由的ID号,两个节点设置必须一样
        virtual_router_id 51   
    mcast_src_ip 192.168.1.20
        # 节点优先级,值范围0~254
        priority 200         
    advert_int 1
        #nopreempt            # 非抢占模式,本次不采用   
    # 设置验证信息,两个节点必须一致
    authentication {
    auth_type PASS
    auth_pass keke
    }
    # 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
    virtual_ipaddress {
            192.168.1.25
    }
    track_script {
    chk_nginx
    }
    }
    复制

    检测脚本:

      #!/bin/bash
      #if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
      # nginx
      #    sleep 3 
      if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
              pkill -9 keepalived 
      fi
      #fi
      复制
      先简单的介绍一下keepalived,keepalived是以VRRP协议为基础实现的,简单的说,有N台提供相同服务的服务器组成一个组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master会发vrrp通告,当backup发现MASTER的优先级没自己高,或者没收到master的VRRP通告时,切换为master,同时获得vip,这样就实现高可用了。
      现在我们来看问题,当我停掉master的nginx,脚本正确执行了,master的keepalived确实退出了,backup也有了vip,但是master的vip却没有释放,curl访问拒绝,查看日志如下:
        nginx02 systemd: keepalived.service: main process exited, code=killed, status=9/KILL
        nginx02 systemd: Unit keepalived.service entered failed state.
        nginx02 systemd: keepalived.service failed.
        复制

        从这里可以简单的看到,keepalived的主进程被杀死,导致服务失败,总感觉怪怪的,再看一段正常的死亡日志。

          nginx02 Keepalived[15504]: Stopping
          nginx02 Keepalived_healthcheckers[15505]: Stopped
          nginx02 Keepalived_vrrp[15506]: VRRP_Instance(VI_1) sent 0 priority
          nginx02 Keepalived_vrrp[15506]: VRRP_Instance(VI_1) removing protocol VIPs.
          nginx02 Keepalived_vrrp[15506]: Stopped
          nginx02 Keepalived[15504]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
          复制
          这下基本可以明确了,问题出在kill -9上,我们习惯性的使用了-9这个参数,其实-9是强制性的杀死,会导致某些服务异常,虽然比较少,但总会碰到的,比如这次,只要改成-15平稳退出进程,问题就圆满解决了。
          总结一下,就是kill的一个使用小细节。使用-9前,应该先使用-15,给目标进程一个清理善后工作的机会。如果不留机会让进程完成清理工作,它们可能会留下一些不完整的文件或状态,当系统重启时,程序将无法理解这些状态。
          文章转载自爱可可的人生记录仪,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论