全部產品
Search
文件中心

:如何處理Tair叢集資料扭曲

更新時間:Jun 30, 2024

Tair叢集中,若個別資料分區節點(Data Node)的記憶體使用量率或CPU使用率、頻寬使用率、延時等效能指標遠遠高於其他資料分區,該Tair叢集可能已產生資料扭曲。資料扭曲嚴重時,會導致執行個體在整體記憶體使用量率不高的情況下,發生記憶體逐出(Key eviction)、記憶體溢出OOM(Out Of Memory)、執行個體回應時間上升等異常情況。

為什麼會產生資料扭曲

Tair叢集架構作為一個分布式系統,整個資料庫空間會被分為16384個槽(Slot),每個資料分區節點將儲存與處理指定Slot的資料(Key),例如3分區叢集執行個體,3個分區分別負責的Slot為:[0,5460]、[5461,10922]、[10923,16383]。當使用者寫入或更新資料時,用戶端會通過CRC演算法計算出Key所屬的Slot,具體公式為Slot=CRC16(key)%16384,並將資料寫入Slot所屬的資料分區節點。通常情況下,各資料分區節點的Key數量是均勻分布的,同時記憶體使用量率、CPU使用率等效能指標也是相近的。

但在使用資料庫的過程中,可能會由於前期規劃不足、不規範的資料寫入及突發的訪問量,造成資料量傾斜或資料訪問傾斜,最終引起資料扭曲。

說明

資料扭曲通常是指大多資料分區節點的效能指標較低,而個別節點的效能指標較高的情況,高或低沒有明確的標準。

您可以在效能監控數據節點頁面中查看各資料分區節點的對應指標,通常情況下,若某資料分區節點(最高)的效能指標高出其他資料分區節點(最低)20%及以上時,可認為已產生資料扭曲,差值越大,資料扭曲程度越嚴重。

下圖介紹兩個典型的資料扭曲情境,如下圖所示,雖然Key均勻地分布在叢集中,每個資料分區節點2個Key,但仍產生了資料扭曲:

熱key

  • Replica 1節點中key1的QPS明顯高於其他Key,屬於典型的資料訪問傾斜,會導致該Key所在的資料分區節點CPU使用率、頻寬使用率升高,從而影響該分區上所有Key的處理。

  • Replica 2節點中key5的QPS雖然不高,但該Key的大小為1 MB,屬於典型的資料量傾斜,會導致該Key所在的資料分區節點的記憶體使用量率、頻寬使用率升高,從而影響該分區上所有Key的處理。

本文介紹如何確認是否存在資料扭曲,以及導致資料扭曲的原因和處理方法。同時,本文也適用於排查標準架構記憶體使用量率、CPU使用率、頻寬使用率和延遲等效能指標高的問題。

如何確認是否存在資料扭曲

  • 使用執行個體診斷功能(推薦),一鍵排查當前執行個體是否存在傾斜的情況。

  • 在執行個體的效能監控 > 數據節點頁面中查看各資料分區節點的對應指標,具體操作請參見查看效能監控

資料扭曲的臨時方案

若執行個體已產生資料扭曲,您可以通過如下臨時方案進行過渡,但以下臨時方案無法解決資料扭曲的根源問題。

同時,您也可以在短時間內可降低大Key、熱Key的請求量,暫緩資料扭曲問題,但大Key、熱Key問題只能通過業務上的改造才能解決。建議您及時對執行個體進行資料扭曲的原因排查,並根據對應處理方法在業務層進行改造,對執行個體進行最佳化,更多資訊請參見資料扭曲的原因與處理方法

傾斜情境

可能原因

臨時方案

記憶體傾斜

大Key、Hash Tags。

升級執行個體規格,具體操作請參見變更執行個體配置

重要
  • 變更配置時Tair會進行資料扭曲預檢查,若您選擇的執行個體規格無法解決記憶體傾斜問題,Tair會進行攔截與報錯,請您調大執行個體規格後重試。

  • 在成功升級執行個體規格後,會改善記憶體傾斜問題,但可能也引起頻寬傾斜或CPU傾斜。

頻寬傾斜

大Key、熱Key、高消耗命令。

提升執行個體中指定1個或多個分區的頻寬,具體操作請參見手動增加執行個體頻寬

說明

由於單個執行個體分區最多可額外增加原執行個體預設頻寬的6倍但不能超過192MB/s。若業務流量仍大於該值,則只能在業務層進行改造。

CPU使用率傾斜

大Key、熱Key、高消耗命令。

無臨時方案,請進行原因排查並在業務層進行改造。

資料扭曲的原因與處理方法

請提前規劃業務增長率,合理地拆分大Key,並保持規範的資料寫入,才能解決資料扭曲的根源問題。

產生傾斜原因

說明

處理方法

大Key

大Key通常以Key的大小和Key中成員的數量來綜合判定。

常見於在KKV(Key-key-value)類型的資料結構中,例如Hash、List、Set、Zset等,存放過多或過大的field,從而導致單個Key過大,產生執行個體資料扭曲。更多關於大Key的資訊,請參見發現並處理大Key和熱Key

  • 避免使用大Key。

  • 對大Key進行拆分,例如將含有數萬成員的一個HASH Key拆分為多個HASH Key,並確保每個Key的成員數量在合理範圍。

熱Key

熱Key指某個Key或者少部分Key的操作QPS明顯高於其他Key。常見於壓測時選了單一Key或秒殺情境下熱點商品ID Key。更多關於熱key資訊,請參考發現並處理大Key和熱Key

  • 請避免使用熱Key。

  • 使用Tair的QueryCache特性,緩衝熱點資料,更多資訊請參見最佳化大Key與熱Key

高消耗命令

不同的命令具有不同的複雜度,高複雜度的命令會消耗大量效能資源,例如HGETALL命令的複雜度為O(n),該命令會隨著您儲存的Field越多,消耗越大。同時,簡單的SETGET命令也會在Value過大時,消耗大量資料分區節點的效能資源。

  • 可通過查詢慢日誌功能查詢資料分區節點的慢日誌。

  • 業務側需減少或禁止使用高消耗命令,如需禁用命令,可以在參數設定中配置#no_loose_disabled-commands參數。

Hash Tags

若Key名稱中包含{},例如{item}id1,則Tair僅會對{}中的內容進行Slot計算並選擇資料分區節點。若存在{item}id1{item}id2{item}id3等等大量Key,由於{}中的內容相同,上述Key均會被分配至同一資料分區節點,導致該資料分區節點的記憶體資源、效能消耗大幅升高。

  • 避免在Key名稱中使用{}

    說明

    如需在Key名稱中使用{},需保證{}中的內容儘可能不同,從而使Key盡量均勻地分布在叢集的不同資料分區節點上。