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

為什么RedisCluster設(shè)計成16384個槽

 更新時間:2021年09月23日 09:25:01   作者:追求極致  
本文主要介紹了為什么RedisCluster設(shè)計成16384個槽,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

親愛的同學(xué)們,你是否使用過Redis集群呢?那Redis集群的原理又是什么呢?記住下面兩句話:

  • Redis Sentinal著眼于高可用,在master宕機(jī)時會自動將slave提升為master,繼續(xù)提供服務(wù)。
  • Redis Cluster著眼于擴(kuò)展性,在單個redis內(nèi)存不足時,使用Cluster進(jìn)行分片存儲。

一、數(shù)據(jù)分片策略

布式數(shù)據(jù)存儲方案中最為重要的一點就是數(shù)據(jù)分片,也就是所謂的 Sharding。為了使得集群能夠水平擴(kuò)展,首要解決的問題就是如何將整個數(shù)據(jù)集按照一定的規(guī)則分配到多個節(jié)點上,常用的數(shù)據(jù)分片的方法有:范圍分片,哈希分片,一致性哈希算法和虛擬哈希槽等。

范圍分片假設(shè)數(shù)據(jù)集是有序,將順序相臨近的數(shù)據(jù)放在一起,可以很好的支持遍歷操作。范圍分片的缺點是面對順序?qū)憰r,會存在熱點。比如日志類型的寫入,一般日志的順序都是和時間相關(guān)的,時間是單調(diào)遞增的,因此寫入的熱點永遠(yuǎn)在最后一個分片。對于關(guān)系型的數(shù)據(jù)庫,因為經(jīng)常性的需要表掃描或者索引掃描,基本上都會使用范圍的分片策略。

我們?yōu)榱藢⒉煌?key 分散放置到不同的 redis 節(jié)點,通常的做法是獲取 key 的哈希值,然后根據(jù)節(jié)點數(shù)來求模,但這種做法有其明顯的弊端,當(dāng)我們需要增加或減少一個節(jié)點時,會造成大量的 key 無法命中,這種比例是相當(dāng)高的,所以就有人提出了一致性哈希的概念。

一致性哈希有四個重要特征:

  • 均衡性:也有人把它定義為平衡性,是指哈希的結(jié)果能夠盡可能分布到所有的節(jié)點中去,這樣可以有效的利用每個節(jié)點上的資源。
  • 單調(diào)性:當(dāng)節(jié)點數(shù)量變化時哈希的結(jié)果應(yīng)盡可能的保護(hù)已分配的內(nèi)容不會被重新分派到新的節(jié)點。
  • 分散性和負(fù)載:這兩個其實是差不多的意思,就是要求一致性哈希算法對 key 哈希應(yīng)盡可能的避免重復(fù)。

二、Redis的分片機(jī)制

但是:Redis 集群沒有使用一致性hash, 而是引入了哈希槽的概念。

Redis Cluster 采用虛擬哈希槽分區(qū),所有的鍵根據(jù)哈希函數(shù)映射到 0 ~ 16383 整數(shù)槽內(nèi),每個key通過CRC16校驗后對16384取模來決定放置哪個槽(Slot),每一個節(jié)點負(fù)責(zé)維護(hù)一部分槽以及槽所映射的鍵值數(shù)據(jù)。

計算公式:slot = CRC16(key) & 16383。

這種結(jié)構(gòu)很容易添加或者刪除節(jié)點,并且無論是添加刪除或者修改某一個節(jié)點,都不會造成集群不可用的狀態(tài)。使用哈希槽的好處就在于可以方便的添加或移除節(jié)點。

  • 當(dāng)需要增加節(jié)點時,只需要把其他節(jié)點的某些哈希槽挪到新節(jié)點就可以了;
  • 當(dāng)需要移除節(jié)點時,只需要把移除節(jié)點上的哈希槽挪到其他節(jié)點就行了。

