什么是 Round-robin DNS 负载均衡机制?
当某一域名配置了多条A类型记录集时,DNS服务器向访问者返回解析记录的顺序是随 机的,访问者所在客户端程序默认会取第一个返回的IP地址作为解析结果,从而实现 Round-robin DNS负载均衡。
问题描述
如果访问者的客户端为Linux系统,当访问配置了多条A类型记录集的域名时,操作系 统glibc中的getaddrinfo函数会对DNS服务器随机返回的解析记录进行排序,这样会导 致客户端程序一直获取同一个IP地址,从而使Round-robin DNS负载均衡机制失效。
原因分析
Round-robin DNS负载均衡机制失效的原因与RFC-3484中定义的地址排序要求有关。
RFC-3484中定义了主机名查找函数返回的IPv4地址和IPv6地址的排序机制,当DNS服 务器返回多条解析记录时,系统应该选择“最近的”IP地址。
在Linux的RHEL4.5版本中,getaddrinfo函数进行了更新,以便于符合RFC-3484中
“Internet协议版本6(IPv6)的默认地址选择”定义的地址排序要求。这种排序机制 对IPv4地址无效,导致域名解析每次都返回同一个IP地址,使Round-robin DNS负载均 衡机制失效。
我们通过以下示例查看Round-robin DNS负载均衡机制失效的过程:
1. 通过如下命令,查看eth0的网卡配置。
# ifconfig eth0
常见问题 4 公网域名解析
图4-5 查看 eth0 的网卡配置 1
从查询结果中,可以查看到eth0的IPv6地址。
2. 在“/etc/hosts”文件中加入如下DNS的解析记录。
10.0.1.1 huaweicloudtest.com 10.0.1.2 huaweicloudtest.com 10.0.1.254 huaweicloudtest.com
3. 通过ping命令,查看域名解析结果。
# ping huaweicloudtest.com 图4-6 DNS 解析结果 1
从解析结果中可以看到,返回的IP地址并不是“/etc/hosts”文件中排在第一顺序 的10.0.1.1,而是第三顺序的10.0.1.254,说明解析记录被进行了排序。
4. 在“/etc/hosts”文件中修改解析记录顺序。
10.0.1.254 huaweicloudtest.com 10.0.1.2 huaweicloudtest.com 10.0.1.1 huaweicloudtest.com
常见问题 4 公网域名解析
图4-7 DNS 解析记录 2
从解析结果中可以看到,即使将“/etc/hosts”文件中的解析记录顺序进行调换,
返回的IP地址依然是10.0.1.254。
处理方法
由于getaddrinfo函数的地址排序机制对DNS服务器返回的IPv4地址无效,因此我们通 过在客户端Linux操作系统内部禁用IPv6的方法禁止getaddrinfo函数对DNS解析记录进 行排序。
禁用IPv6的方法:
1. 编辑“/etc/sysctl.conf”文件,添加以下字段并保存退出。
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
2. 执行以下命令,使修改内容生效。
# sysctl -p
3. 验证DNS解析结果。
a. 通过如下命令,查看eth0的网卡配置。
# ifconfig eth0
图4-8 查看 eth0 的网卡配置 2
从查询结果中,可以看到已经没有eth0的IPv6地址。
b. 在“/etc/hosts”文件中加入如下DNS的解析记录。
10.0.1.1 huaweicloudtest.com 10.0.1.2 huaweicloudtest.com 10.0.1.254 huaweicloudtest.com
常见问题 4 公网域名解析
c. 通过ping命令,查看域名解析结果。
# ping huaweicloudtest.com 图4-9 DNS 解析记录 3
从解析结果中可以看到,返回的IP地址是“/etc/hosts”文件中排在第一顺序 的10.0.1.1,说明解析记录没有进行排序。
d. 在“/etc/hosts”文件中修改解析记录顺序。
10.0.1.254 huaweicloudtest.com 10.0.1.2 huaweicloudtest.com 10.0.1.1 huaweicloudtest.com
图4-10 DNS 解析记录 4
从解析结果中可以看到,返回的IP地址是“/etc/hosts”文件中调换顺序后排 在第一顺序的10.0.1.254,进一步证实了解析记录没有进行排序。
至此,解决了Round-robin DNS负载均衡机制失效的问题。