跳至主要内容

[RCA] 12/12 TREM 檢知重複觸發問題

· 閱讀時間約 2 分鐘
YuYu1015
Full-Stack Engineer (全端工程師)
嚴重程度 狀態已結案

事件概述

  • 發生時間: 2025/12/12 04:24:28 UTC+8
  • 觸發條件: 地震後
  • 問題描述: TREM Lite 出現檢知重複觸發的問題
  • 根本原因: upstream 資料不一致污染 cache,導致系統異常

根本原因分析

問題根源

Balance Server 上的 Nginx 使用了以下負載平衡設定:

upstream core_servers {
server tnn.exptech.dev:80;
server tpe.exptech.dev:80;

hash $remote_addr consistent;
}

問題說明

問題主因:

當系統從不同的 upstream 取得資料時,會將不一致的資料寫入 cache。

  • 兩個 upstream 伺服器(tnn.exptech.devtpe.exptech.dev)的資料不一致
  • 使用一致性雜湊(hash $remote_addr consistent;)時,請求可能被分配到不同的 upstream
  • 當系統從不同的 upstream 取得資料時,會將不一致的資料寫入 cache
  • 後續請求讀取到被污染的 cache 資料,導致資料狀態混亂
  • 進而引發 TREM Lite 檢知重複觸發的問題

解決方案

修改後的設定

將 Nginx upstream 設定改為以下配置:

upstream core_servers {
server tnn.exptech.dev:80 max_fails=1 fail_timeout=10s;
server tpe.exptech.dev:80 backup;
}

改進說明

  1. 主伺服器設定: tnn.exptech.dev 設為主伺服器,並設定故障檢測參數

    • max_fails=1:允許最多 1 次失敗
    • fail_timeout=10s:故障後 10 秒內不再嘗試該伺服器
  2. 備援伺服器設定: tpe.exptech.dev 設為備援伺服器(backup)

    • 僅在主伺服器不可用時才會使用
  3. 移除一致性雜湊: 避免請求被分配到不同的 upstream 伺服器

  4. 單一資料來源: 使用主備模式確保所有請求都從同一個資料來源取得資料,避免不同 upstream 的資料不一致污染 cache

後續觀察

經觀察後,故障應該已經排除。建議持續監控系統狀態,確保問題不再發生。