您好,登錄后才能下訂單哦!
為什么redis集群的最大槽數(shù)是16384個(gè)?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
Redis 集群并沒有使用一致性hash,而是引入了哈希槽的概念。
Redis 集群有16384(2^14)個(gè)哈希槽,每個(gè)key通過CRC16校驗(yàn)后對16384取模來決定放置哪個(gè)槽,集群的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分hash槽。
這種結(jié)構(gòu)很容易添加或者刪除節(jié)點(diǎn),并且無論是添加刪除或者修改某一個(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),也就是說使用2k的空間創(chuàng)建了16k的槽數(shù)。
65535=65k,壓縮后就是8k(8 * 8 (8 bit) * 1024(1k) = 8K),也就是說需要需要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),找出最久沒有通信的節(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ù)量基本不可能超過1000個(gè),超過的話可能會(huì)導(dǎo)致網(wǎng)絡(luò)擁堵。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。