三、Redis 虛擬槽分區(qū)的特點

  • 解耦數(shù)據(jù)和節(jié)點之間的關(guān)系,簡化了節(jié)點擴(kuò)容和收縮難度。
  • 節(jié)點自身維護(hù)槽的映射關(guān)系,不需要客戶端或者代理服務(wù)維護(hù)槽分區(qū)元數(shù)據(jù)
  • 支持節(jié)點、槽和鍵之間的映射查詢,用于數(shù)據(jù)路由,在線集群伸縮等場景。

四、 Redis 集群伸縮的原理

Redis 集群提供了靈活的節(jié)點擴(kuò)容和收縮方案。在不影響集群對外服務(wù)的情況下,可以為集群添加節(jié)點進(jìn)行擴(kuò)容也可以下線部分節(jié)點進(jìn)行縮容??梢哉f,槽是 Redis 集群管理數(shù)據(jù)的基本單位,集群伸縮就是槽和數(shù)據(jù)在節(jié)點之間的移動。

1.集群擴(kuò)容

當(dāng)一個 Redis 新節(jié)點運(yùn)行并加入現(xiàn)有集群后,我們需要為其遷移槽和數(shù)據(jù)。首先要為新節(jié)點指定槽的遷移計劃,確保遷移后每個節(jié)點負(fù)責(zé)相似數(shù)量的槽,從而保證這些節(jié)點的數(shù)據(jù)均勻。

  • 首先啟動一個 Redis 節(jié)點,記為 M4。
  • 使用 cluster meet 命令,讓新 Redis 節(jié)點加入到集群中。新節(jié)點剛開始都是主節(jié)點狀態(tài),由于沒有負(fù)責(zé)的>槽,所以不能接受任何讀寫操作,后續(xù)我們就給他遷移槽和填充數(shù)據(jù)。
  • 對 M4 節(jié)點發(fā)送 cluster setslot { slot } importing { sourceNodeId } 命令,讓目標(biāo)節(jié)點準(zhǔn)備導(dǎo)入槽的數(shù)據(jù)。 >4) 對源節(jié)點,也就是 M1,M2,M3 節(jié)點發(fā)送 cluster setslot { slot } migrating { targetNodeId } 命令,讓源節(jié)>點準(zhǔn)備遷出槽的數(shù)據(jù)。
  • 源節(jié)點執(zhí)行 cluster getkeysinslot { slot } { count } 命令,獲取 count 個屬于槽 { slot } 的鍵,然后執(zhí)行步驟>六的操作進(jìn)行遷移鍵值數(shù)據(jù)。
  • 在源節(jié)點上執(zhí)行 migrate { targetNodeIp} " " 0 { timeout } keys { key... } 命令,把獲取的鍵通過 pipeline 機(jī)制>批量遷移到目標(biāo)節(jié)點,批量遷移版本的 migrate 命令在 Redis 3.0.6 以上版本提供。
  • 重復(fù)執(zhí)行步驟 5 和步驟 6 直到槽下所有的鍵值數(shù)據(jù)遷移到目標(biāo)節(jié)點。
  • 向集群內(nèi)所有主節(jié)點發(fā)送 cluster setslot { slot } node { targetNodeId } 命令,通知槽分配給目標(biāo)節(jié)點。為了>保證槽節(jié)點映射變更及時傳播,需要遍歷發(fā)送給所有主節(jié)點更新被遷移的槽執(zhí)行新節(jié)點。

2.集群收縮

收縮節(jié)點就是將 Redis 節(jié)點下線,整個流程需要如下操作流程。

  • 首先需要確認(rèn)下線節(jié)點是否有負(fù)責(zé)的槽,如果是,需要把槽遷移到其他節(jié)點,保證節(jié)點下線后整個集群槽節(jié)點映射的完整性。
  • 當(dāng)下線節(jié)點不再負(fù)責(zé)槽或者本身是從節(jié)點時,就可以通知集群內(nèi)其他節(jié)點忘記下線節(jié)點,當(dāng)所有的節(jié)點忘記改節(jié)點后可以正常關(guān)閉。

下線節(jié)點需要將節(jié)點自己負(fù)責(zé)的槽遷移到其他節(jié)點,原理與之前節(jié)點擴(kuò)容的遷移槽過程一致。

