您好,登錄后才能下訂單哦!
redis集群重新分片原理:(增加或移除節(jié)點) ?
? ? ?
? ? 以增加節(jié)點為例:
? ? ? ? 我們只需要將已經(jīng)分配給節(jié)點的哈希槽(hash slot),重新分配即可。
? ? ? ? 注:hash slot重新分配時,如果槽中存在key-value,那么key-value也將一起被分配出去。
? ? ? ??
? ? 例如:
? ? ? ? node1的哈希槽:0-5000
? ? ? ? node2的哈希槽:5001-10000
? ? ? ? node3的哈希槽:10001-16383
? ? 現(xiàn)在新增node4:
? ? 我們可以將node3的哈希槽調(diào)整為:10001-15000、node4的哈希槽:15001-16383
? ? 也可以在三個現(xiàn)有節(jié)點中,各自分出一部分哈希槽,給新的節(jié)點。
? ? redis集群的重新分片操作是由redis的集群管理軟件redis-trib負責(zé)執(zhí)行的,
? ? 但它不支持自動分片,需要自己計算從哪些節(jié)點上分配slot。
?
?redis集群在重新分片時,客戶端獲取數(shù)據(jù)原理: ?
? ? 重新分片時,集群不需要下線,并且源節(jié)點和目標節(jié)點都可以繼續(xù)處理命令請求。
? ??
? ? 在hash slot遷移過程中(一部分key-value在node3中,另一部分key-value在node4中)
? ? 如果客戶端向node3發(fā)送一個與數(shù)據(jù)庫key有關(guān)的命令:
? ? ? ? 1)node3會先在自己的數(shù)據(jù)庫里面查找請求的key,
? ? ? ? ? ? 如果找到,直接執(zhí)行客戶端發(fā)送的命令。
? ? ? ? 2)如果沒找到,node3給客戶端返回一個ASK錯誤,指引客戶端轉(zhuǎn)向node4,
? ? ? ? ? ? ?并且客戶端需要再次發(fā)送想要執(zhí)行的key相關(guān)的命令。 ? ?
? ? ? ? 3)客戶端轉(zhuǎn)向node4,首先發(fā)送ASKING命令,然后再次發(fā)送想要執(zhí)行的key相關(guān)的命令。
? ? ? ? ? ? ?如果直接發(fā)送想要執(zhí)行的key相關(guān)的命令,node4此時并不處理,
? ? ? ? ? ? ?因為key所在的槽還未遷移完,槽還屬于node3,會返回錯誤給客戶端。
? ? ? ? ? ? ?但如果先發(fā)送ASKING命令,node4在執(zhí)行key相關(guān)的命令時,
? ? ? ? ? ? ?不僅會檢查key所屬槽是否屬于自己,
? ? ? ? ? ? ?還會檢查migration_slots_to數(shù)組(正在遷往自己的槽)
? ? ? ? ? ? ?判斷key相關(guān)的槽是否正在遷往自己,如果是的話,則執(zhí)行key相關(guān)的命令。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。