redis - Redis 集群重新分片后,许多不连续的槽分配给一个节点

标签 redis redis-cluster

我创建了一个包含三个节点的 redis 集群:

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

然后我添加了第四个节点并重新分片以使时隙分配均匀:

~ 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.

然后,如果您缩减规模,将插槽从 :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 组不同的哈希槽。在随后的重新分片之后,哈希槽的这种“碎片化”似乎增加了。

哈希槽的碎片越来越多会不会成为一个问题(对性能或其他方面)?

最佳答案

AFAIK 否 - 哈希槽的“碎片”在任何有意义的开销方面都可以忽略不计。一些直觉:

  • 小范围 (16K)
  • 重新分片不是一个频繁的操作
  • 在内部,Redis 使用位图来管理槽映射,因此无论实际槽的分布如何,访问这些位图都是在恒定时间内完成的。

关于redis - Redis 集群重新分片后,许多不连续的槽分配给一个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46423982/

相关文章:

ruby-on-rails - Rails作业因使用MQTT的Sidekiq错误而中断了管道

node.js - Redis 服务重启时出现 Redis 错误 "NOSCRIPT No matching script. Please use EVAL"

Redis-Cluster READONLY - 读取操作如何负载平衡?

redis - 无法向 Redis 集群添加值 - 集群已关闭

amazon-web-services - AWS Redis 集群 - 移动错误

python - 多处理,Python3,Windows : TypeError: can't pickle _thread. 锁定对象

spring-boot - redissonClient.poll() 只返回String类型值的前8个字符

ruby-on-rails - 我需要清除我的 Resque 'processed' 队列吗?

redis - 在redis集群中使用redis命令获取一些数据时如何连接正确的redis节点?