2017-09-26 54 views
1

不連續的槽的我創建了一個redis的羣集與三個節點:Redis的簇reshard後,大量分配給一個節點

~ redis-3.2.10/src/redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 

我然後加入第四節點和resharded使連時隙分配:

~ redis-3.2.10/src/redis-trib.rb add-node 127.0.0.1:7003 127.0.0.1:7000 
~ redis-3.2.10/src/redis-trib.rb reshard --timeout 60000 127.0.0.1:7000 
... 
How many slots do you want to move (from 1 to 16384)? 4096 
... 
Source node #1:all 
... 
redis-3.2.10/src/redis-trib.rb check 127.0.0.1:7000 
>>> Performing Cluster Check (using node 127.0.0.1:7000) 
M: 29fbb7e5f93eac22a224c14d4070139919bb0a5e 127.0.0.1:7000 
    slots:1365-5460 (4096 slots) master 
    0 additional replica(s) 
M: c90c9f590bb48d328f3eed2fc96af3a7d9cb0f25 127.0.0.1:7003 
    slots:0-1364,5461-6826,10923-12287 (4096 slots) master 
    0 additional replica(s) 
M: 970b3145574a4f38bbe10548bf6b80f8fdc2854d 127.0.0.1:7001 
    slots:6827-10922 (4096 slots) master 
    0 additional replica(s) 
M: 2cc0922fcfb3e619b6d733e054dd249a4b6137bf 127.0.0.1:7002 
    slots:12288-16383 (4096 slots) master 
    0 additional replica(s) 
[OK] All nodes agree about slots configuration. 
>>> Check for open slots... 
>>> Check slots coverage... 
[OK] All 16384 slots covered. 

然後,如果你縮減下來,reshard插槽從後面:7003節點到其餘三個,你最終的東西,如:

>>> Performing Cluster Check (using node 127.0.0.1:7000) 
M: 29fbb7e5f93eac22a224c14d4070139919bb0a5e 127.0.0.1:7000 
    slots:1365-5460,12288-13652 (5461 slots) master 
    0 additional replica(s) 
M: 970b3145574a4f38bbe10548bf6b80f8fdc2854d 127.0.0.1:7001 
    slots:0-1364,5461-6826,10923-12287,13653-15017 (5461 slots) master 
    0 additional replica(s) 
M: 2cc0922fcfb3e619b6d733e054dd249a4b6137bf 127.0.0.1:7002 
    slots:6827-10922,15018-16383 (5462 slots) master 
    0 additional replica(s) 
M: c90c9f590bb48d328f3eed2fc96af3a7d9cb0f25 127.0.0.1:7003 
    slots: (0 slots) master 
    0 additional replica(s) 
[OK] All nodes agree about slots configuration. 
>>> Check for open slots... 
>>> Check slots coverage... 
[OK] All 16384 slots covered. 

:7001節點有4個不同的哈希槽分配給它。在後續重新分片之後,這個散列槽的「碎片」似乎會增加。

難道它會成爲一個問題(性能或其他)有越來越多的哈希槽的碎片?

+0

爲什麼最後一個節點有0個插槽? –

+0

因爲我剛剛將所有槽從該節點重新分配到其餘三個槽中,以期將其從集羣中移除。 –

+0

如果您想要連續插入每個節點,請先製作單節點羣集,然後在其中添加其他節點。我做了同樣的事情。 –

回答

0

對於任何有意義的開銷,AFAIK無散列槽的「碎片」可以忽略不計。一些直覺:

  • 小範圍(16K)
  • Resharding不是頻繁操作
  • 內部,Redis的使用位圖來管理插槽映射,所以無論實際時隙分配訪問這些位圖是定時完成。
+0

它也可能取決於客戶端?我想在理論上,一個寫得不好的客戶端可能沒有實現槽映射緩存的恆定時間? –

+0

當然,這是一個很好的觀點。如果客戶端足夠智能以保留其自己的拓撲副本(這不是強制性要求),那麼它可能以不太理想的方式實現,並可能遭遇各種問題:) –

+0

聲音太棒了!那麼你應該接受我在下面提到的答案 。 –

0

首先創建單節點羣集。 爲此,您需要編輯redis_trib.rb文件以進行最少3個節點的驗證。

創建單節點集羣后,只需添加其他節點並在新節點中添加連續的插槽即可。 通過這種方式,你會得到你想要的。