NSCD(Name Service Cache Daemon)是服務緩存守護進程。
NSCD 安裝
-
RHEL/CentOS
yum -y install nscd
-
Debian/Ubuntu
apt-get install nscd
-
RPM
https://centos.pkgs.org/7/centos-x86_64/nscd-2.17-307.el7.1.x86_64.rpm.html
CentOS7 之后 NSCD 使用 systemd 進行管理。
NSCD 命令選項
$ nscd --help
用法: nscd [選項...]
Name Service Cache Daemon.
-d, --debug Do not fork and display messages on the current
tty
-f, --config-file=名稱 從NAME中讀取配置數據
-g, --statistics Print current configuration statistics
-i, --invalidate=TABLE Invalidate the specified cache
-K, --shutdown 關閉服務器
-t, --nthreads=NUMBER 啟動 NUMBER 個線程
-?, --help 給出該系統求助列表
--usage 給出簡要的用法信息
-V, --version 打印程序版本號
長選項的強制或可選參數對對應的短選項也是強制或可選的。
NSCD 配置文件
NSCD配置文件為/etc/nscd.conf
,NSCD程序在啟動的時候會讀取/etc/nscd.conf
文件,每一行指定一個屬性和對應的值,或者指定一個服務和對應的值,#表示注釋。有效的服務設定是:passwd, group, hosts, services, or netgroup五個。
NSCD 的緩存文件路徑默認為 /var/db/nscd/
。
NSCD 的配置文件相關參數
#設置日志文件
logfile debug-file-name
#設置debug記錄的級別,默認是0
debug-level value
#程序啟動時,等待進去請求的處理線程數,至少5個
threads number
#最大線程數,默認32
max-threads number
#nscd程序以哪個用戶運行,如果設置了該選項,nscd將作為該用戶運行,而不是作為root。如果每個用戶都使用一個單獨的緩存(-S參數),將忽略該選項。
server-user user
#哪個用戶可以請求統計用戶
stat-user user
#在一個緩存項被刪除之前允許使用的次數,默認值是5,代表SUCCESS的緩存在內存中會Reload5次
reload-count unlimited | number
#是否啟用偏執模式,啟用會導致nscd周期性重啟,默認是no
paranoia <yes|no>
#如果啟用偏執模式,設置的定期重啟nscd的時間間隔,默認是3600秒
restart-interval time
#開啟或者關閉服務緩存,默認是no
enable-cache service <yes|no>
#為成功請求的元素設置緩存TTL,單位是秒,值越大緩存命中率越高,降低平均響應時間,但會增加緩存的一致性問題
positive-time-to-live service value
#為失敗查詢元素設置緩存TTL,單位是秒,應保持小值,減小緩存一致性問題
negative-time-to-live service value
#內部的散列表大小,value應該保持一個素數以達到優化效果。默認值是211
suggested-size service value
#啟用或者禁用檢查文件是否屬於指定的服務,這些文件是/etc/passwd、/etc/group、/etc/hosts、/etc/services、/etc/netgroup等
check-files service <yes|no>
#設置緩存在服務器重啟后,仍舊能提供緩存服務,在使用偏執模式時有用,默認是no
persistent service <yes|no>
#為客戶端共享nscd數據庫在內存中做的映射,使客戶端可以直接搜索,而不用每次都查詢守護進行,默認是no
shared service <yes|no>
#該數據庫的最大大小,單位是bytes,默認是33554432
max-db-size service bytes
#此選項僅使用於passwd和group服務
auto-propagate service <yes|no>
NSCD 使用示例:對DNS進行緩存
DNS緩存在服務器上的作用
在需要通過域名與外界進行數據交互的時候,dns緩存就派上用場了,它可以減少域名解析的時間,提高效率。例如以下情況
- 使用爬蟲采集網絡上的頁面數據,
- 使用auth2.0協議從其他平台(如微博或QQ)獲取用戶數據,
- 使用第三方支付接口,
- 使用短信通道下發短信等.
開啟NSCD DNS 緩存服務的優缺點
- 優點:
- 本地緩存DNS解析信息,提供解析速度。
- DNS服務掛了也沒有問題,在緩存服務時間范圍內,解析依舊正常。
- 缺點:
- DNS解析信息會滯后,如域名解析更改需要手動刷新緩存,NSCD不適合做實時的切換的應用
- 多條RR的情況下失去輪詢功能,導致緩存周期內單機的負載均衡失效
- 域名變更生效可能持續一個TTL+15s,對於一部分講究變更快速生效的域名而言有一定的變更生效延誤
- 對於一部分異常導致解析錯誤的域名,有可能被NSCD緩存導致一段時間內解析都異常
配置DNS緩存
通過編輯/etc/nscd.conf
文件,在其中增加如下一行可以開啟本地DNS Cache
enable-cache hosts yes #這個服務除了dns緩存之外還可以緩存passwd,group,servers
完整配置如下:
$ cat /etc/nscd.conf
logfile /var/log/nscd.log
threads 5
max-threads 32
server-user nscd
debug-level 0
paranoia no
reload-count 5
enable-cache hosts yes
enable-cache passwd no
enable-cache group no
positive-time-to-live hosts 60
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
關於主動刷新
reload-count 5 默認值是5,代表SUCCESS的緩存在內存中會Reload 5次
reload的time是DNS應答TTL
+CACHE_PRUNE_INTERVAL
,reload過程中NSCD會主動發起DNS請求(非客戶端發起),如果期間發生解析結果變更會將結果主動更新至NSCD緩存。這里的CACHE_PRUNE_INTERVAL來自於相關的宏定義:
#define CACHE_PRUNE_INTERVAL 15
關於非success域名的緩存
查看代碼發現對於非success域名的緩存,NSCD會讀取配置中的negative-time-to-live hosts,將緩存一個negative-time-to-live hosts+CACHE_PRUNE_INTERVAL的時間
dataset->head.ttl = ttl == INT32_MAX ? db->negtimeout : ttl;
timeout = dataset->head.timeout = t + dataset->head.ttl;
關於緩存的RR輪詢
NSCD是直接緩存了GETHOSTBYNAME/GETHOSTBYADD的應答結果,如果存在多條RR的情況下,將只會讀取應答結果中的第一條結果作為函數的返回值。多條RR在NSCD的緩存中並沒有RR輪詢的效果,直到下一次reload更新緩存結果。這里可能導致域名原本的負載均衡機制失效。
關於CNAME+A的結果
GLIBC的GETHOSTBYNAME/GETHOSTBYADD返回的TTL中直接讀取的是A類型的TTL,代碼中並沒有針對CNAME的TTL做特殊處理,因此在有CNAME+A的級聯應答結果中,緩存的timeout將只會讀取對應的A記錄的TTL。
當DNS應答結果只有CNAME時,DNS請求將被判定為失敗,這時CNAME的TTL將不起作用,緩存的時間將遵循非success域名的timeout計算。
return ((qtype == T_A || qtype == T_AAAA) && ap != host_data->aliases
? NSS_STATUS_NOTFOUND : NSS_STATUS_TRYAGAIN);
啟動 NSCD 進程
默認該服務在Redhat或Centos下是關閉的,可以通過以下指令開啟
$ systemctl start nscd
查看進程,如下所示
$ ps aux | grep nscd
nscd 1284 0.1 0.3 708056 1580 ? Ssl 23:37 0:00 /usr/sbin/nscd
說明已經正常運行了。
NSCD服務查看和清除
NSCD緩存DB文件在/var/db/nscd
下。可以通過nscd -g
查看統計的信息,這里列出部分:
$ nscd -g
nscd 配置:
0 服務器調試級別
4s server runtime
5 current number of threads
32 maximum number of threads
0 number of times clients had to wait
no paranoia mode enabled
3600 restart internal
5 reload count
... 省略輸出信息若干 ...
hosts cache:
yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
0 used data pool size
60 seconds time to live for positive entries
20 seconds time to live for negative entries
0 cache hits on positive entries
0 cache hits on negative entries
0 cache misses on positive entries
0 cache misses on negative entries
0% cache hit rate
0 current number of cached values
0 maximum number of cached values
0 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/hosts for changes
... 省略輸出信息若干 ...
清除指定類型緩存
$ nscd -i passwd
$ nscd -i group
$ nscd -i hosts
關閉服務
$ nscd -K