我使用的是 ElastiCache for Redis。我的 Redis 客户端读取请求为什么一直会从分区的主节点中读取或重定向到分区的主节点中?

上次更新时间:2020 年 7 月 9 日

我使用的是 Amazon ElastiCache for Redis。我的 Redis 客户端读取请求为什么一直会从分区的主节点中读取或重定向到分区的主节点中?

解决方法

Redis 集群中的任何节点都可以从 Redis 客户端接收查询。当客户端发送读取/写入查询到副本节点时,该节点将分析请求,以确认它是单密钥操作还是属于分区相同哈希槽的多密钥操作。副本节点在启用了集群模式的集群中的默认行为是,将所有的客户端读取/写入请求重定向到属于密钥哈希槽的分区的授权主节点。只有当该分区属于哈希槽且客户端发起 readonly 命令时,副本节点才会服务读取请求。 这意味着,只有在客户端早于请求发起 readonly 时,副本节点才会处理该请求。否则,该请求会被重定向至哈希槽所属分区的主节点。

示例

1.    登录您的集群以设置密钥。

172.31.21.72:6379> set key8 "This is testing for readonly"
-> Redirected to slot [13004] located at 172.31.21.72:6379
OK
172.31.21.72:6379>

2.    连接到副本节点。

在以下示例中,将不会发送 readonly 命令,且请求将重定向到主节点。

172.31.30.175:6379> info replication
 # Replication
 role:slave
 master_host:172.31.21.72
 master_port:6379
 master_link_status:up
 172.31.30.175:637> CLUSTER KEYSLOT key8
 (integer) 13004 
 172.31.30.175:637> get key8
 (error) MOVED 13004 172.31.21.72:6379
 172.31.30.175:637> get key8
 -> Redirected to slot [13004] located at 172.31.21.72:6379
 "This is testing for readonly"
 172.31.21.72:6379>

注意:当 Redis 集群客户端不支持集群且无法处理至主节点的重定向请求时,将发生前述示例中显示的 MOVED 错误。有关 MOVED 错误的更多信息,请参阅 Redis.io 网站上的 Redis Cluster Specification - Redirection and resharding

在以下示例中,先发送的是 readonly 命令,因此,副本节点处理请求而不是将其请求重定向到主节点。

172.31.30.175:6379> readonly
OK
172.31.30.175:6379> get key8
"This is testing for readonly"
172.31.30.175:6379>

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?