Total Pageviews

Saturday 27 October 2012

getaddrinfo()与DNS轮询


在使用libcurl访问一个做了DNS轮询的域名,发现“十分”地不均衡,并且就像libcurl有智能一样,总是选择跟自己在同一机房的IP访问。
经过分析发现:libcurl和 wget都使用了glibc提供的 getaddrinfo()来解析域名的IP地址。RHEL5(应该其它版本也如此)系统上glibc 实现的getaddrinfo函数,遵循了RFC3484第三章第九条规则对于解析地址排序的 规定,即解析出来的IP地址依照与发起请求的源地址的最长匹配前缀排序。简单的说,与发起请求的机器在同一个子网的IP会被优先选取。
要解决这个问题,可以通过/etc/gai.conf来改变getaddrinfo函数的行为。
man gai.conf查询详细信息。
这里有一程序,可以测试getaddrinfo()与gethostbyname()时解析的命中情况,可用于测试、观察这个现象。