最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決 Redis 數(shù)據(jù)傾斜、熱點(diǎn)等問(wèn)題

 更新時(shí)間:2022年12月13日 11:46:04   作者:洗刷先生  
?單臺(tái)機(jī)器的硬件配置有上限制約,一般我們會(huì)采用分布式架構(gòu)將多臺(tái)機(jī)器組成一個(gè)集群,這篇文章主要介紹了解決 Redis 數(shù)據(jù)傾斜、熱點(diǎn)等問(wèn)題,需要的朋友可以參考下

Redis 作為一門(mén)主流技術(shù),應(yīng)用場(chǎng)景非常多,很多大中小廠面試都列為重點(diǎn)考察內(nèi)容

前幾天有星球小伙伴學(xué)習(xí)時(shí),遇到下面幾個(gè)問(wèn)題,來(lái)咨詢(xún) Tom哥

考慮到這些問(wèn)題比較高頻,工作中經(jīng)常會(huì)遇到,這里寫(xiě)篇文章系統(tǒng)講解下

 問(wèn)題描述:

1.如果redis集群出現(xiàn)數(shù)據(jù)傾斜,數(shù)據(jù)分配不均,該如何解決?

2.處理hotKey時(shí),為key創(chuàng)建多個(gè)副本,如k-1,k-2…, 如何讓這些副本能均勻?qū)懭??如何均勻訪(fǎng)問(wèn)?

3.redis使用hash slot來(lái)維護(hù)集群。與一致性哈希類(lèi)似,都可以避免全量遷移。為什么不直接使用一致性hash?

分布式緩存作為性能加速器,在系統(tǒng)優(yōu)化中承擔(dān)著非常重要的角色。相比本地緩存,雖然增加了一次網(wǎng)絡(luò)傳輸,大約占用不到 1 毫秒外,但是卻有集中化管理的優(yōu)勢(shì),并支持非常大的存儲(chǔ)容量。

分布式緩存領(lǐng)域,目前應(yīng)用比較廣泛的要數(shù) Redis 了,該框架是純內(nèi)存儲(chǔ)存,單線(xiàn)程執(zhí)行命令,擁有豐富的底層數(shù)據(jù)結(jié)構(gòu),支持多種維度的數(shù)據(jù)存儲(chǔ)和查找。

當(dāng)然,數(shù)據(jù)量一大,各種問(wèn)題就出現(xiàn)了,比如:數(shù)據(jù)傾斜、數(shù)據(jù)熱點(diǎn)等

 什么是數(shù)據(jù)傾斜?

 單臺(tái)機(jī)器的硬件配置有上限制約,一般我們會(huì)采用分布式架構(gòu)將多臺(tái)機(jī)器組成一個(gè)集群,下圖的集群就是由三臺(tái)Redis單機(jī)組成??蛻?hù)端通過(guò)一定的路由策略,將讀寫(xiě)請(qǐng)求轉(zhuǎn)發(fā)到具體的實(shí)例上。

由于業(yè)務(wù)數(shù)據(jù)特殊性,按照指定的分片規(guī)則,可能導(dǎo)致不同的實(shí)例上數(shù)據(jù)分布不均勻,大量的數(shù)據(jù)集中到了一臺(tái)或者幾臺(tái)機(jī)器節(jié)點(diǎn)上計(jì)算,從而導(dǎo)致這些節(jié)點(diǎn)負(fù)載多大,而其他節(jié)點(diǎn)處于空閑等待中,導(dǎo)致最終整體效率低下。 

 數(shù)據(jù)傾斜有哪些原因呢?

1、存在大key

比如存儲(chǔ)一個(gè)或多個(gè) String 類(lèi)型的 bigKey 數(shù)據(jù),內(nèi)存占用很大。

 Tom哥之前排查過(guò)這種問(wèn)題,有同事開(kāi)發(fā)時(shí)為了省事,采用JSON格式,將多個(gè)業(yè)務(wù)數(shù)據(jù)合并到一個(gè) value,只關(guān)聯(lián)一個(gè)key,導(dǎo)致了這個(gè)鍵值對(duì)容量達(dá)到了幾百M(fèi)。

頻繁的大key讀寫(xiě),內(nèi)存資源消耗比較重,同時(shí)給網(wǎng)絡(luò)傳輸帶了極大的壓力,進(jìn)而導(dǎo)致請(qǐng)求響應(yīng)變慢,引發(fā)雪崩效應(yīng),最后系統(tǒng)各種超時(shí)報(bào)警。

