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

ゲームラグ白書 › L12 データベース

長い保存間隔による進行状況の消失 Periodic save window

原因ID db-save-interval · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・DBインフラ

図と実験のあるメインページでこのカードを開く →

負荷を減らすために数分に1回しか保存しないと、その間にサーバーが落ちた場合に進行状況が失われます。

なぜ キャラクターの状態を数分ごとに1回保存 → すると その間にサーバーのクラッシュ・障害が発生 → 画面では 再接続すると数分前の状態(ロールバック)

症状
不発・ロールバック
要因
パケットロス
誰に起きるか
サーバー全体, 特定の場所・チャンネル
いつ
ときどきランダムに
担当
主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・DBインフラ
ゲーム開発チームの対応
重要なイベント(取引、レアアイテムの獲得)は即時保存、変更ログの記録。
インフラチームの対応
保存間隔を短くしたときに増える書き込みに耐えられるだけの、DBのIOPS・CPUの余裕を確認。
グラフでは
接続が一斉に切れる · 接続数、ロールバックの報告数
確認箇所
クラッシュ・障害の時刻と、ロールバックを報告したキャラクターの最終保存時刻(ゲームサーバーの保存ログやDBの更新日時カラム)を並べる
該当する場合
巻き戻った時点がクラッシュ直前の最終保存時刻と一致し、失われた時間が保存間隔より短い
該当しない場合
ゲームサーバーのログには保存完了と残っているのに巻き戻ったなら、DBのフェイルオーバーによるデータ消失(db-failover)か、レプリカから読んだ古い値(db-replica-lag)
確認手段
ゲームサーバー・クライアントのログ・メトリクスが必要

出典

  1. Asynchronous Commit (PostgreSQL Documentation) PostgreSQL
    記録をまとめて遅れて書き出すとスループットが上がる代わりに、障害時に直近のトランザクションが失われることがある(同じトレードオフ)
  2. Redis persistence Redis
    RDBスナップショットを数分ごとに作る場合、異常終了時には直近数分のデータを失う覚悟が必要

あわせて読みたい原因

同じ層:L12 データベース

同じ症状(不発・ロールバック)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る