Big keys(大Key)與Hot keys(熱Key)可能導致服務效能下降、使用者體驗變差,甚至引發系統故障。本文介紹如何快速找出和最佳化大Key與熱Key,分析其產生原因及可能引發的問題,並提供預防措施以降低對業務的影響。
快速找出大Key和熱Key
阿里雲自研工具
Tair和Redis在控制台提供了Top Key統計和離線全量Key分析功能協助您快速找出大Key與熱Key。
方法 | 使用限制 | 說明 |
方法 | 使用限制 | 說明 |
Top Key統計(推薦) |
| |
磁碟型執行個體不支援該功能。 |
|
如果您的執行個體不能使用上述功能,請參考以下方法。
最佳化大Key與熱Key
類別 | 處理方法 | 說明 |
類別 | 處理方法 | 說明 |
大Key | 對大Key進行壓縮 | 建議在資料寫入緩衝前,通過序列化或壓縮演算法減少大Key的儲存空間。若壓縮後仍過大,可進一步拆分Key。 |
對大Key進行拆分 | 例如將含有數萬成員的一個HASH Key拆分為多個HASH Key,並確保每個Key的成員數量在合理範圍。拆分大Key能有效避免資料扭曲。 | |
對大Key進行清理 | 將不適用資料存至其它儲存,並在執行個體中刪除此類資料。
| |
對到期資料進行定期清理 | 堆積大量到期資料會造成大Key的產生,例如在HASH資料類型中,由於忽略資料時效性,可能會以增量形式不斷寫入大量資料。可以通過定時任務的方式對失效資料進行清理。 在清理HASH資料時,建議通過HSCAN命令配合HDEL命令對失效資料進行清理,避免清理大量資料造成執行個體阻塞。 | |
熱Key | 在叢集架構中對熱Key進行複製 | 由於熱Key作為整體儲存在單一分區,無法通過遷移部分資料分散請求,導致單個資料分區的壓力無法下降。此時,可以將對應熱Key進行複製並遷移至其他資料分區,例如將熱Key foo複製出3個內容完全一樣的Key並命名為foo2、foo3、foo4,將這三個Key遷移到其他資料分區來解決單個資料分區的熱Key壓力。 該方案的缺點是需修改代碼維護多個副本,且多副本間的資料一致性難以保障(例如更新操作需同步所有副本)。建議將該方案作為臨時解決方案,用於緩解棘手問題。 |
開啟讀寫分離功能 | 若熱Key由讀請求引起,您可以開啟讀寫分離功能來降低每個資料分區的讀請求負載,如果開啟後讀請求負載依舊很高,可通過增加唯讀節點數量進一步緩解讀請求負載。 讀寫分離同樣存在缺點,在請求量極大的情境下,讀寫分離會產生不可避免的延遲,此時會出現讀取到髒資料的問題。因此,在讀、寫壓力都較大且對資料一致性要求很高的情境下,不推薦開啟讀寫分離。 | |
開啟QueryCache功能 | 開啟該功能後,Tair和Redis會根據演算法識別出熱Key(通常熱Key的QPS大於5,000),代理節點Proxy會緩衝熱Key的請求和查詢結果(僅緩衝點Key的查詢結果,無需緩衝整個Key)。當在緩衝有效時間內收到相同的請求時,Proxy會直接返回結果至用戶端,無需和後端的資料分區執行互動。更多資訊,請參見通過Proxy Query Cache最佳化熱點Key問題。 |
為什麼會產生大Key和熱Key?
Tair和Redis的最小資料分布粒度為Key。單個Key將儲存在特定的資料分區中,且不會被拆分。業務規劃不足、無效資料的堆積以及訪問量的突增等因素,均會使執行個體產生大Key與熱Key,如:
大key
在不適用的情境下使用Tair和Redis,易造成Key的value過大,如使用String類型的Key存放大體積二進位檔案型資料;
業務上線前規劃設計不足,沒有對Key中的成員進行合理的拆分,造成個別Key中的成員數量過多;
未定期清理無效資料,造成如HASH類型Key中的成員持續不斷地增加;
使用LIST類型Key的業務消費側發生代碼故障,造成對應Key的成員只增不減。
熱key
預期外的訪問量陡增,如突然出現的爆款商品、訪問量暴漲的熱點新聞、直播間某主播搞活動帶來的大量刷屏點贊、遊戲中某地區發生多個工會之間的戰鬥涉及大量玩家等。
大Key和熱Key可能會引發的問題
類別 | 說明 |
類別 | 說明 |
大Key |
|
熱Key |
|
如何預防大Key和熱Key影響業務
方法 | 說明 |
方法 | 說明 |
配置監控警示 | 您可以通過監控系統設定合理的CPU、記憶體、串連數使用率等警示閾值進行警示,例如記憶體使用量率超過70%、記憶體在1小時內增長率超過20%等。出現警示時,根據上文內容找到並最佳化大Key和熱Key,在其發展到影響業務之前解決。更多資訊,請參見警示設定。 |
使用Tair(企業版)避開失效資料的清理工作 | 針對hash類型的大key情境,Tair(企業版)提供了增強型資料結構 TairHash。它支援為每個 field 設定到期時間和版本,突破了 Redis Hash 僅能為整個 Key 設定到期時間的限制。同時,TairHash 使用高效的 Active Expire 演算法,在幾乎不影響回應時間的情況下完成field的到期判斷與刪除操作。通過合理使用 TairHash,可以顯著減少營運負擔、簡化業務代碼複雜度,並有效應對大 Key 和熱 Key 帶來的問題。 |