遊戲 Lag 白皮書 › L12 資料庫
存檔週期過長造成的進度遺失 Periodic save window
原因 ID db-save-interval · 主要負責 遊戲開發團隊(伺服器開發) · 協同 基礎設施團隊(DB 基礎設施)
在含圖解與實驗的完整版中開啟卡片 →
為了減輕負載而每隔幾分鐘才存檔一次的話,伺服器在兩次存檔之間當機時,進度就會消失。
為什麼 每隔幾分鐘才儲存一次角色狀態 → 於是 在兩次存檔之間發生伺服器當機或故障 → 畫面上 重新連線後回到幾分鐘前的狀態(回檔)
- 症狀
- 吃指令/回檔
- 因素
- 遺失
- 誰會遇到
- 整個伺服器, 特定地點/頻道
- 何時
- 偶爾隨機發生
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發) · 協同 基礎設施團隊(DB 基礎設施)
- 遊戲開發團隊要做的事
- 重要事件(交易、取得稀有道具)立即存檔,並記錄變更 log。
- 基礎設施團隊要做的事
- 確認 DB 的 IOPS 與 CPU 有足夠餘裕,能承受縮短存檔週期後增加的寫入量。
- 圖表上
- 連線同時大量中斷 · 連線數、回檔回報數
- 查看位置
- 把當機、故障的時間,與回報回檔的角色最後一次存檔的時間(遊戲伺服器的存檔 log 或 DB 的修改時間欄位)並排對照
- 符合的跡象
- 回檔回到的時間點與當機前最後一次存檔的時間一致,遺失的時間短於存檔週期
- 不符合的跡象
- 遊戲伺服器 log 顯示存檔已完成卻仍回檔時,是 DB 容錯移轉造成的資料遺失(db-failover)或從複本讀到的舊值(db-replica-lag)
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
出處
- Asynchronous Commit (PostgreSQL Documentation) PostgreSQL
把寫入集中起來延後寫回能提高處理量,代價是故障時最近的 transaction 可能遺失(同樣的取捨) - Redis persistence Redis
每隔幾分鐘建立一次 RDB 快照的話,就得接受異常關閉時遺失最後幾分鐘資料的風險
相關原因
同一層:L12 資料庫
同一症狀(吃指令/回檔)在其他層的原因
查看含圖解與實驗的完整版卡片