遷移完槽后,還需要通知集群內(nèi)所有節(jié)點忘記下線的節(jié)點,也就是說讓其他節(jié)點不再與要下線的節(jié)點進(jìn)行 Gossip 消息交換。

Redis 集群使用 cluster forget { downNodeId } 命令來講指定的節(jié)點加入到禁用列表中,在禁用列表內(nèi)的節(jié)點不再發(fā)送 Gossip 消息。

五、總結(jié)

Redis Cluster 是Redis的集群實現(xiàn),內(nèi)置數(shù)據(jù)自動分片機(jī)制,集群內(nèi)部將所有的key映射到16384個Slot中,集群中的每個Redis Instance負(fù)責(zé)其中的一部分的Slot的讀寫。集群客戶端連接集群中任一Redis Instance即可發(fā)送命令,當(dāng)Redis Instance收到自己不負(fù)責(zé)的Slot的請求時,會將負(fù)責(zé)請求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到后自動將原請求重新發(fā)往這個地址,對外部透明。一個Key到底屬于哪個Slot由crc16(key) % 16384 決定。

面試問題:為什么RedisCluster會設(shè)計成16384個槽呢?

這個問題,作者是給出了回答的!

地址如下:https://github.com/antirez/redis/issues/2576

作者原版回答如下: The reason is:

Normal heartbeat packets carry the full configuration of a node, that can be replaced in an idempotent way with the old in order to update an old config. This means they contain the slots configuration for a node, in raw form, that uses 2k of space with16k slots, but would use a prohibitive 8k of space using 65k slots.At the same time it is unlikely that Redis Cluster would scale to more than 1000 mater nodes because of other design tradeoffs.

So 16k was in the right range to ensure enough slots per master with a max of 1000 maters, but a small enough number to propagate the slot configuration as a raw bitmap easily. Note that in small clusters the bitmap would be hard to compress because when N is small the bitmap would have slots/N bits set that is a large percentage of bits set.

1.如果槽位為65536,發(fā)送心跳信息的消息頭達(dá)8k,發(fā)送的心跳包過于龐大。

如上所述,在消息頭中,最占空間的是myslots[CLUSTER_SLOTS/8]。 當(dāng)槽位為65536時,這塊的大小是:65536÷8÷1024=8kb因為每秒鐘,redis節(jié)點需要發(fā)送一定數(shù)量的ping消息作為心跳包,如果槽位為65536,這個ping消息的消息頭太大了,浪費(fèi)帶寬。

2.redis的集群主節(jié)點數(shù)量基本不可能超過1000個。

如上所述,集群節(jié)點越多,心跳包的消息體內(nèi)攜帶的數(shù)據(jù)越多。如果節(jié)點過1000個,也會導(dǎo)致網(wǎng)絡(luò)擁堵。因此redis作者,不建議redis cluster節(jié)點數(shù)量超過1000個。 那么,對于節(jié)點數(shù)在1000以內(nèi)的redis cluster集群,16384個槽位夠用了。沒有必要拓展到65536個。

3.槽位越小,節(jié)點少的情況下,壓縮率高

Redis主節(jié)點的配置信息中,它所負(fù)責(zé)的哈希槽是通過一張bitmap的形式來保存的,在傳輸過程中,會對bitmap進(jìn)行壓縮,但是如果bitmap的填充率slots / N很高的話(N表示節(jié)點數(shù)),bitmap的壓縮率就很低。 如果節(jié)點數(shù)很少,而哈希槽數(shù)量很多的話,bitmap的壓縮率就很低。

而16384÷8÷1024=2kb,怎么樣,神奇不!

綜上所述,作者決定取16384個槽,不多不少,剛剛好!

