本期作者 侯曉 嗶哩嗶哩高級測試開發工程師
日常生產中經常會碰到由于redis集群的不當訪問,造成的線上問題。其中比較常見的是BigKey(大key)和HotKey(熱key)的問題,這類問題不止會使服務的性能下降,還會影響用戶正常使用功能,甚至會造成大范圍的服務故障,故障有時還會發生連環效應,導致更加嚴重的后果。我們通過本文一起來探索,測試如何快速發現“大key”和“熱key”的問題。
一、什么是BigKey、HotKey?
BigKey:俗稱“大key”,是指redis在日常生產的過程中,某些key所占內存空間過大。
通俗來說,redis是key-value的存儲方式,當一個key所對應的存儲數值達到一定程度,就會出現大key的情況。redis里有多種數據存儲結構,如String、List、Hash等,每種存儲結構都有能夠承載的數據限值。當一個key包含的內容接近限制,或者高于平均值,大key就產生了。
舉個例子:該list存儲了100MB的數據(假設該Redis實例可用內存空間僅150M,有1000個key,一個key就占用了 100M),在查找某個數據的過程中由于處理太久,導致請求阻塞(小tips:redis單線程特性)。體現在業務上就是頻繁請求超時、頁面404等。上述key,就是一個大key。
HotKey:俗稱“熱key”,一個key對應在一個redis分片上,當短時間內大量的請求打到該分片上,key被頻繁訪問,該key就是熱key。
我們通過下圖來簡單了解下hotkey的訪問關系:
當大量的請求,經過分發和計算,最終集中于同一個redis實例下的某個key時,該key由于被請求頻率過高,而占用掉了大量資源。而其他分片,由于key的不合理分配導致請求量較少。整個redis集群呈現出了資源使用不均衡的現象。
舉個例子:一線女明星官宣領證結婚,短時間內該女星微博賬號被訪問量激增(假設該賬號內容被同步在緩存,賬號id作為key),微博服務癱瘓(不具備任何實時參考性,僅作為虛擬的例子)。
在該場景下,上述key被大量訪問,造成熱key。
二、服務中的bigkey和
hotkey會導致什么問題
我們可以通過上述兩種key的特性,來簡單分析可能出現的幾種問題。
大key,主要的問題是一個key所占空間太大,內存空間分配不均衡(小tips:redis是內存型key-value數據庫)。那就可能引發以下問題:
1.數據請求大量超時:redis是單線程的,當一個key數據響應的久一點,就會造成后續請求頻繁超時。如果服務容災措施考慮得不夠,會引發更大的問題。
2.侵占帶寬網絡擁堵:當一個key所占空間過大,多次請求就會占用較大的帶寬,直接影響服務的正常運行。
3.內存溢出或處理阻塞:當一個較大的key存在時,持續新增,key所占內存會越來越大,嚴重時會導致內存數據溢出;當key過期需要刪除時,由于數據量過大,可能發生主庫較響應時間過長,主從數據同步異常(刪除掉的數據,從庫還在使用)。
熱key,熱key的問題是單點訪問頻率過高。那就可能引發以下問題:
1.分片服務癱瘓:上述有提到,redis集群會分很多個分片,每個分片有其要處理的數據范圍。當某一個分片被頻繁請求,該分片服務就可能會癱瘓。
2.Redis 分布式集群優勢弱化:如1所述,如果請求不夠均衡,過于單點,那么redis分布式集群的優勢也必然被弱化。
3.可能造成資損:在極端場景下,容易發生邊界數據處理不及時,在訂單等場景下,可能造成資損。
4.引發緩存擊穿:我們都知道,當緩存請求不到,就會去請求數據庫。如果請求過于集中,redis承載不了,就會有大量請求打到數據庫。此時,可能引發數據庫服務癱瘓。
5.cpu占用高,影響其他服務:單個分片cpu占用率過高,其他分片無法擁有cpu資源,從而被影響。
三、測試過程中如何發現bigkey和hotkey
1.業務分析結合技術方案:
通常需要對業務場景做分析,結合技術方案去判斷是否會出現大key、熱key的問題。比如說:
(1)購物車場景,當一個購物車的key設計,沒有上限,沒有其他隨機值約束,僅使用了mid。這個時候就要注意,如果有個購物狂,一次加購5w件商品怎么辦?
(2)活動資格列表場景,當一個活動的資格查詢list被放入一個key,活動期間頻繁的查詢和操作。這個時候就要注意,list的數據量有多少?查詢資格的操作是否集中?如果集中,qps是多少?
2.借助redis命令來發現:
查看bigkey:redis-cli -a 登錄密碼 --bigkeys
查看hotkey:redis-cli -a 登錄密碼 --hotkeys
例:bigkey
(圖片源數據來源于網絡)
3.借助工具:
(1)可使用redis可視化工具進行查看(例如:another redis desktop manager)
可視化的工具可以明確給出redis集群當下的信息,經過簡要數據分析,便可觀測異常。
(2)借助市面上的開源工具(本文暫不對此深入探討)
redis-rdb-tools(附:https://Github.com/sripathikrishnan/redis-rdb-tools)
以上,是日常工作中對于發現redis緩存中bigkey和hotkey的思考,除上述工具和手段之外,還有很多公司針對業務特性自研了key檢測工具,歡迎分享和交流~~
參考文檔:
(1) redis命令:Redis 命令參考 — Redis 命令參考
(2) Github: https://github.com/sripathikrishnan/redis-rdb-tools
(3) another redis desktop manager下載地址AnotherRedisDesktopManager 發行版 - Gitee.com