網站首頁 編程語言 正文
寫在前面
我們在使用Redis分片集群時,集群最好的狀態就是每個實例可以處理相同或相近比例的請求,但如果不是這樣,則會出現某些實例壓力特別大,而某些實例特別空閑的情況發生,本文就一起來看下這種情況是如何發生的以及如何處理。
1:什么是數據傾斜
數據傾斜分為兩種,第一種是數據量傾斜,第二種是數據訪問傾斜,定義如下:
- 數據量傾斜:數據分布的不均勻,導致某些實例數據特別多,進而導致處理的請求量大
- 數據訪問傾斜:數據分布均勻,但是某些實例存在熱點數據,進而導致處理的請求量大
可以看到不管是數據量傾斜,還是數據訪問傾斜,最終導致的結果都是發生傾斜的實例處理了更多的數據請求,壓力增大。
2:數據量傾斜
數據量傾斜最常見的原因就是在手動劃分slot時,分配不均勻,除此之外,還有big key,hash tag,分別來看下。
2.1:slot分配不均勻
slot分配不均勻一般是由于手動分配造成,或者是因為某個實例節點配置較高,為了更加充分的利用其計算機資源,有意的給其分配更多的slot,但是這個多出的量其實是不好預估的,所以對于因為計算機性能差異有意分配的造成的slot不均勻還是要盡量避免,即保證所有的實例節點都具有相同的配置,然后將slot進行均勻分配。如果是已經發生了slot分配不均勻,我們可以通過遷移slot的方式來處理,首先通過cluster slots
命令查看當前slot的分配情況:
上圖slot0~4095
分配到了實例192.168.10.3:6379
,slot12288~16383
分配到了實例192.168.10.5:6379
。如下是一個slot遷移的例子。
假設我們要把 Slot 300 從源實例(ID 為 3)遷移到目標實例(ID 為 5),那要怎么做呢?
第1步,我們先在目標實例5上執行下面的命令,將Slot 300的源實例設置為實例 3,表示要從實例 3 上遷入 Slot 300。
第2步,在源實例 3 上,我們把 Slot 300 的目標實例設置為 5,這表示,Slot 300 要遷出到實例 5 上,如下所示:
第3步,從 Slot 300 中獲取 100 個 key。因為 Slot 中的 key 數量可能很多,所以我們需要在客戶端上多次執行下面的這條命令,分批次獲得并遷移 key。
第4步,我們把剛才獲取的 100 個 key 中的 key1 遷移到目標實例 5 上(IP 為 192.168.10.5),同時把要遷入的數據庫設置為 0 號數據庫,把遷移的超時時間設置為 timeout。我們重復執行 MIGRATE 命令,把 100 個 key 都遷移完。
最后,我們重復執行第 3 和第 4 步,直到 Slot 中的所有 key 都遷移完成。
從Redis3.0.6開始,你也可以使用KEYS選項,一次遷移多個key(key1、2、3),這樣可以提升遷移效率。
2.2:big key
bigkey,主要包括string的值特別大,和集合類型的元素特別多兩種情況,對于string,我們需要在業務上處理,分散到多個key存儲,然后在業務上多次獲取,并進行合并,比如如下劃分:
key: names 劃分為 key: name:1_1000 ... name:100001_101001
其實這里是用到了分片的思想,對于集合的處理方式和string也是類似的,比如有一個包含100萬個元素的hash集合user:info
,分片存儲后如下:
key: user:info key: user:info:1_100000,user:info:100001_20000,...,user:info:900001_1000000
對于bigkey我們還是要在業務上盡量避免,因為bigkey的副作用不僅僅如此,還有如數據同步慢,數據恢復慢,刪除慢等。
2.3:hash tag
我們正常設置key,計算其slot值的方式是crc16(key)%16384
,但是如果是使用了{}
,比如keypart1:{keypart2}
,則計算的邏輯就變成了crc16(keypart2)%16384
,一般用在希望某幾類key分布到同一個實例,進而可以方便的進行某些操作的場景,如事務,簡單的計算等,但是一般帶來的的負面影響要比收益大的多,比如造成這里分析的數據傾斜問題,數據傾斜影響的是整個Redis實例,影響更大,所以在實踐中要盡量避免使用hash tag。
3:數據訪問傾斜
數據訪問傾斜出現的場景一般就是熱點數據,比如首頁的新聞,某明星出軌離婚等爆點新聞,對于這類問題一般有如下的解決方法:
1:拷貝幾份數據,以分散到不同的實例
? ? 比如news:1,可以虛擬出幾份數據,如news:1:A,news:1:B,...news:1:Z,客戶端訪問時隨機的增加A~Z的后綴,分散壓力,這種方法可以用于只讀的熱點數據
2:增加機器配置
? ? 這種方法是針對讀寫數據,因為如果是按照方案1,數據的一致性將會帶來額外的性能開銷,以及更多潛在的bug。
原文鏈接:https://blog.csdn.net/wang0907/article/details/128373795
相關推薦
- 2022-06-02 詳解IIS在ASP.NET?Core下的兩種部署模式_實用技巧
- 2022-05-20 Python異常之常見的Bug類型解決方法_python
- 2022-08-01 GoLand一鍵上傳項目到遠程服務器的方法步驟_Golang
- 2022-07-21 centos docker容器優化清理磁盤空間以及內存占用
- 2022-11-21 如何使用正則表達式對輸入數字進行匹配詳解_正則表達式
- 2022-08-30 詳解Oracle控制文件及日志文件的管理問題_oracle
- 2022-09-02 Pytorch-LSTM輸入輸出參數方式_python
- 2022-05-05 Python學習之流程控制與條件判斷總結_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支