设为首页 收藏本站
查看: 1684|回复: 4

[经验分享] LVS基于应用层的健康状态检测

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2013-10-30 09:10:55 | 显示全部楼层 |阅读模式
前因:
童鞋们众所周知LVS是基于第4层来做负载均衡调度的,默认也是基于端口来做后端服务器的健康状态检测,但公司总是出现一些后端Real Server如JBOSS假死后不服务,端口却还存活着的状况,这样导致LVS继续将用户的请求分发给这台宕机的服务器,结果返回给用户的却是502,503......,当然也可以用HAProxy或Nginx做7层负载均衡,但是转发性能有瓶颈,这里不对产品和功能做介绍,本文主要与下面这种架构的童鞋们做交流。

232054891.jpg

我们的目的:
1,不伤害用户,尽可能的将服务器错误封杀在内部,不要暴露出50X。
2,提高服务的稳定性,向99.99%甚至5个9迈进。

我们的思路:
1,在每台RealServer的业务上放一个JAVA或者PHP可以解释的页面,如alive_test.jsp,alive_test.php,根据自己的业务类型来定。内容自定义,也可以写成功能检测的接口,我们就简单返回一个null值啦。
2,在LVS上做一个监控,每5秒去访问一次这个接口,获取返回值或者返回状态。
3,根据访问结果判断,正常不管,失败就从LVS中踢下去,恢复则自动添加进LVS。平滑上下线,控制好LVS分发请求的正确性。
4,全程日志记录,当然我们还可以增加功能,如踢下线的时候邮件提醒下Admin等等,这里就不多说了,有更多好的思路希望能分享给我学习,Thanks。

我们的做法:
好的我们在开始之前先简单说明下用到的几条命令:



ipvsadm -a -t $CTVIP:80 -r $1:80 -g -w 80
ipvsadm -d -t $CTVIP:80 -r $1:80
ipvsadm -L -t $CTVIP:80|grep $1
-a:增加一台RealServer
-d:删除一台RealServer
-L/-l:列出LVS调度表
-t: TCP的服务
-r: RealServer的IP和端口
-g:指定为DR模式
-w:权重
#----------------------------------------------------------#
curl -f --connect-timeout 2 -m 2 -H "Host:www.xxx.cn" http://$I/alive_test.jsp
显示页面访问的状态,超过2秒返回超时。

应个人写脚本的的习惯,我分成了函数和脚本两类文件,将公用的功能写成函数文件,检测脚本再引用函数文件,可以从附件中下载。这里为了方便理解,我就整合成一个脚本内容介绍,看以来内容很长,只是因为要处理的端口多,实际上功能点不多,脚本还是很简单的。


