clusterlink結構儲存了連線節點所需要的資訊,比如套接字描述符,輸入快取區和輸出緩衝區,主要是用於連線其他節點。
每個節點都儲存著乙個clusterstate結構。這個結構記錄了在當前結點的視角下,集群的狀態,集群所包含的節點等資訊
redis 集群通過分片的方式儲存資料庫中的鍵值對:集群的整個資料庫被分為16384個槽(slot),資料庫中每個鍵都屬於這16384個槽的其中乙個,集群中的每個節點負責0個或者最多16384個槽。
節點使用以下方法計算給定的鍵key屬於哪個槽:crc16(key) & 16383 crc16(key) 計算鍵key的crc16校驗和。& 16383 計算出乙個0至16383之間的整數作為key的槽號。
首先集群中每個節點會處理部分槽,所有節點處理完一共16384個槽。節點之間會互相傳播槽指派資訊。節點收到其他節點傳送的槽指派資訊之後,會在本節點的clusterstate結構的slots陣列記錄每個槽由哪個節點負責處理。
假設key 經過計算有槽5000負責,那麼如下圖,節點會以5000為下標取出陣列的值,陣列的值其實就對應了乙個clusternode結構,取出的值為node2,那麼key會有節點node2代表的節點處理。當然如果通過下標取出的clusternode為null,表示該槽尚未分配。
假設本節點就是node2,那麼本節點會直接執行命令;假設本節點不是node2,那麼節點會根據node2所代表節點的ip 和埠號,向客戶端返回moved錯誤,指引客戶端轉向處理該槽的節點。可以看出找出key 對應的槽有哪個節點處理的複雜度為o(1),是相當高效的。
redis集群的重新分片操作可以將任意數量已經指派給某個節點(源節點)的槽改為指派個另乙個節點(目標節點),在重新分片的過程中,集群不需要下線,並且源節點和目標節點都可以繼續處理命令請求。
當客戶端向乙個客戶算傳送命令的時候,而對應的槽正被遷移,那麼如果redis在當前節點找到對應的key 就直接執行命令請求,如果沒有找到就會返回客戶端ask錯誤(使用者不會感知)指引客戶端訪問目標節點。
Redis集群中的雜湊槽
關係 cluster node slot key redis 集群中內建了 2 14 16384 個雜湊槽,當需要在 redis 集群中放置乙個 key value時,redis 先對 key 使用 crc16 演算法算出乙個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應乙個編號...
redis 集群雜湊槽的概念
redis 集群中內建了16384個雜湊槽,當需要在 redis 集群中放置乙個 key value時,redis 先對 key 使用 crc16 演算法算出乙個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應乙個編號在 0 16383 之間的雜湊槽,redis 會根據節點數量大致...
Redis 雜湊槽概念
redis 集群中內建了 16384 個雜湊槽,當需要在 redis 集群中放置乙個 key value時,redis 先對 key 使用 crc16 演算法算出乙個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應乙個編號在 0 16383 之間的雜湊槽,redis 會根據節點數量...