한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 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 與指標

出處

  1. Asynchronous Commit (PostgreSQL Documentation) PostgreSQL
    把寫入集中起來延後寫回能提高處理量,代價是故障時最近的 transaction 可能遺失(同樣的取捨)
  2. Redis persistence Redis
    每隔幾分鐘建立一次 RDB 快照的話,就得接受異常關閉時遺失最後幾分鐘資料的風險

相關原因

同一層:L12 資料庫

同一症狀(吃指令/回檔)在其他層的原因

查看含圖解與實驗的完整版卡片