转载请注明出处: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执行计划中,再结合告警程序,基本可以满足基于域名轮询的业务监控。