Xupeng's blog

圆外之大,心向往之

使用 hosts 解析一个名字到多个 IP

之前一直以为 hosts 不支持把一个名字解析到多个 IP,因此凡是有解析到多个 IP 需求的场景,全部都使用了 DNS,偶然看 host.conf 的 man page,发现并不是这样,有些场景下仍然是可以使用 hosts 的。

使用 hosts 解析时,resolver 顺序读取 hosts 文件,返回第一条匹配记录对应的 IP,这也是我之前对 hosts 的理解,比如对于这样的 hosts 文件:

1
2
1.1.1.1 host1
1.1.1.2 host1

ping host1 会看到 1.1.1.1 这个 IP,但如果在 /etc/host.conf 中设置 multi on,虽然 ping host1 仍然只能看到 1.1.1.1 这个 IP,但 resolver 会返回 hosts 中对应于 host1 条目的所有 IP,以 Python 为例:

1
2
>>> socket.gethostbyname_ex('host1')
('host1', [], ['1.1.1.1', '1.1.1.2'])

获取到的 IP 列表顺序和 hosts 中定义的顺序一样,且是固定的,这与 Round-robin DNS 的行为仍有区别,但在有些场景下使用 hosts + 推送 + nscd 名字缓存可以获得相对于 DNS 更好的总体性能和稳定性,比如 doubanservice 客户端获取服务器列表或许就可以改为使用 hosts 替换 DNS,获得更好的性能,同时也规避了比如 tinydns 对一个名字最多只返回 8 个 IP 地址的问题。

Comments