問題
公司使⽤的是阿⾥雲基礎設施,DNS解析使⽤的是境外的Akamai作為域名的DNS解析服務商。
目前有部分應⽤需要被第三⽅應⽤調⽤,同時也有主動調⽤第三⽅應⽤的需求。最近突發了很多調⽤失敗問題。
應⽤調⽤失敗:
Gitlab
拉取失敗:
故障排查
1. 在ECS上進行循環抓包并修改resolv.conf配置
抓包指令:tcpdump -i any -s 0 port 53 and host 【域名】 -C 100 -W 50 -w
/tmp/dns.pcap
參數說明:
-i:指定要過濾的⽹卡接⼝,如果要檢視所有⽹卡,可以-i any
-s: tcpdump 預設隻會截取前96位元組的内容,要想截取所有的報⽂内容,可以使⽤-s
number,number就是你要截取的報⽂位元組數,如果是 0 的話,表示截取報⽂全部内容。
-C:file-size,tcpdump 在把原始資料包直接儲存到⽂件中之前, 檢查此⽂件⼤⼩是否超
過file-size. 如果超過了, 将關閉此⽂件,另創⼀個⽂件繼續⽤于原始資料包的記錄. 新建立
的⽂件名與-w 選項指定的⽂件名⼀緻, 但⽂件名後多了⼀個數字.該數字會從1開始随着新
建立⽂件的增多⽽增加. file-size的機關是百萬位元組(nt: 這⾥指1,000,000個位元組,并⾮
1,048,576個位元組, 後者是以1024位元組為1k, 1024k位元組為1M計算所得, 即1M=1024 *
1024 = 1,048,576)。這⾥是100M
-W參數:與-C參數⼀起使⽤時,可以達到循環寫⼊⽂件的作⽤。這⾥是抓50個⽂件
-w ⽂件路徑和⽂件名 ⽤于指定儲存⽂件的路徑和名稱,沒有指定路徑預設在系統預設路
徑下;
标準預設resolv.conf标準配置:
options timeout:2 attempts:3 rotate single-request-reopen
#這條配置使得在解析域名時在所有的nameserver中進⾏ 随機 的選擇。
nameserver 100.100.x.xxx
nameserver 100.100.x.xxx
2. 頻繁執⾏git pull指令等待報錯出現
3. 确認DNS的出⼝IP位址
多次執⾏指令:dig whoami.ds.akahelp.net txt +short
"ns" "106.xx.xxx.8"
"ns" "106.xx.xxx.8"
"ns" "106.xx.xxx.7"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.7"
"ns" "106.xx.xxx.1"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.8"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.7"
4.通過雲⼚商服務端檢查發現問題原因
原因如下:
a. ⾸先阿⾥雲的DNS服務沒有緩存
b. 當⽤戶或應⽤發起域名解析後
c. 如果阿⾥雲DNS伺服器⾥有請求過的位址且TTL時間未過期的話就直接傳回結果
d. 否則阿⾥雲DNS伺服器将去境外Akamai去請求解析記錄,但由于從國内到境外的⽹絡
波動會導緻部分請求失敗
臨時解決方案
在⻓期解決⽅案未落地前我們使⽤了2個臨時解決⽅案。
1. 如果是A記錄的通過臨時綁定Hosts解決
2. 如果是CNAME記錄或其它的則使⽤阿⾥雲的Private Zone臨時内⽹DNS解析服務解決
長期解決方案
為了能⻓期解決這個問題,我們還是準備把域名解析服務放到阿⾥雲的雲解析上。保證國内通路沒有問題。同時應⽤也要做兩個變更:
1. 要設定調⽤失敗的重試機制,⽐如失敗後重試3次每次間隔3秒
2. 要設定重試後任然失敗的補償機制,這個需要業務負責⼈去制定具體的補償規則