共計(jì) 991 個(gè)字符,預(yù)計(jì)需要花費(fèi) 3 分鐘才能閱讀完成。
自動(dòng)寫代碼機(jī)器人,免費(fèi)開(kāi)通
為什么 redis 集群的最大槽數(shù)是 16384 個(gè)?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面丸趣 TV 小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
Redis 集群并沒(méi)有使用一致性 hash,而是引入了哈希槽的概念。
Redis 集群有 16384(2^14)個(gè)哈希槽,每個(gè) key 通過(guò) CRC16 校驗(yàn)后對(duì) 16384 取模來(lái)決定放置哪個(gè)槽,集群的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分 hash 槽。
這種結(jié)構(gòu)很容易添加或者刪除節(jié)點(diǎn),并且無(wú)論是添加刪除或者修改某一個(gè)節(jié)點(diǎn),都不會(huì)造成集群不可用的狀態(tài)。
HASH_SLOT = CRC16(客戶端 key) mod 16384
CRC16 算法產(chǎn)生的 hash 值有 16bit, 可以產(chǎn)生的值在 0~65535 之間。
在 redis 節(jié)點(diǎn)發(fā)送心跳包時(shí)需要把所有的槽放到這個(gè)心跳包里,以便讓節(jié)點(diǎn)知道當(dāng)前集群信息,16384=16k,在發(fā)送心跳包時(shí)使用 char 進(jìn)行 bitmap 壓縮后是 2k(2 * 8 (8 bit) * 1024(1k) = 2K),也就是說(shuō)使用 2k 的空間創(chuàng)建了 16k 的槽數(shù)。
65535=65k,壓縮后就是 8k(8 * 8 (8 bit) * 1024(1k) = 8K),也就是說(shuō)需要需要 8k 的心跳包。
Redis Cluster 原理
1.node1 和 node2 首先進(jìn)行握手 meet,知道彼此的存在
2. 握手成功后,兩個(gè)節(jié)點(diǎn)會(huì)定期發(fā)送 ping/pong 消息,交換數(shù)據(jù)信息 (消息頭,消息體)
3. 消息頭里面有個(gè)字段:unsigned char myslots[CLUSTER_SLOTS/8],每一位代表一個(gè)槽,如果該位是 1,代表該槽屬于這個(gè)節(jié)點(diǎn)
4. 消息體中會(huì)攜帶一定數(shù)量的其他節(jié)點(diǎn)的信息,大約占集群節(jié)點(diǎn)總數(shù)量的十分之一,至少是 3 個(gè)節(jié)點(diǎn)的信息。節(jié)點(diǎn)數(shù)量越多,消息體內(nèi)容越大。
5. 每秒都在發(fā)送 ping 消息。每秒隨機(jī)選取 5 個(gè)節(jié)點(diǎn),找出最久沒(méi)有通信的節(jié)點(diǎn)發(fā)送 ping 消息。
6. 每 100 毫秒都會(huì)掃描本地節(jié)點(diǎn)列表,如果發(fā)現(xiàn)節(jié)點(diǎn)最近一次接受 pong 消息的時(shí)間大于 cluster-node-timeout/2, 則立即發(fā)送 ping 消息 redis 集群的主節(jié)點(diǎn)數(shù)量基本不可能超過(guò) 1000 個(gè),超過(guò)的話可能會(huì)導(dǎo)致網(wǎng)絡(luò)擁堵。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝您對(duì)丸趣 TV 的支持。
向 AI 問(wèn)一下細(xì)節(jié)
丸趣 TV 網(wǎng) – 提供最優(yōu)質(zhì)的資源集合!