设为首页 收藏本站
查看: 611|回复: 0

shell解决DNS负载均衡RS的健康检测

[复制链接]

尚未签到

发表于 2018-8-17 07:34:40 | 显示全部楼层 |阅读模式
DNS负载均衡,是最早的实现负载均衡技术的。在DNS的配置文件中为多个地址配置同一个名字,即配置多条指向不同ip的A记录,而客户端在查询这条A记录的时候将随机获得其中一个地址。通过以上描述不难发现,DNS负载均衡有着配置简单,性能优异,没有修改架构的开销等特点。因此,经常被用在内网。  说了优点,也要说说缺点。DNS负载均衡采用的是简单的轮循负载算法,不能分辨服务器的差异,不能根据后端服务器的运行状态进行动态调整,即健康检查。由于实现算法的随机性,不能为性能较好的服务器更多的分配请求,经常会出现将请求集中在某一台服务器上的现象。
  如果你负载均衡的要求很高,不如使用其他负载均衡技术来的容易,比如LVS,Nginx或者HAproxy。修改算法,不仅要看明白洋洋散散几万行源码,还要将自己的代码完美融合进去,这个成本因人而异,但肯定不是一朝一夕之功。但如果只是后端服务器的健康检测问题,使用shell脚本就可以办到。
  思路:DNS服务器通过某种机制对后端RS主机的运行状态进行判断,如果后端主机出现故障,那么DNS所要做的是修改配置文件,将问题主机从配置文件中提出并重启服务。更进一步,当RS主机恢复时,DNS主机还要将其恢复到配置文件中。
  首先是健康检测机制。如果RS主机是web服务,那么可选的至少有三个,icmp,telnet,curl分别工作在第三层,第四层,和第七层。我们在这里使用icmp。修改配置文件,可以通过将提前准备好的配置文件覆盖原文件做到,当然还有sed -i,我们在这里使用sed -i。最后使用while及if elif将这些元素合理的嵌套。
  web1 192.168.1.1     web2  192.168.1.2
  DNS配置文件:
www IN A 192.168.1.1www IN A 192.168.1.2  #! /bin/bash
  while true;do #定义无限循环,让脚本不间断工作。
  ping -c1 192.168.1.1 &> /dev/null #由于linux下的ping命令会无限进行下去,所以我们要使用-c参数指定数据包个数,并将标准错误和标准输出全部重定向到/dev/null这个脏目录中。
  if ! [ $? -eq 0 ];then #如果$?的返回值不为零,即ping不通。
  sed -i '/192.168.1.1/s/^/;/' dns #修改配置文件,将包含192.168.1.1的行开头替换成;号。(dns配置文件的注释是;号)
  /etc/init.d/bind restart
  else
  sed -i '/192.168.1.1/s/;//' dns #如果可以ping通,那么去掉;
  /etc/init.d/bind restart
  fi
  ping -c1 192.168.1.2 &> /dev/null
  if ! [ $? -eq 0 ];then
  sed -i '/192.168.1.2/s/^/;/' dns
  /etc/init.d/bind restart
  else
  sed -i '/192.168.1.2/s/;//' dns
  /etc/init.d/bind restart
  fi
  sleep 5 #休息5秒,继续工作。
  done
  如果使用以上的shell脚本,确实可以完成RS主机的高可用,但我们也会发现,如果后端主机出了问题,配置文件会在问题主机ip所在行前不断的增加;号的同时,不断的重启dns服务。这是我们不能允许的,修改后的脚本如下:
  #! /bin/bash
  caipan1=0
  caipan2=0 #定义两个裁判变量记录状态
  while true;do
  ping -c1 192.168.1.1 &> /dev/null
  state=$?
  if ! [ state -eq 0 ] && [ $caipan1 -eq 0 ];then
  sed -i '/192.168.1.1/s/^/;/' dns
  /etc/init.d/bind restart
  caipan1=1
  elif [ state -eq 0 ] && [ $caipan1 -eq 1 ];then
  sed -i '/192.168.1.1/s/;//' dns
  /etc/init.d/bind restart
  caipan1=0
  fi
  ping -c1 192.168.1.2 &> /dev/null
  state=$?
  if ! [ state -eq 0 ] && [ $caipan2 -eq 0 ];then
  sed -i '/192.168.1.2/s/^/;/' dns
  /etc/init.d/bind restart
  caipan2=1
  elif [ state -eq 0 ] && [ $caipan2 -eq 1 ];then
  sed -i '/192.168.1.2/s/;//' dns
  /etc/init.d/bind restart
  caipan2=0
  fi
  sleep 5 #休息5秒,继续工作。
  done
  caipan变量的目的只有一个,就是增加判断条件,修改配置及重启服务必须要满足双重条件才能进行,通过重置变量让条件不再满足。当然,解决办法还有很多。篇幅所限,在这里我们只给出了变量的办法,希望大家能提出更好的建议,发动集体智慧,开拓思路,写出更好脚本。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-552804-1-1.html 上篇帖子: shell中的时间值提取(date) 下篇帖子: 再谈shell之“>/dev/null 2>&1”
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表