為更好地改善對熱點Key的發起大量讀請求導致的訪問傾斜,Tair (Redis OSS-compatible)新增代理查詢快取功能(Proxy Query Cache),啟用該功能後,代理節點會緩衝熱點Key對應的請求和查詢結果,當在有效時間內收到同樣的請求時直接返回結果至用戶端,無需和後端的資料分區互動。
前提條件
執行個體為Tair(企業版)記憶體型或持久記憶體型。
執行個體為叢集架構代理模式或讀寫分離架構。
應用情境
需要解決或預防熱點Key的讀請求引發的訪問傾斜問題,即由於大量的讀請求集中在某些Key形成了熱點Key,從而導致某些資料分區的CPU使用率和流量使用率持續保持高位並接近100%。
由於代理節點中緩衝的熱點Key的查詢結果在有效時間內不會更新,需要確認業務上能接受在資料更新到代理緩衝失效之前的這段時間(即代理緩衝的有效期間)內,讀取到的是舊資料。這是對強一致性的犧牲,以換取更高的系統效能和穩定性。商務邏輯需要能夠容忍這種可能出現的短暫資料不一致現象,確保即使在資料略有延遲的情況下,也不會影響到核心商務程序。
工作原理
Tair (Redis OSS-compatible)會根據高效的排序和統計演算法識別出執行個體中存在的熱點Key(通常熱點Key的QPS大於5,000),開啟該功能後,代理節點Proxy會根據設定的規則緩衝熱點Key的請求和查詢結果(僅緩衝熱點Key的查詢結果,無需緩衝整個Key)。當在緩衝有效時間內收到相同的請求時,Proxy會直接返回結果至用戶端,無需和後端的資料分區執行互動。如果熱點Key的查詢結果發生改變,緩衝不會更新。
您可以通過執行個體診斷功能分析執行個體是否存在訪問傾斜;您還可以通過即時Top Key統計功能查詢執行個體的熱點Key資訊。
設定方法及參數說明
您需要通過修改執行個體參數的方式管理該功能,各參數解釋如下。具體操作,請參見設定執行個體參數。
參數 | 說明 |
query_cache_enabled | 是否啟用代理查詢快取功能,取值:
重要 啟用代理查詢快取功能的使用情境:
|
query_cache_mode | 代理查詢快取的工作模式,取值:
重要 由於代理節點的緩衝空間有限(代理節點每個線程100 MB),如果設定該參數的值為1,代理節點將按照LRU演算法進行淘汰,可能降低緩衝的命中率,從而引起整體效能的下降。 |
query_cache_expire | 快取資料的有效時間,單位為毫秒,取值:100~60000,預設值為1000。 重要
|
相關命令
您可以串連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協議規範)、剩餘存留時間(單位為毫秒)。