一次最初級的程序失誤導致的伺服器癱瘓
08-20
一次最初級的程序失誤導致的伺服器癱瘓
來自專欄漢家松鼠的遊戲製作和運營分享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伺服器搭建總結