#!/bin/bash
# Name:LVS应用层健康状态检测之News
# Date:2013-10-12
# Author: 26370788@qq.com
Home=$(cd `dirname $0`;pwd)
#定义好网通和电信VIP的变量。
CTVIP=202.96.128.166
CNCVIP=221.5.88.88
#定义RealServer IP数组,如果很多建议定义成一个配置文件。
RealSVR=("192.168.16.232" "192.168.16.233" "192.168.16.234" "192.168.16.235")
#日志文件以脚本名.log保存至/var/log目录下
LogFile=/var/log/`basename $0`.log
# ==================== 为了方便日志输出,我们定义个函数,输出时带日期。
Log() {
    LogDate=$(date +"%F %T")
    echo -e "${LogDate} :     $1"  >> $LogFile
}
# -------------------- < 定义上线、下线、检测的函数
# ==================== 上线函数,当我们后端业务恢复后,将RealServer添加进电信和网通的调度中来,如果LVS中一个VIP调度更多的端口,继续在后面添加相同函数改个端口即可,我这里只有http和https。RealServer由$1参数来传递。动作完成后输出日志,以便运维人员观察运行状况。
Add_CT80() {
    ipvsadm -a -t $CTVIP:80 -r $1:80 -g -w 80 &>> $LogFile
    Log "Add $1:80 in $CTVIP:80 OK."
}
Add_CT443() {
    ipvsadm -a -t $CTVIP:443 -r $1:443 -g -w 80 &>> $LogFile
    Log "Add $1:443 in $CTVIP:443 OK."
}
Add_CNC80() {
    ipvsadm -a -t $CNCVIP:80 -r $1:80 -g -w 80 &>> $LogFile
    Log "Add $1:80 in $CNCVIP:80 OK."
}
Add_CNC443() {
    ipvsadm -a -t $CNCVIP:443 -r $1:443 -g -w 80 &>> $LogFile
    Log "Add $1:443 in $CNCVIP:443 OK."
}
# ==================== 下线函数。功能与上线函数一样,这个是后端RealServer出问题后,将RealServer从LVS调度中踢出去。
Del_CT80() {
    ipvsadm -d -t $CTVIP:80 -r $1:80 &>> $LogFile
    Log "Delete $1:80 in $CTVIP:80 OK."
}
Del_CT443() {
    ipvsadm -d -t $CTVIP:443 -r $1:443 &>> $LogFile
    Log "Delete $1:443 in $CTVIP:443 OK."
}
Del_CNC80() {
    ipvsadm -d -t $CNCVIP:80 -r $1:80 &>> $LogFile
    Log "Delete $1:80 in $CNCVIP:80 OK."
}
Del_CNC443() {
    ipvsadm -d -t $CNCVIP:443 -r $1:443 &>> $LogFile
    Log "Delete $1:443 in $CNCVIP:443 OK."
}
# ==================== RealServer检测函数,检查RealServer是否在调度中,生成一个状态值,以好给我们后面的一个动作执行函数调用。返回0表示存在,1表示不存在。
CT_Check80() {
    ipvsadm -L -t $CTVIP:80|grep $1 &> /dev/null
    [ $? -eq 0 ] && return 0 || return 1
}
CT_Check443() {
    ipvsadm -L -t $CTVIP:443|grep $1 &> /dev/null
    [ $? -eq 0 ] && return 0 || return 1
}
CNC_Check80() {
    ipvsadm -L -t $CNCVIP:80|grep $1 &> /dev/null
    [ $? -eq 0 ] && return 0 || return 1
}
CNC_Check443() {
    ipvsadm -L -t $CNCVIP:443|grep $1 &> /dev/null
    [ $? -eq 0 ] && return 0 || return 1
}
# ==================== 根据上面的状态执行动作。
#检查RealServer状态是否在调度中,如果在写输入这个RealServer已经存于与LVS调度中,否则添将其添加进调度,主要是检测RealServer接口状态OK后用。
CheckRS_OK() {
            CT_Check80 $1
            [ $? -eq 0 ] && Log "$1:80 exist lvs $CTVIP ing..." || Add_CT80 $1
            CT_Check443 $1
            [ $? -eq 0 ] && Log "$1:443 exist lvs $CTVIP ing..." || Add_CT443 $1
            CNC_Check80 $1
            [ $? -eq 0 ] && Log "$1:80 exist lvs $CNCVIP ing..." || Add_CNC80 $1
            CNC_Check443 $1
            [ $? -eq 0 ] && Log "$1:443 exist lvs $CNCVIP ing..." || Add_CNC443 $1
}
#检查RealServer状态是否在调度中,如果在则将期从调度中踢除,否则输出这个RealServer已经不存在于LVS调度中了,主要是检测RealServer接口状态失败后用。
CheckRS_NO() {
            CT_Check80 $1
            [ $? -eq 0 ] && Del_CT80 $1 || Log "$1:80 is Not exsit Lvs $CTVIP"
            CT_Check443 $1
            [ $? -eq 0 ] && Del_CT443 $1 || Log "$1:443 is Not exsit Lvs $CTVIP"
            CNC_Check80 $1
            [ $? -eq 0 ] && Del_CNC80 $1 || Log "$1:80 is Not exsit Lvs $CNCVIP"
            CNC_Check443 $1
            [ $? -eq 0 ] && Del_CNC443 $1 || Log "$1:443 is Not exsit Lvs $CNCVIP"
}
# -------------------- Define UPDownCheckAction Funcation Complete>
#-------------------- 整合功能,对业务5秒检测一次,并执行相应的函数,日志写到一个文件里,保留最多5万行。如果对多个检测业务,COPY这份文件过去然后改里面的”Host:”即可。
# ==================== Every 5s check once
while :;do
#遍历每一个RealServer,并检测它们的接口状态。如果正常,则看它是否在调度当中,如果在则输出LOG,说存在,如果不存在,则添加至调度,也就是运行CheckRS_OK函数,RealServer为“$1”,这里也就是$I的值=RealServer的IP。如果失败,则看它是否在调度,如果在,则将其踢出,如果不在则输出LOG,说已经不存于调度当中了,也就是运行CheckRS_NO 函数,将$I作为$1传给函数。
        for I in ${RealSVR};do
                if curl -f --connect-timeout 2 -m 2 -H "Host:www.xxx.cn" "http://$I/alive_test.jsp" &> /dev/null;then
                        Log "Host:www.xxx.cn http://$I/alive_test.jsp Access Success ."
                        CheckRS_OK $I
                else
                        Log "Host:www.xxx.cn http://$I/alive_test.jsp Access Failure !"
                        CheckRS_NO $I
                fi
        done
        # ==================== 日志文件保留5万行记录。
        LogCount=$(wc –l $LogFile)
        DelLog=$[$LogCount-50000]
        [ $DelLog -gt 0 ] && sed -i "1,${DelLog}d" $LogFile
        # ==================== 每5秒请求一次。
        sleep 5
done

我们放在LvsMaster和LvsSlave的后台运行了一段时间,效果不错,希望对小伙伴们有帮助,运行前一定要先装好curl哦,脚本运行后记得观察LVS调度的状态和日志文件


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-10089-1-1.html 上篇帖子: Centos 6 编译内核支持LVS-SNAT模式 下篇帖子: RHEL6中LVS实现Load Balancer 应用层 检测 健康

尚未签到

发表于 2013-11-17 14:18:25 | 显示全部楼层
女,喜甜食,甚胖!该女有一癖好:痛恨蚂蚁,见必杀之。问其故曰:这小东西,那么爱吃甜食,腰还那么细!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-12-5 15:42:41 | 显示全部楼层
人是不是总把悲伤挂在嘴边的话,到最后会把快乐忘记

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-12-17 11:58:16 | 显示全部楼层
这个世界上没有人能真正了解你,甚至你自己都不能

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-12-25 23:51:58 | 显示全部楼层
一个不成熟的外表,一颗成熟的心理。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表