背景

    由于某些场景,我们有时需要配合数据中心的规划建设,以及DNS服务器本身的维护切换,有时候集群内的DNS服务器IP地址会发生变化。而Linux系统则需要配合更新系统的/ect/resolv.conf文件,以适应这个变化。

   实践中证明,对于部分进程,/etc/resolv.conf文件的更改不会立马生效,而需要进程重启后才会生效。


问题定位:

    在sourceware.org找到类似案例(见参考bugs),是由于开源库glibc的设计导致。并提议采用nscd解决。


测试一:

  环境:系统:CentOS 6

    新DNS地址:10.10.10.3、10.10.10.4,把域名abc.nb.local解析到新服务器:10.10.10.11

    旧DNS地址:10.10.10.1、10.10.10.2,把域名abc.nb.local解析到旧服务器:10.10.10.10

1、

部署受影响客户端程序到测试服务器 -> 修改测试服务器resolv文件指向旧DNS地址 -> 启动客户端服务 -> 观察服务器日志出现在旧服务器 -> 再次修改测试服务器resolv文件指向新DNS地址 -> 观察服务器日志出现在旧服务器

部署受影响客户端程序到测试服务器 -> 修改测试服务器resolv文件指向旧DNS地址 -> 启动scheduler客户端服务 -> 安装nscd服务并启动 -> 观察scheduler服务器日志出现在旧服务器 -> 再次修改测试服务器resolv文件指向新DNS地址 -> 观察服务器日志出现在新服务器(2分钟内)


测试二:

  环境:系统:RHEL 5 

  resolv文件已经更改成新DNS地址,但在旧DNS服务器任然看到主机A,主机B有查询。


  主机A安装nscd服务并启动 -> 观察旧dns服务器仍有查询并持续 -> 主机A root用户运行nscd -i hosts ->  观察旧dns服务器查询停止


  主机B安装nscd服务 -> 更新nscd 的hosts相关配置如下 -> 18:38启动nscd服务 -> 观察旧dns服务器仍有查询 -> 18:39 观察旧dns服务器查询停止 

enable-cache hosts yes
positive-time-to-live hosts 30
negative-time-to-live hosts 20
suggested-size hosts 211
check-files hosts yes
persistent hosts yes
shared hosts yes
max-db-size hosts 33554432


方案总结:

    nscd服务确实能够解决Linux进程对系统配置更新无感知的问题,从而免去重启进程以重新初始化resolv信息之苦。使用的过程中有以下技巧:

    nscd在服务启动后,会对resolv.conf文件进行检测。若有变更,会自动更新系统配置。

    即使resolv.conf文件的更新先于nscd服务的启动,nscd任然会在TTL超时后刷新系统配置。

    命令nscd -i hosts能够达到手动刷新的目的。


后记:

需要澄清两点:

    1、进程初始化时缓存的是系统配置,而不是DNS记录。因此次案例中nscd刷新的是系统进程所指向的DNS服务器,DNS记录仍然是由所指向的DNS服务器决定。

    2、nscd可以监控的文件不单止是/etc/resolv.conf,还有/etc/passwd,/etc/hosts 


    注意:新的DNS记录会根据nscd服务的配置由nscd进行缓存。因此,nscd服务可能会引起系统对dns服务器记录更新发现的延迟。当然手动刷新,或者采取调低TTL时间、缓存空间等的配置手段可以起到减轻影响的目的。


glibc和libc只在进程启动时初始化系统配置这个bug在2005年已经提出,但到目前任然没有被修复,因此可以推断RHEL 7 同样存在此问题。


最后要注意两点:

    1、对于nsswitch.conf内配置非标准模块,即使nscd服务在运行,也不会监控其变更。需要nscd -i 命令手动刷新

    2、nscd的系统配置刷新功能会出现延迟,除非系统更新glibc到2.9或以上版本,或系统支持inotify接口(可通过以下命令检查):

# sysctl fs.inotify
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_watches = 8192
fs.inotify.max_user_instances = 128

 

 

参考:

http://linux.die.net/man/8/nscd

https://sourceware.org/bugzilla/show_bug.cgi?id=984

https://sourceware.org/bugzilla/show_bug.cgi?id=18279

https://sourceware.org/bugzilla/show_bug.cgi?id=3675