解決方案:

辦法非常簡(jiǎn)單,采用化整為零的策略,將一個(gè)bigKey拆分為多個(gè)小key,獨(dú)立維護(hù),成本會(huì)降低很多。當(dāng)然這個(gè)拆也講究些原則,既要考慮業(yè)務(wù)場(chǎng)景也要考慮訪(fǎng)問(wèn)場(chǎng)景,將關(guān)聯(lián)緊密的放到一起。

比如:有個(gè)RPC接口內(nèi)部對(duì) Redis 有依賴(lài),之前訪(fǎng)問(wèn)一次就可以拿到全部數(shù)據(jù),拆分將要控制單值的大小,也要控制訪(fǎng)問(wèn)的次數(shù),畢竟調(diào)用次數(shù)增多了,會(huì)拉大整體的接口響應(yīng)時(shí)間。 

2、HashTag 使用不當(dāng) 

Redis 采用單線(xiàn)程執(zhí)行命令,從而保證了原子性。當(dāng)采用集群部署后,為了解決mset、lua 腳本等對(duì)多key 批量操作,為了保證不同的 key 能路由到同一個(gè) Redis 實(shí)例上,引入了 HashTag 機(jī)制。 

用法也很簡(jiǎn)單,使用{}大括號(hào),指定key只計(jì)算大括號(hào)內(nèi)字符串的哈希,從而將不同key的健值對(duì)插入到同一個(gè)哈希槽。 

舉個(gè)例子: 

192.168.0.1:6380> CLUSTER KEYSLOT testtag
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT {testtag}
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT mykey1{testtag}
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT mykey2{testtag}
(integer) 764

 check 下業(yè)務(wù)代碼,有沒(méi)有引入HashTag,將太多的key路由到了一個(gè)實(shí)例。結(jié)合具體場(chǎng)景,考慮如何做下拆分。

就像 RocketMQ 一樣,很多時(shí)候只要能保證分區(qū)有序,就可以滿(mǎn)足我們的業(yè)務(wù)需求。具體實(shí)戰(zhàn)中,要找到這個(gè)平衡點(diǎn),而不是為了解決問(wèn)題而解決問(wèn)題。 

3、slot 槽位分配不均 

如果采用 Redis Cluster 的部署方式,集群中的數(shù)據(jù)庫(kù)被分為16384個(gè)槽(slot),數(shù)據(jù)庫(kù)中的每個(gè)健都屬于這16384個(gè)槽的其中一個(gè),集群中的每個(gè)節(jié)點(diǎn)可以處理的0個(gè)或最多16384個(gè)槽。 

 你可以手動(dòng)做遷移,將一個(gè)比較大的 slot 遷移到稍微空閑的機(jī)器上,保證存儲(chǔ)和訪(fǎng)問(wèn)的均勻性。

什么是緩存熱點(diǎn)? 

緩存熱點(diǎn)是指大部分甚至所有的業(yè)務(wù)請(qǐng)求都命中同一份緩存數(shù)據(jù),給緩存服務(wù)器帶來(lái)了巨大壓力,甚至超過(guò)了單機(jī)的承載上限,導(dǎo)致服務(wù)器宕機(jī)。 

解決方案: 

解決方案:

1、復(fù)制多份副本

我們可以在key的后面拼上有序編號(hào),比如key#01、key#02。。。key#10多個(gè)副本,這些加工后的key位于多個(gè)緩存節(jié)點(diǎn)上。

客戶(hù)端每次訪(fǎng)問(wèn)時(shí),只需要在原key的基礎(chǔ)上拼接一個(gè)分片數(shù)上限的隨機(jī)數(shù),將請(qǐng)求路由不到的實(shí)例節(jié)點(diǎn)。

注意:緩存一般都會(huì)設(shè)置過(guò)期時(shí)間,為了避免緩存的集中失效,我們對(duì)緩存的過(guò)期時(shí)間盡量不要一樣,可以在預(yù)設(shè)的基礎(chǔ)上增加一個(gè)隨機(jī)數(shù)。

至于數(shù)據(jù)路由的均勻性,這個(gè)由 Hash 算法來(lái)保證

2、本地內(nèi)存緩存

