記一次驚心動魄的 DNS 緩存引發(fā)的慘案
時間 2015 年的某個周六凌晨 5 點,公司官方的 QQ 群有用戶反饋官網(wǎng)打不開了,但有的用戶反饋可以打開,客服爬起來自己用電腦試了一下沒有問題,就給客戶反饋說,可能是自己網(wǎng)絡(luò)的問題,請過會在試試。
但是到了早上點 8 點,越來越多的用戶反饋官網(wǎng)無法打開,并且有部分用戶開始反饋 App 也打不開了,客服打電話叫起了還在夢鄉(xiāng)中的我。
分析定位
被客服叫起來之后,我一臉懵逼,不知道什么情況。然后給客服回復(fù),知道了,立刻排查,待會有消息及時溝通。
用涼水洗了一把臉清醒了一下,立刻根據(jù)經(jīng)驗回憶這兩天生產(chǎn)投產(chǎn)的情況:上線了 XX 模塊,不影響;修復(fù)了 XXBug,應(yīng)該也不影響;剛給服務(wù)器配置了 https,看起來好像有點關(guān)系,但是 App 暫時沒有投產(chǎn) https,不會出現(xiàn)問題,排除之。
打開電腦核查了最近的投產(chǎn)記錄應(yīng)該都不至于發(fā)生這么嚴重的問題,隨之懷疑是不是網(wǎng)絡(luò)方面有問題,立刻打電話叫起來運維經(jīng)理以及相關(guān)人等一起排查。
一邊讓網(wǎng)絡(luò)和運維排除問題,一邊再次核查了 Web 服務(wù)器、數(shù)據(jù)庫服務(wù)器、業(yè)務(wù)日志、數(shù)據(jù)庫日志,以及其它的一些監(jiān)控數(shù)據(jù),各項皆正常。
試著在本機 ping 了一下域名確實不通,更加懷疑是網(wǎng)絡(luò)問題,嘗試著直接使用外網(wǎng)訪問,可以打開沒有問題,可以基本確認服務(wù)沒有問題,但運維部反饋網(wǎng)絡(luò)設(shè)備什么都正常,肯定是你們投產(chǎn)代碼出問題了,各方硬著頭皮繼續(xù)在排查。
9 點,群里開始有大規(guī)模的用戶反饋官網(wǎng)和 App 都打不開了,更有部分用戶煽動,XXX 公司跑路了(2015 年很多 P2P 公司跑路,導(dǎo)致用戶都成了驚弓之鳥,稍微有問題便害怕公司跑路,個個都鍛煉成了監(jiān)控高手,天天看,實時刷,凌晨起來尿尿也都順便看一下 App 上的今日收益),客服 400 熱線基本被打爆了。
一邊繼續(xù)排查問題,一邊上報此問題給總監(jiān)、公司各高管,給客服建議,給用戶解釋,IDC 機房網(wǎng)絡(luò)抖動,技術(shù)正在緊急解決,資金和數(shù)據(jù)都沒有任何影響,稍安勿躁。
10 點,開發(fā)和運維反復(fù)的檢查后,開始懷疑 DNS 解析有問題,但具體是什么問題還不清楚。
于是 CTO 決定:
- 大家都打車往公司走,來公司集體解決。
- 在各 QQ 群、微信群給用戶群發(fā)解釋 xxx 問題,安撫客戶。
在車上的時候重新梳理了一下用戶的整個訪問流程,如下圖:
到公司后,根據(jù)這個思路大家在一起驗證了一下,通過外網(wǎng) IP 和內(nèi)網(wǎng) IP 訪問公司所有服務(wù)都正常,但是通過域名訪問不行,另外監(jiān)控服務(wù)器、防火墻、網(wǎng)絡(luò)設(shè)備日志都正常,因此斷定是 DNS 解析出現(xiàn)問題。
攻堅問題
既然確實是 DNS 解析問題,那么問題又來了?為什么 DNS 解析會出現(xiàn)問題?如何去解決這個問題?
一邊給萬網(wǎng)提工單,我們也自己測試一下電信、移動、聯(lián)通在不同的網(wǎng)絡(luò)運營商下面的訪問情況,發(fā)現(xiàn)只有在聯(lián)通網(wǎng)絡(luò)的環(huán)境下 DNS 解析不了。
根據(jù)客服得到的反饋也驗證了這個情況,電信和移動用戶反饋很少,聯(lián)通用戶反饋最多。
于是我們又開始給聯(lián)通打電話,剛開始聯(lián)通不受理我們的這個請求,于是又開始以用戶的身份打電話給聯(lián)通公司讓立刻解決不能上網(wǎng)的問題。
于是就開始了萬網(wǎng)和聯(lián)通的扯皮大戰(zhàn),萬網(wǎng)說從他們那邊查看 DNS 解析都正常,一切指標都正常。我們又給聯(lián)通打電話,聯(lián)通說我們已經(jīng)知道了,待會由專業(yè)的人給我們回復(fù)。
過了一會聯(lián)通的網(wǎng)絡(luò)工程師回復(fù)說,像這種情況一般都是域名解析的問題。早上 10:30 到公司開始短短的 6 個小時內(nèi),我們幾個輪流給聯(lián)通公司合計共打了近 50、60 通電話,給萬網(wǎng)提了 N 個工單,接了 N 個電話。
期間領(lǐng)導(dǎo)也開始動用各種關(guān)系,聯(lián)通內(nèi)部的朋友、網(wǎng)絡(luò)運維界的大拿幫忙來定位解決,我們也嘗試了很多的辦法。
比如,使用 ipconfig/flushdns 命令清除本機的 DNS 緩存、在萬網(wǎng)的官網(wǎng)把 DNS 解析重新更新一遍、刪除再重新添加等等,也不是完全沒有收獲。
我們一直想找一個可以測試各個地方、運營商網(wǎng)絡(luò)的辦法,終于在各方推薦和搜索的情況下找了 17ce 和 360奇云測 兩個網(wǎng)站,感覺非常實用。
在以后的網(wǎng)絡(luò)定位中,成了我必備使用的工具,可以非常方便的監(jiān)控各個運營商、各個地區(qū)網(wǎng)站的訪問通不通、訪問的速度快不快等問題,截圖如下:
我們也發(fā)現(xiàn),公司的其它域名也都訪問正常,就是官網(wǎng)的這個域名和相關(guān)的子域名不通。
期間很多人都問了一個問題就是你們的域名有沒有忘了繳費,剛開始大家也問了運維這邊說是沒有這個問題,直到中午 12:30 的時候在我們再三的追問下才說 8 點多的時候登錄上萬網(wǎng)的時候顯示這個域名是欠費狀態(tài),但是他已經(jīng)立刻把費用補了上去了。
哎呀!差點把我們氣死,問了不是域名到期有提示的嗎?才知道因為上一個運維經(jīng)理走后,他們沒有及時的更新萬網(wǎng)的電話和郵箱,導(dǎo)致提示郵件和短信也沒有收到。
通過和萬網(wǎng)、聯(lián)通公司、領(lǐng)導(dǎo)的相關(guān)朋友溝通以及我們的測試觀察,初步明白了這個事情的原因:域名忘記繳費導(dǎo)致萬網(wǎng)的 DNS 解析被停止,用戶本機或者 DNS 服務(wù)器有緩存,所以部分用戶可以訪問,部分用戶不能訪問。
繳費過后,萬網(wǎng)的 DNS 已經(jīng)進行了更新和推送,但是 DNS 解析有很多的層級需要一級一級的往下面發(fā)送更新,有的層級并沒有更新到,導(dǎo)致部分沒有更新到的 DNS 服務(wù)商下面的用戶不能訪問官網(wǎng)。
和萬網(wǎng)進行了溝通,問最延遲的情況所有的 DNS 更新到***的時間,回答是 48 小時內(nèi)肯定都會好的,但是我們等不起呀。
隨著時間的推移越來越多的用戶發(fā)現(xiàn)問題,QQ 群、微信群已經(jīng)沸騰,董事長也開始關(guān)注此問題,有的客戶直接在群里面說,你們的技術(shù)太不給力了(像這種還是委婉的,有的直接打電話罵人)…
臨時解決方案
不斷的通過 17ce 測試發(fā)現(xiàn),大部分地區(qū)的網(wǎng)絡(luò)都已經(jīng)恢復(fù),就剩北京聯(lián)通和部分地區(qū)聯(lián)通網(wǎng)絡(luò)環(huán)境下不通,也說明了這幾個地區(qū)下的 DNS 解析記錄沒有被更新。
那么既然我們在上面已經(jīng)定位出了問題,又了解是什么原因,就想著試著換個 DNS 解析服務(wù)器會不會好一點呢,于是我們把本地的 DNS 地址換成 8.8.8.8(谷歌的 DNS 服務(wù)解析)發(fā)現(xiàn)好了!于是趕緊先寫解決手冊發(fā)給著急的客戶來使用。
官網(wǎng)的用戶可以通過更改 DNS 來解決訪問的問題,App 怎么辦呢?沒有辦法我們也不能等,直接找開發(fā)人員把客戶端調(diào)用的地址由域名暫時先改為外網(wǎng)的 IP 地址打一個版本供用戶臨時使用。
安卓還比較好辦,直接讓用戶下載安裝使用還好,但是 iOS 那時候的審核最少都需要一周,黃花菜都涼了。
其實 iPhone 手機可以單獨設(shè)置 DNS 的,我們進行了設(shè)置和測試后發(fā)現(xiàn)也可以實現(xiàn),于是馬上更新到手冊中發(fā)送給客服,客服再發(fā)送到群里面給用戶使用。
有人說直接讓用戶使用外網(wǎng)就行了嘛,使用外網(wǎng)首頁打開倒是沒有問題,但是各系統(tǒng)之間調(diào)用,相關(guān)配置文件里面寫的也都是域名的地址,如果硬改的話可能會引發(fā)另外的問題。
***天搞完就晚上 10 點多了,中間就下午 4 點吃了一頓飯,打了 N 個電話大家都非常累,于是當(dāng)天就先這樣了,第二天大家一早到公司繼續(xù)跟進。
第二天到公司,經(jīng)過 17ce 測試發(fā)現(xiàn)所有的節(jié)點都已經(jīng)通了,就剩北京聯(lián)通的兩個節(jié)點沒響應(yīng),但是北京是我們的大本營,絕大部分的用戶都是北京的,繼續(xù)和萬網(wǎng)、聯(lián)通溝通看怎么能徹底的解決這個問題。
另一方面做好最壞的打算,如果一直不通怎么辦。在生產(chǎn)環(huán)境中梳理所有使用域名的配置文件,做好隨時可以直接更新為外網(wǎng)地址而不能影響服務(wù),App 完整的重新做一個版本,做好隨時可以投產(chǎn)讓用戶強制升級到外網(wǎng)直連的版本。
到第二天晚上 10 點的時候,北京聯(lián)通的這兩個節(jié)點還是不通,和領(lǐng)導(dǎo)進行了商議如果到周一早上 8 點來的時候這兩個網(wǎng)絡(luò)還是不能通的話,就上線改造好的系統(tǒng)和 App 強制升級(因為當(dāng)時周末還沒有標的,周內(nèi)才有發(fā)標計劃)。
第三天早上起來的***件事情就是拿起手機,查看自己的聯(lián)通網(wǎng)絡(luò)是不是可以登錄上官網(wǎng),結(jié)果通了!皆大歡喜。
俗話說真理是愈辯愈明,經(jīng)過了這次事故,也徹底的讓我了解了 DNS 解析的整個過程。
DNS 解析流程
DNS( Domain Name System)是“域名系統(tǒng)”的英文縮寫,是一種組織成域?qū)哟谓Y(jié)構(gòu)的計算機和網(wǎng)絡(luò)服務(wù)命名系統(tǒng)。
它用于 TCP/IP 網(wǎng)絡(luò),它所提供的服務(wù)是用來將主機名和域名轉(zhuǎn)換為 IP 地址的工作。俗話說,DNS 就是將網(wǎng)址轉(zhuǎn)化為對外的 IP 地址。
DNS 從用戶訪問到響應(yīng)的整個流程,如下圖:
***步
瀏覽器將會檢查緩存中有沒有這個域名對應(yīng)的解析過的 IP 地址,如果有,該解析過程將會結(jié)束。瀏覽器緩存域名也是有限制的,包括緩存的時間、大小,可以通過 TTL 屬性來設(shè)置。
第二步
如果用戶的瀏覽器緩存中沒有,操作系統(tǒng)會先檢查自己本地的 hosts 文件是否有這個網(wǎng)址映射關(guān)系,如果有,就先調(diào)用這個 IP 地址映射,完成域名解析。
第三步
如果 hosts 里沒有這個域名的映射,則查找本地 DNS 解析器緩存,是否有這個網(wǎng)址映射關(guān)系,如果有,直接返回,完成域名解析。
第四步
如果 hosts 與本地 DNS 解析器緩存都沒有相應(yīng)的網(wǎng)址映射關(guān)系,首先會找 TCP/IP 參數(shù)中設(shè)置的*** DNS 服務(wù)器,在此我們叫它本地 DNS 服務(wù)器,此服務(wù)器收到查詢時,如果要查詢的域名,包含在本地配置區(qū)域資源中,則返回解析結(jié)果給客戶機,完成域名解析,此解析具有權(quán)威性。
第五步
如果要查詢的域名,不由本地 DNS 服務(wù)器區(qū)域解析,但該服務(wù)器已緩存了此網(wǎng)址映射關(guān)系,則調(diào)用這個 IP 地址映射,完成域名解析,此解析不具有權(quán)威性。
第六步
如果本地 DNS 服務(wù)器本地區(qū)域文件與緩存解析都失效,則根據(jù)本地 DNS 服務(wù)器的設(shè)置(是否設(shè)置轉(zhuǎn)發(fā)器)進行查詢。
如果未用轉(zhuǎn)發(fā)模式,本地 DNS 就把請求發(fā)至 13 臺根 DNS,根 DNS 服務(wù)器收到請求后會判斷這個域名(.com)是誰來授權(quán)管理,并會返回一個負責(zé)該***域名服務(wù)器的一個 IP。
本地 DNS 服務(wù)器收到 IP 信息后,將會聯(lián)系負責(zé) .com 域的這臺服務(wù)器。這臺負責(zé) .com 域的服務(wù)器收到請求后,如果自己無法解析,它就會找一個管理 .com 域的下一級 DNS 服務(wù)器地址給本地 DNS 服務(wù)器。
當(dāng)本地 DNS 服務(wù)器收到這個地址后,就會找域名域服務(wù)器,重復(fù)上面的動作,進行查詢,直至找到域名對應(yīng)的主機。
第七步
如果用的是轉(zhuǎn)發(fā)模式,此 DNS 服務(wù)器就會把請求轉(zhuǎn)發(fā)至上一級 DNS 服務(wù)器,由上一級服務(wù)器進行解析,上一級服務(wù)器如果不能解析,或找根 DNS 或把轉(zhuǎn)請求轉(zhuǎn)至上上級,以此循環(huán)。
不管是本地 DNS 服務(wù)器用是是轉(zhuǎn)發(fā),還是根提示,***都是把結(jié)果返回給本地 DNS 服務(wù)器,由此 DNS 服務(wù)器再返回給客戶機。
這個事情發(fā)生后,給了我們很大的四個教訓(xùn):
- 流程管理有漏洞,離職交接不到位。
- 危機處理不成熟,影響公司聲譽。
- 監(jiān)控機制不完善,像外網(wǎng)不通的這種問題,應(yīng)該提前設(shè)置監(jiān)控措施。
- 有時候非常嚴重的問題,就是你常常忽略的小問題引起的。
點擊查看當(dāng)時寫的 DNS 更新手冊