resolv.conf 的超时(timeout)与重试(attempts)机制

一、背景

/etc/resolv.conf 有两个默认的值至关重要,一个是超时的 timeout,一个是重试的 attempts,默认情况下,前者是 5s 后者是 2 次。
这个估计很多工程师都不是很在意,一般情况下,使用默认的值倒没什么大问题,特殊情况我会在最后说明。

要测试,不要使用 dig, host, nslook 这类工具,因为他们并没有调用 resolver 的库,可以使用 getent 来测试。上面提到的只是一些诊断的工具,对于日常的应用来说,包括 web server、mail client、db 以及各种 app server 等等,任何使用 glibc resolver 都需要经过 resolv.conf 文件。

对于 libresolv 来说,只认 resolv.conf 的前三个 nameserver,所以写的再多也没什么意义。正常情况下,resolver 会从上至下进行解析,每个 nameserver 等待 timeout 的时间,如果一直到第三个都没结果,resolver 会重复上面的步骤 (attempts – 1) 次。

默认情况下是 5s 超时,我做了两个简单的测试,把 resolv.conf 的前三个 nameserver 全部换成不存在的 1.1.1.1, 2.2.2.2, 3.3.3.3,然后可以观察下面 strace 跟踪的结果,对于 ping 以及 getent 来说,已经算是上层的应用结果了。

strace -t getent hosts baidu.com 
strace ping baidu.com

对于生产有什么意义了?
对于任何的代码,不管何种形式的(HTTP 的也好,DB 的连接也罢),只要是一端对另外一端的连接,都应该加上超时重试以及异常处理的。上面其实一共涉及三个点:

  1. 超时,目前绝大多数的 API 都支持这类参数,包括我们线上用的 grequestsMySQLdb 等等
  2. 重试,对于代码层面同样重要,跟上面类似
  3. 异常处理,好的代码对于无法连接或者连接超时等问题应该及时的抛出异常打 log,而不是什么都没有,否则会加大问题定位的工作量,后期维护起来也会异常的麻烦。

这里有个有意思的脚本能检测最佳的 DNS。

最后,记得 dig, nslook 只会解析 resolv.conf 的内容,而不会解析 hosts 里面内容,所以如果想让 dig 解析 hosts 里面的内容,可以通过 dnsmasq 实现。

二、nsfailover 安装使用

安装
sudo curl -q https://raw.github.com/kvz/nsfailover/master/nsfailover.sh -o /usr/bin/nsfailover.sh && sudo chmod +x $_

配置

nsfailover通过环境变量进行配置。这里是他们的默认值:

LOG_LEVEL="6"         # 7 = debug, 0 = emergency
NS_1=""         # Primary Nameserver (172.16.0.23 for Amazon EC2). You need to set this yourself
NS_2="8.8.8.8"        # Secundary Nameserver: Google
NS_3="4.2.2.2"        # Tertiary Nameserver: Level3
NS_ATTEMPTS="1"       # http://linux.die.net/man/5/resolv.conf
NS_ENABLE="no"        # Set to no to disable
NS_FILE="/etc/resolv.conf" # Where to write resolving conf
NS_SEARCH=""          # Domain to search hosts in (compute-1.internal for Amazon EC2)
NS_TESTDOMAIN="google.com" # Use this to determine if NS is healthy
NS_TIMEOUT="3"        # http://linux.die.net/man/5/resolv.conf
NS_WRITEPROTECT="no"  # Use this to write-protect /etc/resolv.conf

修改NS_ENABLE=”no” 为 NS_ENABLE=”yes”

sed -i 's/NS_ENABLE="no"/NS_ENABLE="yes"/' nsfailover.sh

例子:

crontab -e
* * * * * NS_1=223.6.6.6 nsfailover.sh 2>&1 |logger -t cron-nsfailover

查看/var/log/messages,如下信息

Aug 24 14:52:01 nginx01-7-21 cron-nsfailover: 2017-08-24 06:52:01 UTC [     info] Best nameserver is primary (223.6.6.6)
Aug 24 14:52:01 nginx01-7-21 cron-nsfailover: 2017-08-24 06:52:01 UTC [     info] No need to change /etc/resolv.conf

参考地址:

https://github.com/kvz/nsfailover

http://jaseywang.me/2015/01/02/resolv-conf-%E7%9A%84%E8%B6%85%E6%97%B6timeout%E4%B8%8E%E9%87%8D%E8%AF%95attempts%E6%9C%BA%E5%88%B6/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: resolv.conf.bak是一个备份文件,通常是在修改resolv.conf文件之前自动创建的。如果修改后的resolv.conf文件出现问题,可以使用resolv.conf.bak文件恢复原始设置。 ### 回答2: resolv.conf.bak是一个文件名的后缀,通常是在Linux系统中的网络配置文件resolv.conf备份文件的命名方式。resolv.conf是一个系统文件,用于指定DNS服务器的IP地址和域名解析的顺序。 在Linux系统中,当我们对网络配置进行更改时,往往会对resolv.conf文件进行编辑,以设置系统在进行域名解析时使用的DNS服务器。系统根据resolv.conf文件中的配置顺序依次查询DNS服务器,直到找到可以解析域名的DNS服务器为止。这个文件非常重要,因为它决定了系统在何处查找域名的IP地址。 然而,由于网络配置可能会发生变化,我们可能需要备份原始的resolv.conf文件,以便在出现问题时可以恢复到先前的配置。在这种情况下,我们可以使用.resolv.conf.bak作为resolv.conf文件的备份文件名。 一旦我们对resolv.conf文件进行编辑并保存,系统会自动生成.resolv.conf.bak作为备份文件。这样,即使我们在编辑resolv.conf时出现错误或配置失败,我们仍然可以恢复到先前的配置状态。 当我们需要恢复到先前的网络配置状态时,只需将.resolv.conf.bak文件更名为resolv.conf,并覆盖掉原始的resolv.conf文件即可。 总之,resolv.conf.bak是resolv.conf文件的备份文件名后缀,用于存储原始网络配置的备份,以便在需要时进行恢复。 ### 回答3: resolv.conf.bak是一个备份文件,通常用于存储resolv.conf文件的副本。resolv.conf文件是用于配置系统的DNS解析器的文件,其中包含了DNS服务器的信息。当我们在配置系统的网络设置时,会经常修改resolv.conf文件来指定DNS服务器的地址。而resolv.conf.bak文件则是保存了resolv.conf文件的上一个版本,以便在修改或删除resolv.conf文件后,可以通过恢复resolv.conf.bak文件来还原之前的配置。 resolv.conf.bak文件的存在可以帮助我们在修改resolv.conf文件时防止意外的错误。如果在修改resolv.conf文件时不小心犯了一个错误导致系统无法正常使用网络,我们可以通过将resolv.conf.bak文件重命名为resolv.conf来还原到之前的配置,以解决问题。 因此,resolv.conf.bak文件可以看作是一个系统配置文件的备份,旨在提供在系统配置修改出错时的回滚选项。当我们要对系统的DNS配置进行更改时,建议首先创建resolv.conf.bak文件,以便在需要时可以方便地还原到之前的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值