余晟:讓自家系統癱瘓,這事我也干過

jopen 10年前發布 | 8K 次閱讀 系統癱瘓

余晟:讓自家系統癱瘓,這事我也干過

文/余晟

最近幾天國內互聯網圈接連出現停服事故,先是支付寶停服超過 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的前端緩存刪掉了,出去抽顆煙,回 來該怎么樣還怎么樣……

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

后記

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

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

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!