把熱點(diǎn)數(shù)據(jù)緩存在客戶(hù)端的本地內(nèi)存中,并且設(shè)置一個(gè)失效時(shí)間。對(duì)于每次讀請(qǐng)求,將首先檢查該數(shù)據(jù)是否存在于本地緩存中,如果存在則直接返回,如果不存在再去訪(fǎng)問(wèn)分布式緩存的服務(wù)器。

好思路 

本地內(nèi)存緩存徹底“解放”了緩存服務(wù)器,不會(huì)對(duì)緩存服務(wù)器有任何壓力。 

 缺點(diǎn):實(shí)時(shí)感知最新的緩存數(shù)據(jù)有點(diǎn)麻煩,會(huì)產(chǎn)生數(shù)據(jù)不一致的情況。我們可以設(shè)置一個(gè)比較短的過(guò)期時(shí)間,采用被動(dòng)更新。當(dāng)然,也可以用監(jiān)控機(jī)制,如果感知到數(shù)據(jù)已經(jīng)發(fā)生了變化,及時(shí)更新本地緩存。

 Redis Cluster 為什么不用一致性Hash?

Redis Cluster 集群有16384個(gè)哈希槽,每個(gè)key通過(guò)CRC16校驗(yàn)后對(duì)16384取模來(lái)決定放置哪個(gè)槽。集群的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分hash槽,舉個(gè)例子,比如當(dāng)前集群有3個(gè)節(jié)點(diǎn),那么 node-1 包含 0 到 5460 號(hào)哈希槽,node-2 包含 5461 到 10922 號(hào)哈希槽,node-3包含 10922  到 16383 號(hào)哈希槽。

 

 一致性哈希算法是 1997年麻省理工學(xué)院的 Karger 等人提出了,為的就是解決分布式緩存的問(wèn)題。

 一致性哈希算法本質(zhì)上也是一種取模算法,不同于按服務(wù)器數(shù)量取模,一致性哈希是對(duì)固定值 2^32 取模。

 公式 = hash(key) % 2^32

 其取模的結(jié)果必然是在 [0, 2^32-1] 這個(gè)區(qū)間中的整數(shù),從圓上映射的位置開(kāi)始順時(shí)針?lè)较蛘业降牡谝粋€(gè)節(jié)點(diǎn)即為存儲(chǔ)key的節(jié)點(diǎn)

 一致性哈希算法大大緩解了擴(kuò)容或者縮容導(dǎo)致的緩存失效問(wèn)題,只影響本節(jié)點(diǎn)負(fù)責(zé)的那一小段key。如果集群的機(jī)器不多,且平時(shí)單機(jī)的負(fù)載水位很高,某個(gè)節(jié)點(diǎn)宕機(jī)帶來(lái)的壓力很容易引發(fā)雪崩效應(yīng)。

舉個(gè)例子:

Redis 集群 總共有4臺(tái)機(jī)器,假設(shè)數(shù)據(jù)分布均衡,每臺(tái)機(jī)器承擔(dān) 四分之一的流量,如果某一臺(tái)機(jī)器突然掛了,順時(shí)針?lè)较蛳乱慌_(tái)機(jī)器將要承擔(dān)這多出來(lái)的 四分之一 流量,最終要承擔(dān) 二分之一 的流量,還是有點(diǎn)恐怖。

但是如果采用 CRC16計(jì)算后,并結(jié)合槽位與實(shí)例的綁定關(guān)系,無(wú)論是擴(kuò)容還是縮容,只需將相應(yīng)節(jié)點(diǎn)的key做下數(shù)據(jù)平滑遷移,廣播存儲(chǔ)新的槽位映射關(guān)系,不會(huì)產(chǎn)生緩存失效,靈活性很高。

另外,如果服務(wù)器節(jié)點(diǎn)配置存在差異化,我們可以自定義分配不同節(jié)點(diǎn)負(fù)責(zé)的 slot 編號(hào),調(diào)整不同節(jié)點(diǎn)的負(fù)載能力,非常方便。

當(dāng)然可能有些小伙伴會(huì)好奇,Redis Cluster 為什么是  16384 個(gè)槽位?可以看下 Tom哥 之前寫(xiě)的一篇文章

