DNS域名轮询业务监控
大部分的DNS解析都是一个域名对应一个IP地址,但是通过DNS轮询技术可以做到一个域名对应多个IP,从而实现最简单高效的负载均衡,不过此方案最大的弊端是目标主机不可用时无法被自动剔除,因此做好业务主机的服务可用性监控至关重要。本示例通过分析当前域名的解析IP,在结合服务端口探测来实现自动监控,在域名解析中添加、删除IP时,无需对监控脚本进行修改,实现架构如下所示:
步骤:
1、实现域名解析,获取域名所有的A记录解析IP列表;
2、对IP列表进行HTTP级别的探测
1 #!/usr/bin/evn python 2 # --*-- coding: utf-8 --*-- 3 # Auther : Liu WeiDong 4 5 import dns.resolver 6 import http.client 7 8 iplist = [] #定义域名IP列表变量 9 appdomain = "www.baidu.com" #定义业务域名 10 11 def get_iplist(domain): #域名解析函数,解析成功IP将追加到iplist中 12 try: 13 A = dns.resolver.resolve(appdomain,'A') #解析A记录类型 14 except Exception as e: 15 print('dos resolve error:'+str(e)) 16 for i in A: 17 iplist.append(i) # 追加到iplist列表中 18 return True 19 20 def checkip(ip): 21 checkurl = str(ip) 22 getcontent = "200" 23 conn = http.client.HTTPConnection(checkurl, 80) #初始化一个http链接 24 try: 25 conn.request("GET","/") #指定request请求的方法和请求的链接地址 26 res = conn.getresponse() #得到返回的http response 27 finally: 28 if getcontent == res.status: #获取请求的状态码 29 print(str(ip) + " " + res.reason) 30 else: 31 print(str(ip) + " " + str(res.reason)) 32 33 if __name__ == "__main__": 34 if get_iplist(appdomain) and len(iplist) > 0: 35 for ip in iplist: 36 checkip(ip) 37 else: 38 print("dns resolver error....")
不积跬步,无以至千里;不积小流,无以成江海。