到此這篇關(guān)于為什么RedisCluster設(shè)計成16384個槽的文章就介紹到這了,更多相關(guān)RedisCluster 16384槽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了

    分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了

    Zookeeper的機(jī)制可以保證分布式鎖實現(xiàn)業(yè)務(wù)代碼簡單,成本低,Redis如果要解決分布式鎖的問題,對于一些復(fù)雜的情況,很難解決,成本較高,這篇文章重點給大家介紹分布式鎖選擇Zookeeper 而不是Redis的理由,一起看看吧
    2021-05-05
  • Redis解決庫存超賣問題實例講解

    Redis解決庫存超賣問題實例講解

    這篇文章主要介紹了Redis解決庫存超賣問題實例講解,問題和解決辦法都列舉了出來,很貼合實際開發(fā)場景,有需要的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • 從零搭建SpringBoot2.X整合Redis框架的詳細(xì)教程

    從零搭建SpringBoot2.X整合Redis框架的詳細(xì)教程

    這篇文章主要介紹了從零搭建SpringBoot2.X整合Redis框架的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Redis實現(xiàn)鎖續(xù)期的項目實踐

    Redis實現(xiàn)鎖續(xù)期的項目實踐

    本文介紹了使用Redis實現(xiàn)分布式鎖的續(xù)期,包括使用Lua腳本、Redlock算法和Redisson客戶端等方法,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • redis批量操作pipeline管道操作方法

    redis批量操作pipeline管道操作方法

    Redis本身是基于一個Request一個Response方式的同步請求,正常情況下,客戶端發(fā)送一個命令,這篇文章主要介紹了redis批量操作pipeline管道,需要的朋友可以參考下
    2022-09-09
  • 通俗易懂的Redis數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)教程(入門)

    通俗易懂的Redis數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)教程(入門)

    這篇文章主要介紹了通俗易懂的Redis數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • redis生成全局id的實現(xiàn)步驟

    redis生成全局id的實現(xiàn)步驟

    生成全局唯一的標(biāo)識符是非常常見的需求,本文主要介紹了redis生成全局id的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 淺談Redis在分布式系統(tǒng)中的協(xié)調(diào)性運(yùn)用

    淺談Redis在分布式系統(tǒng)中的協(xié)調(diào)性運(yùn)用

    這篇文章主要介紹了Redis在分布式系統(tǒng)中的協(xié)調(diào)性運(yùn)用,講解了Redis在進(jìn)程和線程的調(diào)度上以及消息隊列中的作用,需要的朋友可以參考下
    2016-03-03
  • Redis緩存雪崩的物種解決方案

    Redis緩存雪崩的物種解決方案

    在高并發(fā)系統(tǒng)中,Redis作為核心緩存組件,通常扮演著重要的"守門員"角色,當(dāng)大量緩存同時失效時,會導(dǎo)致請求如洪水般直接涌向數(shù)據(jù)庫,造成數(shù)據(jù)庫瞬間壓力劇增甚至宕機(jī),這種現(xiàn)象被形象地稱為"緩存雪崩",本文給大家介紹了Redis緩存雪崩的5種應(yīng)對措施,需要的朋友可以參考下
    2025-04-04
  • Redis官方可視化工具RedisInsight的安裝使用詳細(xì)教程(功能強(qiáng)大)

    Redis官方可視化工具RedisInsight的安裝使用詳細(xì)教程(功能強(qiáng)大)

    RedisInsight是Redis官方出品的可視化管理工具,可用于設(shè)計、開發(fā)、優(yōu)化你的Redis應(yīng)用。支持深色和淺色兩種主題,界面非常炫酷,接下來通過本文給大家介紹Redis官方可視化工具RedisInsight的安裝使用過程,需要的朋友可以參考下
    2022-04-04

最新評論

太保市| 五大连池市| 明溪县| 成武县| 泾川县| 青龙| 博兴县| 唐河县| 瓮安县| 同德县| 大姚县| 邛崃市| 随州市| 南昌市| 南江县| 乌鲁木齐市| 神农架林区| 蒙山县| 闽清县| 金昌市| 许昌县| 兴宁市| 高碑店市| 桃园县| 长沙县| 滁州市| 巴马| 普兰店市| 昂仁县| 同仁县| 桑植县| 开原市| 桃园市| 温宿县| 贡山| 平遥县| 都兰县| 庆云县| 东港市| 监利县| 南丰县|