DNS域名輪詢業務監控
阿新 • • 發佈:2018-12-30
一、概要
大部分的DNS解析都是一個域名對應一個IP地址,但是通過DNS輪循技術可以做到一個域名對應多個IP,從而實現最簡單且高效的負載平衡,不過此方案最大的弊端是目標主機不可用時無法被自動剔除,因此做好業務主機的服務可用監控至關重要。本示例通過分析當前域名的解析IP,在結合服務埠探測來實現自動監控,在域名解析中新增、刪除IP時,無須對監控指令碼進行更改。
2、步驟
1)實現域名的解析,獲取域名所有的A記錄解析IP列表
2)對IP列表進行HTTP級別的探測
3、程式碼解析
通過dns.resolver.quer()方法獲取業務域名A記錄資訊,查詢出所有IP地址列表,再使用(在Python2中httplib模組,Python3中http.client模組 )的request()方法以GET方式請求監控頁面,監控業務所有服務的IP是否服務正常。
#!/usr/bin env python import dns.resolver import http.client iplist=[] #定義域名IP列表變數 appdomain="baidu.com" #定義業務域名 def get_iplist(domain=""): #域名解析函式,解析成功IP將被迫追加到iplist try: A = dns.resolver.query(domain,'A') #解析A記錄型別 except Exception as e: print("dns resolver error:"+str(e)) return None for i in A.response.answer: for j in i.items: iplist.append(j.address) #追加到iplist return True def checkip(ip): checkurl=ip + ":80" getcontent="" code=None conn=http.client.HTTPConnection(checkurl,timeout=5) #建立http連線物件,定義http連線超時時間(5秒) try: conn.request("GET","/",headers={"Host": appdomain}) #發起URL請求,新增http連線物件 r=conn.getresponse() getcontent=r.read(15) #獲取URL頁面前15的字元,以便做可用性校驗 code=r.code #獲取狀態碼 finally: if getcontent=="<!DOCTYPE HTML>": #獲取URL頁面的內容一般是事先定義好的,比如"HTTP2000"等 print(ip + " [OK]") elif code in [200,301,302]: #正常狀態碼 print(ip + " [OK]") else: print(ip + " [Error]") #此處可放告警程式,可以是郵件、簡訊通知 if __name__ == '__main__': if get_iplist(appdomain) and len(iplist) > 0: #條件:域名解析正確至少返回一個IP for ip in iplist: checkip(ip) else: print('dns resolver error.')
可以將此指令碼放到crontab中定時執行,在結合告警程式,這樣一個基於域名輪循的業務監控已完成。執行程式,顯示結果如下:
[[email protected] dns_python]# python simple5.py 220.181.57.216 [OK] 123.125.115.110 [OK]
從結果可以看出,域名baidu.com解析出3個IP地址,並且服務都是正常的。