我不了解只有一个分片的Redis集群如何导致CROSSSLOT错误。根据文档,当您发出影响多个密钥的命令时,就会发生此错误,这些密钥并不全部驻留在同一哈希槽中(即分片环境中的节点)。鉴于单个分片只有一个插槽; 0-16383-以及所有数据-如何发生?
在我的情况下,我只有一个带有一个只读副本(从属)的分片。
我通过使用哈希标签解决了这个问题,如下所述:https://redis.io/topics/cluster-spec-但这不能回答问题。
这是CLUSTER NODES的输出:
e51c5f84e60116be3cb9d6734fc0c4deb1fde4c4 172.31.6.149:6379@1122 slave c07ed67b7df1a9d4475702c944a43ad38c6954ba 0 1531143884198 1 connected
c07ed67b7df1a9d4475702c944a43ad38c6954ba 172.31.21.122:6379@1122 myself,master - 0 0 1 connected 0-16383
我可以这样重现错误:
telnet 172.31.21.122 6379
SETEX redis-test-1 3600 whatever
+OK
SETEX redis-test-2 3600 whatever
+OK
KEYS redis-test*
*2
$12
redis-test-2
$12
redis-test-1
DEL redis-test-1 redis-test-2
-CROSSSLOT Keys in request don't hash to the same slot
答案 0 :(得分:1)
这也使我感到困惑。 Redis code要求密钥散列到相同的插槽(而不是相同的节点),鉴于cluster specification表示以下内容(强调我的意思),我不明白为什么会这样:
Redis Cluster实现了Redis的非分布式版本中可用的所有单键命令。只要键全部属于相同节点,就可以执行执行复杂的多键操作的命令,例如Set类型的并集或交集。
我在GH上发布了一个问题:https://github.com/antirez/redis/issues/5118
答案 1 :(得分:0)
给定一个分片只有一个插槽; 0-16383
单个分片拥有全部个16384插槽,每个插槽都是“单个” ...