DNS轮循技术可以做到一个域名配置对应多个IP,这样在客户端通过访问域名的时候,实际上是随机访问到其中一个IP,从而就实现了简单高效的负载均衡,但因为这种均衡方式是无规则且DNS解析是不理会对应IP的机器是否健康的,所以常常需要做额外的嗅探,做心跳检查,以确保及时剔除不可用机器,快速响应失败。我们假定域名对应的各服务器提供的是HTTP服务。那么主要的检查过程如下:
获取域名对应的所有A记录解析的IP地址列表
对这些IP做HTTP级别的嗅探
# -*- coding: utf-8 -*-import dns.resolverimport httplibiplist = []domain = "www.example.com" # 要嗅探的域名,案例,请自行替换def getips(domain):try:A = dns.resolver.query(domain,'A') # 解析A记录类型except Exception,e:print "dns resolver gets error:"+str(e)return Falsefor i in A.response.answer:for j in i.items:iplist.append(j.address) # 将获取到的ip追加到iplist数组return Truedef checkip(ip):checkurl = ip+":80" # 假设要嗅探的目标端口是80httplib.socket.setdefaulttimeout(3) # 定义http连接的超时时间是3sconn = httplib.HTTPConnection(checkurl) # 创建连接对象try:conn.request("GET","/",headers = {"Host":domain}) # 发起请求,我们这里也假设支持GET请求方式response = conn.getresponse() # 请求返回的内容对象content = response.read(15)finally:if len(content) > 0:print ip+" is OK"else:print ip+" is NOT OK" # 针对有问题的ip,可以引入监控 警,如邮件、短信if __name__ == "__main__":if getips(domain) and len(iplist)>0:for ip in iplist:checkip(ip)else:print "dns resolver gets error"
将上述脚本放在crontab里执行,这样就可以随时监听IP对应服务器的健康情况。对有问题的服务器,在收到监控 警后,我们可以立即解决域名绑定。但注意,我们在上述的介绍中,做了一些假设,比如嗅探的是HTTP服务的80端口、可用性的定义局限于“有内容返回即为可用”等,这些都只是案例,引导思考,如果是TCP端口服务以及不同维度定义的“服务器可用”,就需要修改代码。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!