您的位置:首页 > 运维架构 > Linux

一次故障记录keepalived配置疏忽导致的故障

2017-10-08 00:13 513 查看
负载均衡keepalived+lvs

负载nginx

应用tomcat

nginx负载通过公网,每一台nginx都负载了多聊链路到后端应用,突然部分客户无法访问业务,负载均衡没有问题,部分nginx服务器到后端应用超时,nginx日志中报出错误;但是keepalived配置为

TCP_CHECK {

            connect_timeout 3 

            nb_get_retry 3

            delay_before_retry 3 

            connect_port 8080

            bindto <ip>   

          }

检测是nginx服务是否异常,并未考虑到nginx到应用可能出现无法连接情况,所以导致keepalived没有将故障nginx踢出集群;立即手动将故障机nginx停掉,使keepalived将故障nginx踢出集群。后期修改keepalived配置文件将TCP_CHECK修改为

HTTP_GET {

    url{ 

         path /

         status_code 200 

        }

通过url返回值,判断该链路是否正常,如果出现异常,keepalived自动将故障机踢出集群。

1、keepalived原理

keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web 服务器的状态。 Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

   Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器

   发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。

   Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

   Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

 vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。

2、配置文件

global_defs {

   notification_email {  #指定keepalived在发生切换时需要发送email到的对象,一行一个

    sysadmin@fire.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc #指定发件人

   smtp_server localhost #指定smtp服务器地址

   smtp_connect_timeout 30 #指定smtp连接超时时间

   router_id LVS_DEVEL #运行keepalived机器的一个标识

}

vrrp_sync_group VG_1{ #监控多个网段的实例

group {

inside_network #实例名

outside_network

}

notify_master /path/xx.sh #指定当切换到master时,执行的脚本

netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本

notify_fault "path/xx.sh VG_1" #故障时执行的脚本

notify /path/xx.sh 

smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知

}

vrrp_instance inside_network {

    state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决



    interface eth0 #设置实例绑定的网卡

    dont_track_primary #忽略vrrp的interface错误(默认不设置)

    track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换

    eth0

    eth1

    }

    mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip

    garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求

    virtual_router_id 50 #VPID标记

    priority 99 #优先级,高优先级竞选为master

    advert_int 1 #检查间隔,默认1秒

    nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高

    preempt_delay #抢占延时,默认5分钟

    debug #debug级别

    authentication { #设置认证

        auth_type PASS #认证方式

        auth_pass 111111 #认证密码

    }

    virtual_ipaddress { #设置vip

        192.168.202.200

    }

}

virtual_server 192.168.202.200 23 {

    delay_loop 6 #健康检查时间间隔

    lb_algo rr  #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh

    lb_kind DR  #负载均衡转发规则NAT|DR|RUN

    persistence_timeout 5 #会话保持时间

    protocol TCP #使用的协议

    persistence_granularity <NETMASK> #lvs会话保持粒度

    virtualhost <string> #检查的web服务器的虚拟主机(host:头)    

    sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用

real_server 192.168.200.5 23 {

            weight 1 #默认为1,0为失效

            inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除 

            notify_up <string> | <quoted-string> #在检测到server up后执行脚本

            notify_down <string> | <quoted-string> #在检测到server down后执行脚本

            

TCP_CHECK {

            connect_timeout 3 #连接超时时间

            nb_get_retry 3 #重连次数

            delay_before_retry 3 #重连间隔时间

            connect_port 23  健康检查的端口的端口

            bindto <ip>   

          }

HTTP_GET | SSL_GET{

    url{ #检查url,可以指定多个

         path /

         digest <string> #检查后的摘要信息

         status_code 200 #检查的返回状态码

        }

    connect_port <port> 

    bindto <IPADD>

    connect_timeout 5

    nb_get_retry 3

    delay_before_retry 2

}

SMTP_CHECK{

    host{

    connect_ip <IP ADDRESS>

    connect_port <port> #默认检查25端口

    bindto <IP ADDRESS>

         }

    connect_timeout 5

    retry 3

    delay_before_retry 2

    helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选

}

MISC_CHECK{

    misc_path <string> | <quoted-string> #外部脚本路径

    misc_timeout #脚本执行超时时间

    misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,

检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2

}

    }

本文出自 “运维基础
博客,请务必保留此出处http://phospherus.blog.51cto.com/7824598/1861662
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 备份