我使用的是 ElastiCache for Redis。为什么 Redis 客户端读取请求总是从分片的主节点读取或重定向到该节点?

1 分钟阅读
0

我使用的是 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>

当客户端首先连接到节点时,需要签发 readonly 命令。只有在客户端从相同节点读取密钥之前,命令才会处于活动状态。如果客户端连接到相同或不同分区中的其他副本节点,则您可能需要签发新的 readonly 命令。


AWS 官方
AWS 官方已更新 3 年前