認識 NSCD 服務緩存


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

參考文章

【1】Linux 下開啟緩存服務 NSCD

【2】阿里DNS: NSCD-DNS緩存詳解

【3】Linux man page


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM