一次最初級的程序失誤導致的伺服器癱瘓

一次最初級的程序失誤導致的伺服器癱瘓

來自專欄漢家松鼠的遊戲製作和運營分享68 人贊了文章

上篇文章才說過《漢家江湖》上線之後無重大事故,然後6月份的一次版本更新(1.1.0版本),我們伺服器組就崩了...這篇文章主要想和大家分享一下事故解決經過,和事故的前因後果,以及一些經驗教訓。

PS:其實,大部分事故往往源自非常低級的失誤。例如業內著名的業原火,崩崩崩兌換碼,戀與製作人充值。。。可能都是一行代碼寫錯了;而只有在用戶數量級提升的時候,技術不足的問題才會暴露出來,平時的問題,都是態度問題。

非技術部分

還原事故現場

  • 原計劃中午12:00到下午18:00進行停服更新,結果19:00才開服;
  • 開服之後,玩家出現大規模無法登錄遊戲的情況,客服,貼吧,各社區,全面爆炸;
  • 我們緊急定位並修復了bug1,並重啟伺服器,問題沒有得到解決。。。
  • 我們緊急定位並修復了bug2,並重啟伺服器,問題沒有得到解決。。。
  • 我們緊急定位並修復了bug3,並重啟伺服器,問題沒有得到解決。。。
  • 晚上20:00到22:00,是聯機PVE和聯機PVP時間,我們中斷了掙扎,這樣能登錄的玩家可以進行聯機玩法;
  • 晚上20:00到22:00,大規模玩家無法登錄遊戲,登錄遊戲並參與聯機玩法的玩家卡得懷疑人生;
  • 晚上22:00一過,緊急停服維護;
  • 凌晨02:30,所有嚴重bug定位並修復,開啟伺服器;
  • 監控到凌晨03:30,確認沒有嚴重問題之後,撤退睡覺;

附加說明

  • 總而言之,從中午十二點到凌晨02:30,我們的玩家無法正常進行遊戲,對《漢家江湖》的遊戲運營,造成了比較惡劣的影響;
  • 阿里雲的數據遷移(DTS),慢得令人絕望,導致我們延遲開服;
  • 每次重啟伺服器,所有玩家都會掉線一次,遊戲體驗極差;
  • 從19:00開服到晚上22:00停服,我們伺服器組的各進程,出現瀑布式的Exception和Warn日誌,比運營一年的Exception還多;

經驗教訓

  • 不要慌,反正已經很糟糕了;
  • 每當解決一個bug,一定還有兩個新的bug在等你;
  • 找最重要的bug解決;
  • 萬事不決先停服;
  • 平時好好鍛煉身體,出事的時候,才能保持高度專註十多二十小時;
  • 如果不好好鍛煉,不能保持高度專註,就去睡覺吧,天不會塌的;

技術部分

從技術角度來說,這次只犯了一個致命問題,那就是:

沒有進行壓力測試!

在這次更新之前,我們的賬號系統,沒有中間層提供服務,各遊戲伺服器,直接訪問賬號資料庫,進行賬號相關的所有操作(歷史原因,見笑了)。一共大概有100多個進程,每個進程保持一個5-10連接數的連接池。

所以,這次最重要的一個更新就是,所有跟賬號相關的操作,全部走中間層;在阿里雲內網兩台ECS上,運行訪問賬號資料庫的進程,通過一個內網負載均衡,提供內網的web服務;其他所有ECS,都是通過http,內網訪問該服務。

看起來是一個挺簡單的工作,並且在我們1.1.0版本內部測試期間,沒有出現任何問題(大概15天,100+玩家測試)。

問題總結

「在每一個可能出錯的地方,都出錯了」。代碼層面的問題如下:

  • 序列化和反序列化方法調用錯誤,用了兩個不同的dll
  • http傳輸數據的時候沒有進行urldecode和urlencode
  • 用http的url地址來進行傳參,參數含大量的=,%,&,?符號
  • httplistener的響應沒有用非同步,用的同步
  • 資料庫異常的catch中沒有釋放資料庫連接
  • 消息處理過程中,catch部分沒有返回遊戲伺服器響應,導致遊戲伺服器超時

如何處理預防

寫代碼,是一定會有Bug的,bug和程序猿就是一對好基友,形影不離。

所以有如下建議:

  • 寫單元測試
  • 做好自測
  • 優化日誌結構
  • 任何架構改動,做壓力測試
  • 出問題之後,多深呼吸
  • 頭腦不清醒,涼水沖洗
  • 遇到幾次,就不會慌了

推薦閱讀:

個人計算機、工作站和伺服器相互之間的區別?
無伺服器雲計算會成為未來的趨勢?
Vultr 2018 註冊送25美金,美東/東京機房測試
FTP伺服器搭建總結

TAG:伺服器 | 遊戲伺服器 | 遊戲 |