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