新來的實習生不小心刪庫了,嚇得我虎軀一震!
昨天下午看一篇程序員的搞笑文章,看到了刪庫跑路的段子,然后想起了自己曾經的經歷,于是就想寫寫了。
圖片來自 Pexels
記得是發生在 2013 年,具體日期記不清了。那時候,我們的存儲系統已經成功在全部門鋪開了,當時我們正準備著手進行第二輪的優化。
相比前面階段,我們的壓力已經小了很多,因為已經完成了最關鍵的 KPI, 我們可以有規劃,有時間地慢慢做優化了。
那天晚上,我本著想 22 點就走的,想回去看部電影,畢竟太久沒看了。不過正要走的時候,被 Leader 拉住,他跟我討論起了存儲冷備的問題。
熱備我們已經解決的不錯了,業務的可用性因此得到很大的提升,冷備是為了解決業務上的問題,比如有人不小心寫了個 Bug 把數據給刪了,便可以從冷備的數據中恢復回來。
我們討論得很投入,方案也慢慢清晰了,不知不覺已經 23 點了,覺得太晚了,就約定明天再聊。
我關了顯示器,正準備離開的時候,隔壁團隊的 D 帶著新人 J 跑了過來,很慌張地樣子。
他拉住了我,對我說:“你們存儲系統的數據可以恢復嗎?”
我有點懵:“什么意思?容災(熱備)出問題了嗎?”
D 答到:“不是,我們一個實習生的代碼有 Bug , 把業務 G 的核心數據全刪了!”
“啊!” 我吃驚道。
剛好我 Leader 也在,他走過來,“剛剛我們還在討論冷備的事情,就是為了應對這種情況的,不過還沒開始搞呢!” 他說道。
“那怎么辦? 有沒有其他辦法可以恢復數據,要不整個業務就完蛋了,那是最核心的數據!” D 驚慌地說道。
“讓我們想想 !” 我轉過身就跟我的 Leader 討論了起來。
討論了不到十分鐘,就想到一個辦法。
因為我們的存儲采用的是 BitCask 的模型,刪除操作只是在對應的數據里面做了一個標記,沒有真正刪除,真實的刪除會在業務低峰期,數據回收的時候才進行。
也就是說,只要執行數據回收之前,我們就有可能把數據撈出來做恢復。
但方案執行起來有很多需要注意的細節,而且有比較大風險,于是就具體的細節,我們又討論了二十來分鐘。
那時候時間已經是 00:30 了。
一切敲定后,我登錄上了他們業務的機器,看配置,數據回收的時間是凌晨 3 點,我趕緊將配置改到了中午 12 點,為接下來的恢復爭取時間。
我跟 D 解釋了一番,并告知他,可以從未被回收的舊文件里面恢復數據,不過因為第一次遇到這種情況,我需要寫個新的工具把舊文件的數據撈出來,然后 D 那邊也需要配合寫一個工具,將讀出來的數據,從業務接口面寫回去。
D 聽到,仿佛得到拯救一般,連忙道謝!之后就一些細節,我們又進行了一番討論。
一切敲定,大家便各自忙了起來。我也立馬帶上我的耳機,吭哧吭哧寫起了代碼。所幸工具的邏輯不是特別復雜,不到一小時就寫完了。
我自己驗證了幾遍,可以正確的將數據從舊文件中讀出來。這時候,已經是凌晨 2 點了。
我跑去了他們的座位,他們那邊的工具也準備好了。
于是我們拿了一臺機器,準備合起來跑一遍工具,做一次全流程的驗證。D 執行了這個操作,看著黑底白字的屏幕上打出的一行行 log , 我們都屏住了呼吸,生怕看到 “Error” 的字樣!
所幸,整個過程沒有任何報錯,我們又找了一個舊工具做了一次數據讀取的驗證,以確保恢復的數據是正確的。
當看到最終結果的那一刻,我們終于松了一口氣,整個方案是可行的,可以正確的恢復數據。這時候,時間已經到了凌晨 3 點多。
此時放松的心,又緊繃了起來。
因為有數據的業務機器有上百臺,我們必須在凌晨 5 點前完成全部數據的恢復,要不就會影響到用戶的正常訪問了。
我們又立馬投入方案的討論中。很快敲定了,單機多進程,多機并發跑的方案。
方案的執行,需要寫些并發的 Shell 腳本。我們 3 人又趕忙跑到了運維大神 A 座位,他已經了解事情的前因后果,我們就執行方案跟他做了進一番的討論,敲定后,他立馬就寫起了 Shell 。
十多分種后,兩個 Shell 腳本都搞定了,A 做了一次驗證,一切符合預期。
在準備開跑前,我們又討論了異常的應對情況,需要監控的關鍵數據和曲線。這時候時間已經接近 4 點了。
“時間不多了,跑吧!”, 我們異口同聲道。
D 和他的實習生也跑回了座位去看業務監控,我在運維大神 A 旁邊看著他的操作和監控。
很快,一百多臺機器上的自動化腳本和工具全部跑了起來,我們來回切換,看機器的負載和業務的曲線,一切都在預期之中,5 點前,數據終于全部被恢復了。
我們又趕忙找了幾個測試號,從用戶側做了一次完整的驗證,確保整個業務流程不受影響。
一切符合預期!我們的心才終于安定了下來。看了看時間,已經是凌晨 5 點多了。
搞了一整夜,大家已經是極度疲憊,我們下樓叫了出租車各自回去。
在出租車上,我看著冷清的街道,綠化樹一棵棵飛快地往后跑去,馬路兩邊的霓虹燈已經漸漸微弱,天邊慢慢露出了乳白色的微光。
我感到疲憊,但也感到一種興奮。似乎經歷了一個人生的重大危機,所幸是有驚無險!
現在回想起來,那確實是驚心動魄的一夜,不過,所幸大家都響應的很及時,配合的很好,才避免了一次可能上微博的刪庫跑路事件。
我們后來看玩笑,幸好那晚的運氣和配合都很好,D 和他的實習生終于不用跑了 。
這是一個業務高速發展路上的一個小插曲。因為當時的業務發展很快,無論是人員的培訓還是技術方案的完備性上,都有缺失,但因為大家的努力和盡責,最終還是挺了過來。
在后面的日子里,我們做了多方面的改進,類似的事情,便從未再發生!