今天碰到一個元數據集群因DNS緩存導致的錯誤,借機梳理一下n久以前看的DNS緩存問題。
DNS: 全稱 Domain Name System ,即域名系統。它將域名和IP地址相互映射的一個分布式數據庫,在數據庫中保存域名與IP的對照關系,從而方便地訪問互聯網。DNS協議運行在UDP協議之上,使用端口號53。
域名解析(主機名解析):通過域名,得到該域名對應的IP地址的過程。
有dns的地方,就有緩存。瀏覽器、操作系統、進程(JVM)、Local DNS、根域名服務器,都會對DNS結果做一定程度的緩存。
DNS查詢過程:
瀏覽器DNS緩存/Java DNS緩存 ---(未找到/失效)---》 操作系統的hosts文件是否有映射關系(本地DNS緩存)---(未找到/失效)---》本地DNS服務器(ISP服務器,或者自己手動設置的DNS服務器)查找---(未找到/失效)---》DNS根服務器遞歸查找(--》根DNS域名服務器---返回頂級域名服務器地址---》訪問頂級域名服務器(TLD服務器)---返回NameServer服務器地址---》返回指定域名的A記錄(指定主機名或域名的IP地址)和CNAME(別名記錄)
瀏覽器 DNS緩存
chrome://net-internals/#dns
瀏覽器訪問域名拿到實際IP地址后,會緩存,有效期1分鍾。DNS緩存時間跟DNS服務器返回的TTL值無關。
Java DNS緩存
其實是由JVM 緩存策略控制。當第一次使用某個域名創建InetAddress對象后,JVM會將域名和映射的IP地址保存在DNS緩存里。下一次直接從緩存取就可以。
JDK1.5之前,這個JVM緩存是永久保存的,即:除非重啟,否則域名后端IP改變了后,不能響應到。
之后的JDK,如果設置了security manager,永久保存,如果沒有設置,30s。
參數:
networkaddress.cache.negative.ttl=10
networkaddress.cache.ttl=-1
DNS域名解析還是好耗費CPU資源,后面會提。
操作系統 DNS緩存(hosts文件)
緩存時間會參考本地DNS服務器(ISP-電信運營商服務器)返回的TTL值,但不完全等於。
IOS每24h刷新一次DNS緩存,MAC清緩存:lookupd-flushcache。
Linux緩存:/etc/init.d/nscd restart
DNS原理
樹根:根DNS域名服務器,一共13台,不直接解析域名的IP地址,而是返回頂級域名服務器(TLD服務器)的IP地址。
頂級域名:頂級DNS服務器,每個頂級域名,都有TLD服務器集群。TLD服務器提供了權威DNS服務器的IP地址。
二級域名:權威DNS服務器,管理某個區的域名,由於域名下每個主機都必須在權威域名服務器處注冊登記,所有知道其管轄的域名和IP地址映射關系,同時,也知道其下級域名的服務器地址。
三、四級域名:本地DNS服務器,每一個因特網服務提供者lSP(如一個居民區的ISP或一個機構的ISP)都有一台本地DNS服務器。
參考:
https://blog.csdn.net/weixin_44523860/article/details/110352555
https://juejin.cn/post/6844903876974346254