Linux下域名解析的优化

缘起

Linux系统下域名解析的配置文件是/etc/resolv.conf,这个大家都知道。估计一般的系统管理员、运维人员都知道在这里面配置上两个或更多的nameserver,以便一个挂掉后还能正常解析域名。但真的情况是这样吗?
我从某次故障说起吧,有一次,线上报大量的dns解析失败,上去看,发现是一台nameserver挂掉了,幸好/etc/resolv.conf中的另外一台没有挂,所以,还不是百分百的解析失败。从逻辑上来讲,这些失败的请求应该会去尝试另外一个(好的)nameserver的,但是重试的场景和策略是什么呢?不得而知。所以我就关注了下/etc/resolv.conf文件的配置问题。

下策

优化方案之一,就是在/etc/resolv.conf中做优化设置。优化前内容如下:

nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3

优化之后,文件内容变为:

options timeout:1 attempts:1 rotate
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3

这里大概讲下新加的几个选项的含义:

  • nameserver:dns服务器的ip地址。最多能设三个。
  • timeout:查询一个nameserver的超时时间,单位是秒。系统缺省是5,最大可以设为30。这他娘不是坑爹吗?那个应用的dns请求会允许这么长的超时时间?早tm超时出错返回了吧。所以我们这里改成最小值:1
  • attempts:这个是查询的整个都尝试一遍的次数。缺省是2,我觉得在有3台nameserver的前提下,都查询一遍就完全够了(毕竟三台中有一台能正常查出结果的概率是相当大的吧,尤其是nameserver都有监控的说)
  • rotate:这个参数的含义是随机选取一个作为首选查询的dns server。系统缺省是从上到下的,所以你该了解到为什么缺省情况下第一个nameserver的负载比第三个的大多了吧。

之所以这只是下策,是因为这种解决方案如果碰到有一台nameserver(假如是10.0.0.1)挂掉的情况下,客户端解析请求如果又恰好分到这台nameserver的时候,应用会解析超时失败的概率太高了。

中策

中策就是做nameserver的高可用,用lvs来做,做两个vip:10.0.0.4和10.0.0.5,后端real server还是指向这三台真实的nameserver:10.0.0.1、10.0.0.2和10.0.0.3,这样real server的健康状况就由lvs来维护了,这样当客户端来访问vip时,只要后端的3台不都挂掉,就一定能保证返回正确的结果。
具体的配置我就不贴了,直接用keepalived来做即可。
这个解决方案其实也挺完美的,尤其是当有现成的lvs director的时候。看了最后一策,就知道为什么这个只是中策了。

上策

这个方案是我仔细考虑后推荐的方案,尤其适用于没有现成的lvs director的环境里。这个方案的主要特点是:

  • 本机起dnsmasq,监听本地的udp 53口,用来监听来自于本地的解析请求。
  • 在dnsmasq里,将上层服务器定义为10.0.0.1、10.0.0.2和10.0.0.3。

这个方案的优点在于:

  • 本地虽然多起一个dnsmasq服务,但是仅监听127.0.0.1,所以基本不影响性能
  • dnsmasq会自己维护上游服务器的健康状况,不会把解析请求发到挂掉的上游服务器上

这个方案能够自动做dns server的故障切换,而且不引入任何外部的依赖(dnsmasq是本机跑的),几乎不影响性能,甚至于还有可能提升性能,毕竟,dnsmasq也是会做一级缓存的。所以,我认为其为上策!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc阅读 7,951评论 0 0
  • dnsmasq是什么我就不说了,请自行百度。 目前我需要使用的用途是:1.dhcp(分配一个或者多个内网ip地址)...
    dnaEMx阅读 16,503评论 0 6
  • DNS 是什么 DNS (Domain Name System), 也叫网域名称系统,是互联网的一项服务。它实质上...
    interstellar多米诺阅读 7,865评论 0 6
  • 在使用consul做docker容器服务化的过程中,使用到了dnsmasq做DNS请求转发,于是研究了下DNS协议...
    __七把刀__阅读 9,440评论 2 13
  • 14.1 引言 域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换...
    张芳涛阅读 5,909评论 0 8