背景
由于某些场景,我们有时需要配合数据中心的规划建设,以及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