阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

LVS基于应用层的健康状态检测

122次阅读
没有评论

共计 7589 个字符,预计需要花费 19 分钟才能阅读完成。

前因:

童鞋们众所周知 LVS 是基于第 4 层来做负载均衡调度的,默认也是基于端口来做后端服务器的健康状态检测,但公司总是出现一些后端 Real Server 如 JBOSS 假死后不服务,端口却还存活着的状况,这样导致 LVS 继续将用户的请求分发给这台宕机的服务器,结果返回给用户的却是 502,503……,当然也可以用 HAProxy 或 Nginx 做 7 层负载均衡,但是转发性能有瓶颈,这里不对产品和功能做介绍,本文主要与下面这种架构的童鞋们做交流。

LVS 基于应用层的健康状态检测脚本下载

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是 www.linuxidc.com

具体下载目录在 /2013 年资料 /10 月 /30 日 /LVS 基于应用层的健康状态检测

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

LVS 基于应用层的健康状态检测

我们的目的:

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 秒返回超时。

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

更多精彩内容请看下一页 :http://www.linuxidc.com/Linux/2013-09/92121p2.htm

相关阅读:

通过 LVS 实现 WEB 站点的 MySQL 高可用 http://www.linuxidc.com/Linux/2013-06/86390.htm

LVS+Apache+PHP+MySQL 读写分离 http://www.linuxidc.com/Linux/2012-12/77027.htm

MySQL LVS 负载均衡 http://www.linuxidc.com/Linux/2012-09/69862.htm

企业 Web 高可用集群实战之 LVS+Keepalived+MySQL HA http://www.linuxidc.com/Linux/2012-09/70097.htm

LVS 搭建高可用性 Web 负载均衡服务器 http://www.linuxidc.com/Linux/2013-02/79274.htm

使用 Linux 实现 WEB 服务的 LVS 负载均衡 http://www.linuxidc.com/Linux/2013-06/86116.htm

Nginx+Keepalived 做负载均衡器 http://www.linuxidc.com/Linux/2013-07/87982.htm

Linux 集群的基本概念与 LB(负载均衡)集群详解 http://www.linuxidc.com/Linux/2013-07/87960.htm

服务器群集及 Web 服务器负载均衡 Lvs-network 小案例 http://www.linuxidc.com/Linux/2013-05/84801.htm

#!/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 UP\Down\Check\Action 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 调度的状态和日志文件。

前因:

童鞋们众所周知 LVS 是基于第 4 层来做负载均衡调度的,默认也是基于端口来做后端服务器的健康状态检测,但公司总是出现一些后端 Real Server 如 JBOSS 假死后不服务,端口却还存活着的状况,这样导致 LVS 继续将用户的请求分发给这台宕机的服务器,结果返回给用户的却是 502,503……,当然也可以用 HAProxy 或 Nginx 做 7 层负载均衡,但是转发性能有瓶颈,这里不对产品和功能做介绍,本文主要与下面这种架构的童鞋们做交流。

LVS 基于应用层的健康状态检测脚本下载

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是 www.linuxidc.com

具体下载目录在 /2013 年资料 /10 月 /30 日 /LVS 基于应用层的健康状态检测

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

LVS 基于应用层的健康状态检测

我们的目的:

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 秒返回超时。

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

更多精彩内容请看下一页 :http://www.linuxidc.com/Linux/2013-09/92121p2.htm

相关阅读:

通过 LVS 实现 WEB 站点的 MySQL 高可用 http://www.linuxidc.com/Linux/2013-06/86390.htm

LVS+Apache+PHP+MySQL 读写分离 http://www.linuxidc.com/Linux/2012-12/77027.htm

MySQL LVS 负载均衡 http://www.linuxidc.com/Linux/2012-09/69862.htm

企业 Web 高可用集群实战之 LVS+Keepalived+MySQL HA http://www.linuxidc.com/Linux/2012-09/70097.htm

LVS 搭建高可用性 Web 负载均衡服务器 http://www.linuxidc.com/Linux/2013-02/79274.htm

使用 Linux 实现 WEB 服务的 LVS 负载均衡 http://www.linuxidc.com/Linux/2013-06/86116.htm

Nginx+Keepalived 做负载均衡器 http://www.linuxidc.com/Linux/2013-07/87982.htm

Linux 集群的基本概念与 LB(负载均衡)集群详解 http://www.linuxidc.com/Linux/2013-07/87960.htm

服务器群集及 Web 服务器负载均衡 Lvs-network 小案例 http://www.linuxidc.com/Linux/2013-05/84801.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计7589字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中