mirror of
https://github.com/fluencelabs/redis
synced 2025-03-31 14:51:04 +00:00
redis-trib: better slots allocation strategy for resharding
This commit is contained in:
parent
841cd7684c
commit
6c0047c430
@ -287,10 +287,22 @@ class RedisTrib
|
|||||||
# instance.
|
# instance.
|
||||||
def compute_reshard_table(sources,numslots)
|
def compute_reshard_table(sources,numslots)
|
||||||
moved = []
|
moved = []
|
||||||
sources.each{|s|
|
# Sort from bigger to smaller instance, for two reasons:
|
||||||
|
# 1) If we take less slots than instanes it is better to start getting from
|
||||||
|
# the biggest instances.
|
||||||
|
# 2) We take one slot more from the first instance in the case of not perfect
|
||||||
|
# divisibility. Like we have 3 nodes and need to get 10 slots, we take
|
||||||
|
# 4 from the first, and 3 from the rest. So the biggest is always the first.
|
||||||
|
sources = sources.sort{|a,b| b.slots.length <=> a.slots.length}
|
||||||
|
sources.each_with_index{|s,i|
|
||||||
# Every node will provide a number of slots proportional to the
|
# Every node will provide a number of slots proportional to the
|
||||||
# slots it has assigned.
|
# slots it has assigned.
|
||||||
n = (numslots.to_f/4096*s.slots.length).ceil
|
n = (numslots.to_f/4096*s.slots.length)
|
||||||
|
if i == 0
|
||||||
|
n = n.ceil
|
||||||
|
else
|
||||||
|
n = n.floor
|
||||||
|
end
|
||||||
s.slots.keys.sort[(0...n)].each{|slot|
|
s.slots.keys.sort[(0...n)].each{|slot|
|
||||||
if moved.length < numslots
|
if moved.length < numslots
|
||||||
moved << {:source => s, :slot => slot}
|
moved << {:source => s, :slot => slot}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user