From 41fb27d1d16b08a893797b571786e09d996e34b7 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 25 Mar 2014 17:44:39 +0100 Subject: [PATCH] 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. --- src/redis-trib.rb | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/redis-trib.rb b/src/redis-trib.rb index 85139ebb9..743c87442 100755 --- a/src/redis-trib.rb +++ b/src/redis-trib.rb @@ -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.