提交 68378639 编写于 作者: A antirez

Cluster: redis-trib cluster allocation more even across nodes.

redis-trib used to allocate slots not considering fractions of nodes
when computing the slots_per_node amount. So the fractional part was
carried over till the end of the allocation, where the last node
received a few more slots than any other (or a lot more if the cluster
was composed of many nodes).

The computation was changed to allocate slots more evenly when they are
not exactly divisible for the number of masters we have.
上级 431573ae
......@@ -510,7 +510,6 @@ class RedisTrib
def alloc_slots
nodes_count = @nodes.length
masters_count = @nodes.length / (@replicas+1)
slots_per_node = ClusterHashSlots / masters_count
masters = []
slaves = []
......@@ -541,13 +540,18 @@ class RedisTrib
end
# Alloc slots on masters
i = 0
slots_per_node = ClusterHashSlots.to_f / masters_count
first = 0
cursor = 0.0
masters.each_with_index{|n,masternum|
first = i*slots_per_node
last = first+slots_per_node-1
last = ClusterHashSlots-1 if masternum == masters.length-1
last = (cursor+slots_per_node-1).round
if last > ClusterHashSlots || masternum == masters.length-1
last = ClusterHashSlots-1
end
last = first if last < first # Min step is 1.
n.add_slots first..last
i += 1
first = last+1
cursor += slots_per_node
}
# Select N replicas for every master.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册