首页 > 解决方案 > 单分片 Redis Cluster 怎么会报 CROSSSLOT 错误?

问题描述

我不明白只有一个分片的 Redis 集群如何导致 CROSSSLOT 错误。根据文档,当您发出影响多个键的命令时会发生此错误,这些键并非都驻留在同一个哈希槽中(即分片环境中的节点)。鉴于单个分片只有一个插槽;0-16383 - 以及所有的数据 - 这怎么会发生?

就我而言,我有一个带有一个只读副本(从属)的分片。

我通过使用这里解释的哈希标签来规避这个问题:https ://redis.io/topics/cluster-spec - 但是这并没有回答这个问题。

这是集群节点的输出:

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

标签: redisshardingredis-cluster

解决方案


这也让我很困惑。Redis 代码要求密钥散列到同一个插槽(而不是同一个节点),我不明白为什么会这样,因为集群规范说以下(强调我的):

Redis Cluster 实现了 Redis 的非分布式版本中可用的所有单键命令。执行复杂的多键操作的命令,如 Set 类型联合或交集,只要键都属于同一个节点,就可以实现。

我在 GH 上打开了一个问题:https ://github.com/antirez/redis/issues/5118


推荐阅读