1、概要
大部分的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是否服務正常。
[root@localhost ~]# cat simple_A.py
#!/usr/bin/env python
#coding=utf-8
import dns.resolver
import os
import httplib
#定義域名IP清單變量
iplist = []
#定義目标域名
appdomain = "www.baidu.com"
#域名解析函數,解析成功IP追加到iplist
def get_iplist(domain=""):
try:
#解析A記錄
A = dns.resolver.query(domain,'A')
except Exception,e:
print "dns resolver error:" +str(e)
return
#使用responese.answer方法
for i in A.response.answer:
for j in i.items:
#追加到iplist
iplist.append(j)
return True
def checkip(ip):
#将解析的Ip轉為字元串格式,以便跟:80端口合并
oip = ('%s') % ip
checkurl = oip+":80"
getcontent = ""
#定義http連結逾時時間
httplib.socket.setdefaulttimeout(5)
#建立http連結對象
conn=httplib.HTTPConnection(checkurl)
try:
#發起url請求,添加host主機
conn.request('GET',"/",headers={"Host":appdomain})
r = conn.getresponse()
#隻擷取url頁面的15個字元,用來做可用性校驗
getcontent = r.read(15)
finally:
#監控url頁面的類型要先查清楚,在做對比,這裡<!DOCTYPE html>要大寫,也可以對比http狀态碼
if getcontent == "<!DOCTYPE html>":
print oip+" [ok]"
else:
#這裡可以放置告警程式,比如發短信,郵件等
print oip+" [error]"
if __name__ == "__main__":
#域名解析正确且至少傳回1個IP
if get_iplist(appdomain) and len(iplist) > 0:
for ip in iplist:
checkip(ip)
else:
print "dns resolver error."
複制
[root@localhost ~]# python simple_A.py
www.a.shifen.com. [ok]
14.215.177.38 [ok]
14.215.177.39 [ok]

#運作結果來看,域名www.baidu.com解析出2個IP位址,并且服務都是正常的。