1. 題目
平台接收服務、租戶與區域標籤的時序指標,短期排障需要秒級資料,長期報表只需要分鐘或小時趨勢。寫入量持續成長,要求保留 15 天原始樣本與 2 年聚合樣本,同時控制成本並避免高基數拖垮查詢。
2. 約束與澄清
- 先確認取樣間隔、標籤數量與基數、查詢範圍、SLO、允許的資料延遲與刪除合規要求。
- 區分原始樣本、固定視窗聚合、recording rule 預計算結果與長期歸檔。
- 不能用簡單平均替代 counter、histogram 或分位數;聚合函式必須保留指標語義。
- 明確寫入至少一次、重複樣本、亂序時間戳與租戶隔離策略。
3. 核心架構
採集層先做標籤白名單、基數預算與批次壓縮,再寫入按時間分塊的熱儲存。查詢層根據時間範圍與解析度路由:短視窗讀原始區塊,長視窗讀預聚合區塊,必要時拼接並標註解析度。降採樣工作以可重播的時間視窗讀取原始資料,輸出帶來源版本的聚合區塊,完成校驗後再刪除過期原始區塊。
4. 參考流程
ingest(sample):
series = canonicalize(metric_name, sorted_labels)
enforce_cardinality_budget(series)
append_to_time_partition(series, sample)
downsample(window):
raw = read_raw(window)
agg = aggregate_by_metric_semantics(raw, resolution=5m)
write_versioned_block(window, agg, source_watermark)
verify_counts_checksums_and_watermark(agg)
query(range, step):
blocks = choose_resolution(range, step)
return merge_with_gap_and_resolution_metadata(blocks)Counter 可保存增量與重置資訊,gauge 可保存 min/max/avg,histogram 要合併 bucket 或原生 histogram 結構。查詢結果應攜帶實際解析度、覆蓋範圍與缺口,避免使用者把降採樣資料誤當成原始精度。
5. 一致性與成本取捨
降採樣可能因遲到樣本或重複執行而產生不同結果,因此工作要使用 watermark、版本號與冪等寫入;視窗關閉後仍需定義修訂期。高基數標籤會同時放大記憶體、索引與查詢成本,應限制任意使用者標籤、按租戶配額或預聚合。更高解析度、更長保留期與更低查詢延遲之間存在直接儲存與計算成本。
6. 驗證與觀測
- 對每個時間視窗校驗輸入輸出樣本數、counter 增量、bucket 總量、校驗和與 watermark。
- 重播同一視窗多次,確認冪等且結果版本可替換。
- 監控寫入拒絕率、系列數、查詢樣本數、降採樣延遲、缺口率與儲存成本。
- 用真實故障查詢對比原始與聚合結果,確認尖峰、重置與異常不會被平均抹平。
7. 常見誤區
- 只按時間平均所有指標,破壞 counter、分位數或 histogram 語義。
- 標籤字串未排序就作為系列鍵,造成重複系列與錯誤基數。
- 降採樣完成前刪除原始區塊,失敗後無法重播或修訂遲到資料。
- 查詢路由只看時間範圍,不考慮 step、缺口與解析度元資料。
8. 面試評分點
能定義分層資料模型
應區分原始、預聚合與歸檔資料,說明每層解析度、保留期與查詢用途。
能保持指標語義
應分別處理 counter、gauge、histogram 與分位數,避免用一個平均函式覆蓋所有類型。
能控制基數與成本
應提出標籤規範、租戶配額、寫入拒絕與儲存預算,並解釋查詢與成本的關係。
能設計可重播驗證
應使用 watermark、版本、冪等寫入與重播校驗,監控缺口、延遲與異常尖峰保真度。