到此這篇關(guān)于如何解決 Redis 數(shù)據(jù)傾斜、熱點(diǎn)等問(wèn)題的文章就介紹到這了,更多相關(guān)Redis 數(shù)據(jù)傾斜、熱點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis拒絕連接問(wèn)題分析與解決方案

    Redis拒絕連接問(wèn)題分析與解決方案

    在分布式系統(tǒng)中,Redis作為高性能的內(nèi)存數(shù)據(jù)庫(kù),廣泛用于緩存、消息隊(duì)列、會(huì)話(huà)管理等場(chǎng)景,然而,隨著系統(tǒng)復(fù)雜度和并發(fā)量的增加,Redis連接問(wèn)題時(shí)有發(fā)生,尤其是"拒絕連接"的錯(cuò)誤,本文將深入分析Redis拒絕連接的常見(jiàn)原因,并詳細(xì)講解每種原因的解決方案
    2024-10-10
  • 利用Redis的有序集合實(shí)現(xiàn)排行榜功能實(shí)例代碼

    利用Redis的有序集合實(shí)現(xiàn)排行榜功能實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Redis的有序集合實(shí)現(xiàn)排行榜功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Redis源碼解析:集群手動(dòng)故障轉(zhuǎn)移、從節(jié)點(diǎn)遷移詳解

    Redis源碼解析:集群手動(dòng)故障轉(zhuǎn)移、從節(jié)點(diǎn)遷移詳解

    這篇文章主要介紹了Redis源碼解析:集群手動(dòng)故障轉(zhuǎn)移、從節(jié)點(diǎn)遷移的相關(guān)內(nèi)容,涉及通過(guò)集群定時(shí)器函數(shù)clusterCron實(shí)現(xiàn)從節(jié)點(diǎn)遷移等知識(shí),具有一定參考價(jià)值,需要的朋友可以了解。
    2017-10-10
  • Windows環(huán)境部署Redis集群

    Windows環(huán)境部署Redis集群

    這篇文章主要為大家詳細(xì)介紹了Windows環(huán)境部署Redis集群的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Redis?Brpop?命令作用詳解

    Redis?Brpop?命令作用詳解

    BRPOP?是一個(gè)阻塞的列表彈出原語(yǔ),該命令會(huì)按照給出的?key?順序查看?list,并在找到的第一個(gè)非空?list?的尾部彈出一個(gè)元素,今天通過(guò)本文給大家介紹Redis?Brpop?命令相關(guān)知識(shí),感興趣的朋友一起看看吧
    2023-07-07
  • redis三種高可用方式部署的實(shí)現(xiàn)

    redis三種高可用方式部署的實(shí)現(xiàn)

    這篇文章主要介紹了redis三種高可用方式部署的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)方法

    redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)方法

    redis在2.6推出了腳本功能,允許開(kāi)發(fā)者使用Lua語(yǔ)言編寫(xiě)腳本傳到redis中執(zhí)行。本文就介紹了redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)方法,感興趣的可以了解一下
    2021-11-11
  • redis+lua實(shí)現(xiàn)分布式限流的示例

    redis+lua實(shí)現(xiàn)分布式限流的示例

    本文主要介紹了redis+lua實(shí)現(xiàn)分布式限流的示例,可以實(shí)現(xiàn)復(fù)雜的限流邏輯,如滑動(dòng)窗口限流,并且避免了多步操作導(dǎo)致的并發(fā)問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Redis 數(shù)據(jù)類(lèi)型Streams詳解

    Redis 數(shù)據(jù)類(lèi)型Streams詳解

    Redis Streams是Redis 5.0新增的數(shù)據(jù)類(lèi)型,提供了一種日志結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)方式,這種類(lèi)型適合用于構(gòu)建消息隊(duì)列、事件日志和處理時(shí)間序列數(shù)據(jù)的應(yīng)用,本文介紹Redis 數(shù)據(jù)類(lèi)型Streams相關(guān)知識(shí),感興趣的朋友一起看看吧
    2024-10-10
  • Linux下Redis集群搭建全過(guò)程(主從+哨兵)

    Linux下Redis集群搭建全過(guò)程(主從+哨兵)

    這篇文章主要介紹了Linux下Redis集群搭建全過(guò)程(主從+哨兵),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

大悟县| 丹阳市| 华宁县| 雷山县| 昌邑市| 保山市| 平利县| 吉林省| 稻城县| 康定县| 茶陵县| 龙口市| 古田县| 海安县| 泾川县| 宜君县| 潼关县| 宜春市| 松江区| 西藏| 都兰县| 岗巴县| 白河县| 洛阳市| 凉山| 沅江市| 霍州市| 婺源县| 富源县| 民县| 易门县| 磐石市| 阳朔县| 酉阳| 英山县| 前郭尔| 襄城县| 沅江市| 彭山县| 扎囊县| 沙湾县|