1. 程式人生 > >DNS域名輪詢業務監控

DNS域名輪詢業務監控

一、概要

  大部分的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地址,並且服務都是正常的。