Python之——实现基于域名轮询的业务监控的实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l1028386804/article/details/78965865

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/78965865

大部分的DNS解析都是一个域名对应一个IP地址,但是通过DNS轮询技术可以做到一个域名对应多个IP,从而实现最简单且高效的负载平衡,不过此方案最大的弊端是目标主机不可用时无法被自动剔除,因此做好业务主机的服务可用监控至关重要。本实例通过分析当前域名的解析IP,再结合服务端口探测实现自动监控,在域名解析中添加、删除IP时,无需对监控监本进行修改。
我们主要分为以下两个步骤实现本实例:

1)实现域名的解析,获取域名所有的记录解析IP列表
2)对IP列表进行HTTP级别的探测

具体代码如下:

# -*- coding:UTF-8 -*-
'''
Created on 2018年1月3日

@author: liuyazhuang
'''
import dns.resolver
import httplib

#定义域名IP列表变量
iplist = []
#定义业务域名
appdomain = "你的域名"

#域名解析函数,解析成功IP将被追加到iplist
def get_iplist(domain = ""):
    try:
        A = dns.resolver.query(domain, 'A')
    except Exception, e:
        print "dns resolver error: " + str(e)
        return
    for i in A.response.answer:
        for j in i.items:
            #将IP追加到列表中
            iplist.append(j.address)
    return True

#检测IP是否能够连通
def checkip(ip):
    checkurl = ip+":80"
    getcontent = ""
    #定义http连接超时时间5秒
    httplib.socket.setdefaulttimeout(5)
    #创建http连接对象
    conn = httplib.HTTPConnection(checkurl)
    
    try:
        #发起URL请求,添加host主机头
        conn.request("GET", "/", headers = {"Host" : appdomain})
        r = conn.getresponse()
        getcontent = r.read(15)
    finally:
        #监控URL页的内容一般是事先定义好的,比如 “HTTP200”等
        print getcontent
        if getcontent == "<!DOCTYPE html>":
            print ip + " [OK]"
        else:
            #此处可放告警程序,可以是邮件、短信通知
            print ip + " [ERROR]"
            
if __name__ == "__main__":   
    #条件:域名正确解析并且至少返回一个IP
    if get_iplist(appdomain) and len(iplist) > 0:
        for ip in iplist:
            checkip(ip)
    else:
        print "dns resolver error."
我们可以将此Python脚本放入crontab执行计划中,再结合告警程序,基本可以满足基于域名轮询的业务监控。

没有更多推荐了,返回首页