openresty DNS解析失敗name resolution failed解決方案

記一次線上問題,同一個域名,之前一直正常,在網絡部門做完網絡切割後,該域名偶爾會遇到status=503,message=“name resolution failed”,時間頻率很奇怪,基本2分鐘就會觸發。而其餘大部分都是正常200,錯誤信息如下圖。
在這裏插入圖片描述

排查過程

通過dig該域名,發現該域名與其他正常請求唯一的區別在於該域名做了2次CNAME。

首先,由於看到有時間上的規律,開始只是調整了retrans , timeout參數,即DNS的重試次數和超時時間,但經測試發現並沒什麼鳥用,依然按這個規律報503。
後來通過看源碼,分析流程,發現正常openresty會通過域名向DNS去查詢地址,若有緩存,先從緩存中直接拿IP地址。若沒有,則會去DNS查詢,這裏要提到一點。openresty默認會以4中類型的順序依次去DNS查詢,分別是LAST,SRV,A,CNAME,上一個沒查到結果,就會去執行下一種類型。

這裏需要普及下這四種類型:
1 LAST
將上次DNS解析成功的類型緩存起來,下次請求進來會直接從緩存中拿上一次成功的類型。
2. SRV
用來指定服務地址。與常見的A記錄、cname不同的是,SRV中除了記錄服務器的地址,還記錄了服務的端口,並且可以設置每個服務地址的優先級和權重。訪問服務的時候,本地的DNS resolver從DNS服務器查詢到一個地址列表,根據優先級和權重,從中選取一個地址作爲本次請求的目標地址。
3 A記錄
是用來指定主機名(或域名)對應的IP地址記錄。用戶可以將該域名下的網站服務器指向到自己的web server上。同時也可以設置您域名的二級域名。
4 CNAME
這種記錄允許您將多個名字映射到同一臺計算機。 通常用於同時提供WWW和MAIL服務的計算機。例如,有一臺計算機名爲“host.mydomain.com”(A記錄)。 它同時提供WWW和MAIL服務,爲了便於用戶訪問服務。可以爲該計算機設置兩個別名(CNAME):WWW和MAIL。 這兩個別名的全稱就是“www.mydomain.com”和“mail.mydomain.com”。實際上他們都指向“host.mydomain.com”。 同樣的方法可以用於當您擁有多個域名需要指向同一服務器IP,此時您就可以將一個域名做A記錄指向服務器IP然後將其他的域名做別名到之前做A記錄的域名上,那麼當您的服務器IP地址變更時您就可以不必麻煩的一個一個域名更改指向了 只需要更改做A記錄的那個域名其他做別名的那些域名的指向也將自動更改到新的IP地址上了。

然後,通過與公司的DNS部門溝通發現,公司內部對SRV,CNAME進行了內部解析,單獨通過該類型是查不到解析結果的。只有通過A記錄的類型請求時,纔會有結果返回。如果是查詢的初始域名,那麼會把中間的解析過程,包括在dig看到的2次CNAME也會在結果裏一起返回回來。

後來通過添加日誌,逐步分析,發現主要原因是由於網絡調整,DNS域名解析與openresty的解析邏輯有不匹配的地方。

正常使用原始域名查A記錄,直接查到3條信息,2條cname和1條a記錄。網關拿到這樣的完整記錄後,認爲原始域名是cname的,最終域名是通過A記錄找到的。緩存時,LAST保存的是cname類型。當緩存到期後,原始域名直接按cname去查了,但是雲解析又不支持按cname去查,結果就失敗了。下一次查詢重新用a記錄查又可以查到。

最終通過修改dns_order參數,將原有的LAST類型去掉,解決該問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章