Big keys(大Key)與Hot keys(熱Key)可能導致服務效能下降、請求逾時,甚至引發系統故障。本文介紹如何快速找出和最佳化大Key與熱Key,分析其產生原因及影響,並提供預防措施以降低對業務的影響。
步驟一:快速找出大Key和熱Key
阿里雲控制台工具
Tair和Redis在控制台提供了Top Key統計和離線全量Key分析功能協助您快速找出大Key與熱Key。
|
方法 |
使用限制 |
說明 |
操作步驟 |
|
Top Key統計(推薦) |
僅Redis開源版5.0及以上版本和Tair(企業版)記憶體型、持久記憶體型支援該功能。 |
|
|
|
磁碟型執行個體不支援該功能。 |
|
如果您的執行個體不能使用上述功能,請參考以下方法。
其他方法找出大Key和熱Key
步驟二:最佳化大Key與熱Key
大Key
|
方案 |
適用情境 |
操作建議 |
|
清理到期資料 |
大量到期資料堆積,如HASH中未清理的增量資料。 |
通過HSCAN命令配合HDEL命令對失效資料進行清理,避免清理大量資料造成執行個體阻塞。 |
|
壓縮大Key |
JSON、XML文本資料等可壓縮資料,如日誌、配置。 |
說明
壓縮和解壓縮操作需要消耗額外的CPU資源,可能影響處理效能。 |
|
拆分大Key |
高頻訪問的HASH、ZSET等,如熱門排行榜。 |
拆分大Key能有效避免資料扭曲。 |
|
轉存大Key |
String類型大檔案或BLOB。 |
將不適用資料存至其它儲存(如OSS),並在執行個體中刪除此類資料。
|
熱Key
|
方案 |
適用情境 |
操作建議 |
|
在叢集架構中對熱Key進行複製 |
熱Key作為整體儲存在單一分區,無法通過遷移部分資料分散請求。 |
將熱Key複製並遷移至其他資料分區,例如將熱Key foo複製出3個內容完全一樣的Key並命名為foo2、foo3、foo4,將這三個Key遷移到其他資料分區來解決單個資料分區的熱Key壓力。 說明
該方案的缺點是需修改代碼維護多個副本,且多副本間的資料一致性難以保障(例如更新操作需同步所有副本)。建議將該方案作為臨時解決方案,用於緩解緊急問題。 |
|
讀多寫少 |
如果開啟後讀請求負載依舊很高,可通過增加唯讀節點數量進一步緩解讀請求負載。 說明
在請求量極大的情境下,主備同步會產生不可避免的延遲,此時會出現讀取到髒資料的問題。因此,在讀、寫壓力都較大且對資料一致性要求很高的情境下,不推薦開啟讀寫分離。 開啟讀寫分離後,若仍觀察到主節點CPU高、唯讀節點空閑,通常有兩方面原因:一是讀寫分離僅分流讀請求,寫請求(含寫熱Key)始終由主節點處理;二是部分讀命令有特殊的轉寄規則,例如SCAN命令會固定轉寄至主節點執行(HSCAN、SSCAN、ZSCAN則通過Slot模數均勻分配至主節點和唯讀節點),因此大量使用SCAN時主節點CPU仍會偏高。路由規則請參見讀寫分離功能。此類情境需通過拆分熱Key、改用HSCAN等命令,或調整叢集分區數來分散主節點壓力。 |
步驟三:預防大Key和熱Key影響業務
大Key和熱Key產生的原因
Tair和Redis的最小資料分布粒度為Key。單個Key將儲存在特定的資料分區中,且不會被拆分。業務規劃不足、無效資料的堆積以及訪問量的突增等因素,均會使執行個體產生大Key與熱Key,如:
|
類別 |
原因 |
|
大Key |
|
|
熱Key |
|
大Key和熱Key帶來的影響
|
類別 |
影響 |
|
大Key |
|
|
熱Key |
|
預防策略
|
策略 |
說明 |
|
設定合理的CPU、記憶體、串連數使用率等警示閾值進行警示,例如記憶體使用量率超過70%、記憶體在1小時內增長率超過20%等。出現警示時,按照本文步驟一和步驟二的指引定位並最佳化大Key和熱Key,在其發展到影響業務之前解決。 |
|
|
使用Tair(企業版)避開失效資料的清理工作 |
針對hash類型的大key情境,Tair(企業版)提供了增強型資料結構 TairHash。它支援為每個 field 設定到期時間和版本。通過合理使用 TairHash,可以顯著減少營運負擔、簡化業務代碼複雜度,並有效應對大 Key 和熱 Key 帶來的問題。 |