讓自家系統癱瘓,這事我也幹過

最近幾天國內互聯網圈接連出現停服事故,先是支付寶停服超過2小時,而後是攜程停服超過8小時。一時間許多人大驚:原來大玩家們的運維水平這麼出乎意料。 前端

我想說的是,我認識的作技術的,許多人都有把網站(系統)搞癱瘓的經歷。有些聚會上,說不出本身把系統搞崩潰過的經歷,人家都不認爲你是「本身人」。還好,我是能夠榮列「本身人」隊伍的,下面我要說的就是個人經歷。 數據庫

2007年,我當時在「抓蝦網」作後臺開發。網齡老一點的讀者大概會記得這個網站,當時排名第一的中文在線RSS閱讀器。若是不理解什麼是「RSS閱讀」,能夠理解爲「博客的朋友圈」:當時尚未微信,只有博客,在線RSS閱讀就是把你關注各博客的更新都抓回來,拼成「朋友圈」方便閱讀的工具。 緩存

問題出如今一天晚上。有一張數據庫的表裏記錄了當前等待執行的任務,一般來講,裏面的記錄應該不超過100條。不幸那天程序出了點問題,到下午6點堆積了兩三千條記錄,我一直調到晚上8點多才算解決,看着數據量一點點降下去,我放心地回家了。 安全

到11點半,洗漱完畢,立刻要上牀睡覺了,我想登上服務器確認問題已經解決。檢查發現,還有不到200條記錄。看來問題確實已經解決了,只是看着這個數字確實有些不爽,平時都不到100呢。因而我想,不如把表給清空了吧,數字就好看了,反正都是會反覆執行的臨時記錄,也沒什麼影響。 服務器

等我輸入清空數據庫表的truncate語句以後,稍微感受有些異樣,怎麼執行了這麼久,平時不用1秒的語句,如今居然執行了5秒。再看看監控系統,瞬間大驚失色,瞌睡全無:原來我把最重要的博客地址列表給清空了,抓取、分析、存儲模塊羣龍無首,都在空轉。 微信

與delete from相比,用truncate語句清空,速度很快,但沒法經過日誌來恢復;雖然數據庫有熱備,但能夠想象,1秒不到的時間裏,這條錯誤的指令已經發送到各臺熱備機,因此你們都清空了這張表…… 架構

我當時剛剛工做不久,並且一直作後臺開發,歷來沒有遇到過這樣程度的在線問題。第一反應就是打電話給領導,因而我撥通了振宇(現任去哪兒網集團執行副總裁&無線事業羣CEO)的電話。振宇聽完個人描述,只平靜地說:趕忙恢復數據,最遲明天早上必需要解決,不要讓用戶感受到。 運維

我原本是想讓他告訴我怎麼處理,結果他只給了我一個目標。後臺系統平時都是我在維護,找其它同事也幫不上忙。因此我雖然滿頭大汗,也只能努力靜下心來,想一想到底要怎麼辦。 工具

首先我把相關的模塊都停下來,避免弄得本身心煩意亂。而後把數據庫的表都畫在紙上,看看互相之間的關聯,能不能拼一份數據出來。很快我找到了從幾張表拼出原始數據的方案(這時候才知道冗餘設計是多麼好)。寫了一個Python腳本測試,經過。那麼趕忙上線!這時候是凌晨1點。 測試

然而事情並無那麼簡單,數據卻是恢復出來了,速度慢得嚇人。一共有五百多萬條數據要恢復,每秒鐘只能恢復不到50條數據,所有恢復要超過1天,確定會嚴重影響客戶體驗的。

雖然已經接近2點了,但我睡意全無(也不敢有)又一籌莫展。只能一邊徒勞地看着恢復進度,一邊分析:若是沒有冷備(當時確實沒有),看來所有恢復是得1天了。怎麼能不讓用戶發現呢?出個維護通告?……突然我想到,既然用戶訂閱數都在,先把活躍用戶訂閱的、訂閱數量多的博客地址挑出來,而後再恢復其它的。

很快我統計出符合條件的記錄,大概六十萬條,按照每秒50條的速度,一小時能夠恢復18萬條,4小時左右能夠所有恢復完畢。如今不到3點,所有恢復完畢是早上7點左右,用戶的第一個活躍期在早上8點多(當時絕大多數人都是PC上網),應該來得及。

再寫程序,測試,經過,再上線,觀察了一段時間,發現速度是正常的,符合預期。這時候已經四點多,全身溼透了。我給振宇發了個短信說「已經在恢復了,確保不會影響客戶體驗」,才倒下去睡覺……

天亮了,起牀第一件事就是檢查恢復進程,發現沒有問題。而後我懷着忐忑的心情,裝作沒事人同樣去上班,果真沒有人發現問題。中午吃飯的時候我偷偷找到運維的同事,說了這件事情。他的反應更讓我出乎意料:這有啥,你們都有采坑的時候,我之前在百度,迷糊了把幾個T的前端緩存刪掉了,出去抽顆煙,回來該怎麼樣還怎麼樣……

到當天下午,沒有人訂閱的數據也已經恢復了,整個過程還算成功,沒有用戶發現異樣。

後記

此次事件給個人印象太深入了,尤爲是大半夜驚心動魄地調試,說折陽壽真是不誇張。因此在這以後,我把冷備作起來了,把備份恢復方案作起來了,把數據庫分帳號控制作起來了,不再敢隨便清空數據表了……吃一塹長一智,好的系統都是一個個小坑填出來的,重要的是看到小坑就要去甜,不能永遠靠人力處理,靠手工搏鬥。長期來看,我改變了工做習慣,每次接手生產系統,第一時間會去關注系統的完整和安全,再也不着迷於系統架構和代碼質量。

如今再回想,還有兩點慶幸:一是抓蝦是面對中文用戶的服務,後來面對要支持多國協做的系統時,才真正知道「全球化」意味着什麼;二是振宇當時只設定了目標,給了我鍛鍊和成長的機會(後來和新浪談技術合做,他給我發的短信只有一句話「今天必定要把新浪的人搞定」,我印象也很深入)。

固然,對我來講,最重要的收穫是一條終身受用的道理:哪怕狀況再緊急,也不能手足無措,靜下來心來仔細分析,這纔是解決問題的根本途徑。有經驗和沒有經驗的差異,不少時候不在專業技術上,而在於把握能力上。


http://mp.weixin.qq.com/s?__biz=MzA3MDMwOTcwMg==&mid=206274577&idx=1&sn=ac3b21526ce8d605597e021cc8734430#rd

相關文章
相關標籤/搜索