博客 / 詳情

返回

Easysearch 時序數據的基於時間範圍的合併策略

如果你正在使用 Easysearch 處理日誌、監控指標、事件流或其他任何具有時間順序的數據,那麼你一定知道索引的性能和效率至關重要。Easysearch 底層的 Lucene Segment 合併是保持搜索和索引性能的關鍵後台任務。然而,你是否意識到,默認的合併策略可能並不是處理時序數據的最佳選擇?

今天,我們就來介紹 Easysearch 1.12.1 版本起引入的一個重要優化:基於時間範圍的合併策略 (TimeRangeMergePolicy) ,它專門為優化時序數據的 Segment 合併而生。

時序數據的合併挑戰:默認策略的侷限性

Easysearch 默認使用的合併策略(如 TieredMergePolicy)非常智能,它會根據 Segment 的大小、文檔刪除比例等因素來決定合併哪些 Segment,以平衡查詢性能和資源使用。

但在時序數據場景下,這種通用策略可能會遇到一些問題:

  1. 冷熱數據混合: 想象一下,幾個月前的舊日誌數據(冷數據)可能因為大小合適而被選中,與最近幾小時內產生的新數據(熱數據)進行合併。這會帶來不必要的 I/O 和 CPU 開銷,因為冷數據通常訪問很少,合併它們對查詢性能的提升有限,反而消耗了寶貴的資源。
  2. 查詢性能影響: 合併可能產生覆蓋時間跨度非常大的 Segment。當你執行按時間範圍過濾的查詢時(這在時序場景中非常常見),查詢可能需要掃描這些巨大的 Segment,即使其中大部分數據都不在你的目標時間範圍內,從而降低查詢效率。

解決方案:TimeRangeMergePolicy 登場!

為了解決上述痛點,Easysearch 引入了 TimeRangeMergePolicy。顧名思義,這種策略在做合併決策時,將時間維度納入了核心考量

它的核心思想很簡單,但非常有效:

  • 時間優先: 傾向於合併那些時間上相鄰或接近的 Segment。比如,屬於同一天或同一小時的 Segment 更有可能被一起合併。
  • 保留時間分區: 儘量避免將時間跨度極大的 Segment 合併在一起。這有助於保持數據的“時間局部性”,使得按時間範圍查詢時能更快地排除不相關的 Segment。
  • 優先合併新數據: 通常,新產生的數據(熱數據)更新和刪除操作更頻繁。優先合併包含較新數據的 Segment,有助於更快地回收被刪除文檔佔用的空間,並優化對最新數據的查詢性能。

如何為你的時序索引啓用 TimeRangeMergePolicy?

啓用這個功能非常簡單,只需要兩步:

  1. 確認日期字段: 首先,確保你的索引 Mapping 中有一個能準確代表數據時間的字段,通常是日期(date)或時間戳(date_nanos)類型,例如 @timestampevent_time 等。這個字段的值應該反映數據產生的實際時間。
  2. 更新索引設置: 使用 Index Settings API,為你的索引指定 index.merge.policy.time_range_field 參數,並將其值設置為你的時間字段名。

示例:

假設你的時間字段是 timestamp,索引名稱是 my-timeseries-index,你可以執行以下請求:

PUT /my-timeseries-index/_settings
{
  "index": {
    "merge.policy.time_range_field": "timestamp"
  }
}

搞定!設置之後,my-timeseries-index 後續的 Segment 合併就會自動採用 TimeRangeMergePolicy 了。

專家提示: 如果你想讓所有新創建的時序索引默認就使用這個策略,可以將這個設置添加到你的索引模板 (Index Template) 中。

TimeRangeMergePolicy 的優勢

啓用時間範圍合併策略能帶來哪些好處呢?

  • 降低合併開銷: 顯著減少冷熱數據的無效合併,節省 I/O 和 CPU 資源。
  • 提高資源效率: 更智能的合併有助於更快地回收已刪除文檔的空間,並可能降低整體計算資源的使用。
  • 優化查詢性能: 保持 Segment 的時間局部性,對於按時間範圍過濾的查詢(例如,“查詢過去一小時的日誌”)可能會有明顯的性能提升。
  • 對時序數據更友好: 該策略的設計初衷就是為了更好地服務於日誌、指標這類嚴格按時間增長的數據模式。

注意事項

在使用 TimeRangeMergePolicy 時,有幾點需要注意:

  • 時間字段是關鍵: 策略的效果高度依賴於你所指定的 time_range_field。如果該字段不存在,或者字段中的時間值混亂、不準確,策略可能無法發揮預期效果,甚至適得其反。
  • 並非萬能丹: 這個策略最適合具有明確時間序列特徵的數據。對於非時序數據(例如,商品信息、用户信息索引),默認的 TieredMergePolicy 可能仍然是更好的選擇。
  • 版本要求: 請確保你的 Easysearch 集羣版本至少為 1.12.1

總結

對於處理大量時序數據的 Easysearch 用户來説,TimeRangeMergePolicy 是一個非常有價值的優化工具。通過感知數據的時間屬性,它可以讓 Segment 合併操作更加智能和高效,從而降低資源消耗、提升查詢性能。如果你的索引符合時序數據的特徵,並且正在運行 Easysearch 1.12.1 或更高版本,不妨嘗試啓用這個策略,看看它能否為你的集羣帶來改善!

user avatar moon_glade 頭像 yangon 頭像 mengyuhang4879 頭像
3 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.