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

遊戲 Lag 白皮書 › L12 資料庫

複寫延遲 Replication lag

原因 ID db-replica-lag · 主要負責 基礎設施團隊(DB 基礎設施) · 協同 遊戲開發團隊(伺服器開發)

在含圖解與實驗的完整版中開啟卡片 →

寫入走主 DB、讀取走複本的架構下,複本跟得慢時,剛寫入的內容就會看不到。

為什麼 寫入集中湧向主 DB,複本落後數秒 → 於是 從複本讀取剛存檔的內容時,資料還不存在 → 畫面上 剛買的道具看不到、交易所價格還是舊的、重複發放的 bug

症狀
吃指令/回檔
因素
延遲
誰會遇到
只有特定功能
何時
人潮湧入時, 晚間尖峰時段
負責單位
主要負責 基礎設施團隊(DB 基礎設施) · 協同 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
剛寫入的資料從主 DB 讀取;確認是否已發放與實際發放,在主 DB 上以同一個 transaction 完成(用唯一鍵或條件式 UPDATE 防止重複)。
基礎設施團隊要做的事
設定複寫延遲警示、讓複本規格不低於主 DB 並啟用平行複寫、大量刪除分成小批執行、管理在複本上長時間執行的彙總查詢。
圖表上
隨人數/負載上升 · 複寫延遲(秒)
查看位置
MySQL 在複本上看 SHOW REPLICA STATUS 的 Seconds_Behind_Source(8.0.22 之前的版本用 SHOW SLAVE STATUS)。PostgreSQL 看主伺服器 pg_stat_replication 的 write_lag、flush_lag、replay_lag,RDS 則看 ReplicaLag
符合的跡象
回報「看不到」的時間點延遲達數秒以上,延遲消除後再看就正常。寫入暴增、大量刪除或複本上執行長時間彙總查詢時,延遲變大
不符合的跡象
延遲接近 0 卻仍看不到時,是遊戲伺服器的快取或同步的問題
確認方式
用基礎設施工具確認(不需要遊戲程式碼)
深入了解
即使寫入不多也可能落後。在主 DB 上花了 10 分鐘的一次大量刪除,在複本上重新執行的期間,也會讓複本落後同樣的時間;在複本上長時間執行的彙總查詢,也會拖慢複本追上的速度。

出處

  1. SHOW REPLICA STATUS Statement MySQL
    Seconds_Behind_Source:複本目前正在套用的事件,與該事件在主 DB 上寫入的時間之差(複寫延遲)
  2. Replica Server Options and Variables MySQL
    用 replica_parallel_workers 讓多個執行緒平行套用 transaction(預設 4;設為 0 時由單一執行緒依序套用)
  3. Log-Shipping Standby Servers (PostgreSQL Documentation) PostgreSQL
    串流複寫預設為非同步,commit 與複本套用之間有延遲(複本跟得上時通常不到 1 秒)
  4. MySQL 8.0 Reference Manual: SHOW REPLICA STATUS Statement MySQL
    從 8.0.22 起以 SHOW REPLICA STATUS 取代 SHOW SLAVE STATUS,更早的版本使用 SHOW SLAVE STATUS
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_replication 的 write_lag、flush_lag、replay_lag:主伺服器寫入 WAL 之後,到複本分別回報已寫入、已寫回磁碟、已套用為止所花的時間
  6. Amazon CloudWatch metrics for Amazon RDS AWS
    ReplicaLag:讀取複本落後來源的時間(秒)

相關原因

同一層:L12 資料庫

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

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