ゲームラグ白書 › L12 データベース
長い保存間隔による進行状況の消失 Periodic save window
原因ID db-save-interval · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・DBインフラ
図と実験のあるメインページでこのカードを開く →
負荷を減らすために数分に1回しか保存しないと、その間にサーバーが落ちた場合に進行状況が失われます。
なぜ キャラクターの状態を数分ごとに1回保存 → すると その間にサーバーのクラッシュ・障害が発生 → 画面では 再接続すると数分前の状態(ロールバック)
- 症状
- 不発・ロールバック
- 要因
- パケットロス
- 誰に起きるか
- サーバー全体, 特定の場所・チャンネル
- いつ
- ときどきランダムに
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・DBインフラ
- ゲーム開発チームの対応
- 重要なイベント(取引、レアアイテムの獲得)は即時保存、変更ログの記録。
- インフラチームの対応
- 保存間隔を短くしたときに増える書き込みに耐えられるだけの、DBのIOPS・CPUの余裕を確認。
- グラフでは
- 接続が一斉に切れる · 接続数、ロールバックの報告数
- 確認箇所
- クラッシュ・障害の時刻と、ロールバックを報告したキャラクターの最終保存時刻(ゲームサーバーの保存ログやDBの更新日時カラム)を並べる
- 該当する場合
- 巻き戻った時点がクラッシュ直前の最終保存時刻と一致し、失われた時間が保存間隔より短い
- 該当しない場合
- ゲームサーバーのログには保存完了と残っているのに巻き戻ったなら、DBのフェイルオーバーによるデータ消失(db-failover)か、レプリカから読んだ古い値(db-replica-lag)
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- Asynchronous Commit (PostgreSQL Documentation) PostgreSQL
記録をまとめて遅れて書き出すとスループットが上がる代わりに、障害時に直近のトランザクションが失われることがある(同じトレードオフ) - Redis persistence Redis
RDBスナップショットを数分ごとに作る場合、異常終了時には直近数分のデータを失う覚悟が必要
あわせて読みたい原因
同じ層:L12 データベース
同じ症状(不発・ロールバック)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る