全部產品
Search
文件中心

Tair (Redis® OSS-Compatible):通過Proxy Query Cache最佳化熱點Key問題

更新時間:Nov 22, 2024

為更好地改善對熱點Key的發起大量讀請求導致的訪問傾斜,Tair (Redis OSS-compatible)新增代理查詢快取功能(Proxy Query Cache),啟用該功能後,代理節點會緩衝熱點Key對應的請求和查詢結果,當在有效時間內收到同樣的請求時直接返回結果至用戶端,無需和後端的資料分區互動。

前提條件

  • 執行個體為Tair(企業版)記憶體型或持久記憶體型。

  • 執行個體為叢集架構代理模式或讀寫分離架構。

應用情境

需要解決或預防熱點Key的讀請求引發的訪問傾斜問題,即由於大量的讀請求集中在某些Key形成了熱點Key,從而導致某些資料分區的CPU使用率和流量使用率持續保持高位並接近100%。

重要

由於代理節點中緩衝的熱點Key的查詢結果在有效時間內不會更新,需要確認業務上能接受在資料更新到代理緩衝失效之前的這段時間(即代理緩衝的有效期間)內,讀取到的是舊資料。這是對強一致性的犧牲,以換取更高的系統效能和穩定性。商務邏輯需要能夠容忍這種可能出現的短暫資料不一致現象,確保即使在資料略有延遲的情況下,也不會影響到核心商務程序。

工作原理

圖 1. Proxy Query Cache原理Proxy Query Cache原理

Tair (Redis OSS-compatible)會根據高效的排序和統計演算法識別出執行個體中存在的熱點Key(通常熱點Key的QPS大於5,000),開啟該功能後,代理節點Proxy會根據設定的規則緩衝熱點Key的請求和查詢結果(僅緩衝熱點Key的查詢結果,無需緩衝整個Key)。當在緩衝有效時間內收到相同的請求時,Proxy會直接返回結果至用戶端,無需和後端的資料分區執行互動。如果熱點Key的查詢結果發生改變,緩衝不會更新。

說明

您可以通過執行個體診斷功能分析執行個體是否存在訪問傾斜;您還可以通過即時Top Key統計功能查詢執行個體的熱點Key資訊。

設定方法及參數說明

您需要通過修改執行個體參數的方式管理該功能,各參數解釋如下。具體操作,請參見設定執行個體參數

參數

說明

query_cache_enabled

是否啟用代理查詢快取功能,取值:

  • 0:不啟用,預設值。

  • 1:啟用。

重要

啟用代理查詢快取功能的使用情境:

  • 熱點Key的查詢結果更新頻率低或者更新頻率穩定,通過合理設定到期時間最大可能避免髒讀。

  • 業務能接受緩衝(Proxy Query Cache)在有效時間內可能出現的資料不一致。

query_cache_mode

代理查詢快取的工作模式,取值:

  • 0:只快取資料分區推送的熱點Key的查詢結果,預設值。

  • 1:緩衝所有Key的查詢結果並進行根據最近最少使用演算法LRU(Least Recently Used)進行淘汰。

重要

由於代理節點的緩衝空間有限(代理節點每個線程100 MB),如果設定該參數的值為1,代理節點將按照LRU演算法進行淘汰,可能降低緩衝的命中率,從而引起整體效能的下降。

query_cache_expire

快取資料的有效時間,單位為毫秒,取值:100~60000,預設值為1000

樣本:熱點新聞榜單

熱點新聞榜單資料放在讀寫分離架構的執行個體中,榜單每15分鐘重新整理一次,偶爾會出現熱點新聞導致此業務QPS達到5000以上。評估榜單能接受的最巨量資料延遲時間為30秒,開啟Proxy Query Cache後,將有效時間設定為30秒。

重要
  • 如果緩衝的資料在有效期間內被修改,修改後的資料不會同步至緩衝中,即相同的讀請求會擷取到緩衝中的髒資料,直至緩衝失效。

  • 您需要根據具體的業務情境和對髒資料的容忍度謹慎評估該參數的值,該值設定過小會降低緩衝的命中率,設定過大會導致用戶端在較長的時間內讀取到的是髒資料。

相關命令

您可以串連Tair (Redis OSS-compatible)執行個體,執行下述命令,查詢Querycache的使用方式,串連方法請參見通過redis-cli串連執行個體

QUERYCACHE KEYS

命令格式:QUERYCACHE KEYS

命令描述:查詢代理節點中已緩衝的所有熱點Key,將返回每個熱點Key的資料庫名和Key名稱資訊。

命令樣本:

QUERYCACHE KEYS

返回樣本:

1) 1) (integer) 0
   2) "key:000000000003"
2) 1) (integer) 0
   2) "key:000000000001"
3) 1) (integer) 0
   2) "key:000000000002"
4) 1) (integer) 0
   2) "key:000000000000"

QUERYCACHE INFO

命令格式:QUERYCACHE INFO

命令描述:擷取代理查詢快取的運行情況。

命令樣本:

QUERYCACHE INFO

返回樣本:

1) "put_qps:4.00"
2) "get_qps:16570.00"
3) "hit_rate:99.98"
4) "memory_size:180"
5) "query_count:4"
6) "bandwidth_limit_query_cnt:0"
7) "qps_limit_query_cnt:0"

返回樣本說明:

  • put_qps:資料節點每秒往Querycache寫入的次數。

  • get_qps:用戶端每秒從Querycache中讀取的次數。

  • hit_rate:緩衝的命中率。

  • memory_size:快取資料佔用的記憶體容量,單位為位元組。

  • query_count:已緩衝的請求的數量。

  • bandwidth_limit_query_cnt:因頻寬節流設定訪問Querycache被限流的次數,預設未開啟限制。

  • qps_limit_query_cnt:因QPS限制訪問Querycache被限流的次數,預設未開啟限制。

QUERYCACHE LISTALL

命令格式:QUERYCACHE LISTALL

命令描述:擷取已緩衝的所有請求命令。

命令樣本:

QUERYCACHE LISTALL

返回樣本:

1) 1) (integer) 0
   2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000000\r\n"
   3) (integer) 668
2) 1) (integer) 0
   2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000001\r\n"
   3) (integer) 668
3) 1) (integer) 0
   2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000003\r\n"
   3) (integer) 668
4) 1) (integer) 0
   2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000002\r\n"
   3) (integer) 667

返回樣本說明:每個請求命令的資訊由三行資訊組成,分別為資料庫名、請求命令的完整內容(格式遵照Redis協議規範)、剩餘存留時間(單位為毫秒)。