前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 的 MOVED 转向与 ASK 转向

Redis 的 MOVED 转向与 ASK 转向

作者头像
用户3147702
发布2022-06-27 13:08:12
1.5K0
发布2022-06-27 13:08:12
举报
文章被收录于专栏:小脑斧科技博客

1. 引言

上一篇文章中,我们介绍了 redis 集群的搭建。 redis 集群详解及搭建过程 其中我们遇到了报错:

这就是所谓的“MOVED转向”,那么什么是 MOVED 转向呢?本篇日志我们就来介绍一下。

2. MOVED 转向

当我们使用操作 redis 单节点的 client 来操作集群时,常常能够遇到上面的报错。 按照 redis 官方规范,一个 Redis 客户端可以向集群中的任意节点(包括从节点)发送命令请求。 节点会对命令请求进行分析,如果该命令是集群可以执行的命令,那么节点会查找这个命令所要处理的键所在的槽。 如果处理该命令的槽位于当前节点,那么命令可以顺利执行,否则当前节点会返回 MOVED 错误,让客户端到另一个节点执行该命令。 redis 官方规范要求所有客户端都应处理 MOVED 错误,从而实现对用户的透明。 我们上面看到的错误就是 MOVED 错误:

代码语言:javascript
复制
(error) MOVED 866 172.21.16.4:6379

他表示,该执行该命令所需要的 slot 是 866 号哈希槽,负责该槽的节点是 172.21.16.4:6379。

2.1. 性能优化

每次 REDIS 指令操作后,客户端应该记录下正确的节点与槽之间的对应关系 — 槽位路由表。 这样在下次指令执行时可以找到正确的节点,从而提升效率。

2.2. Redis 的哲学

Redis 的规范体现出了 Redis 的哲学 — 保持 server 端的尽量简洁,能不在 server 端做的事情都不在 server 端做。 这已经是我们不止一次提到的原则了。

3. 槽位的迁移

ASK 转向是在集群在线重配置发生时出现的一种错误返回。 所谓的集群在线重配置就是 slot 的迁移,下面是用于 slot 迁移的命令:

  1. CLUSTER ADDSLOTS slot1 [slot2] … [slotN] — 指派槽位到节点
  2. CLUSTER DELSLOTS slot1 [slot2] … [slotN] — 从节点移除槽位
  3. CLUSTER SETSLOT slot NODE node — 设置槽位到某节点
  4. CLUSTER SETSLOT slot MIGRATING node — 将槽 slot 迁移出当前节点,移入 node 节点
  5. CLUSTER SETSLOT slot IMPORTING node — 接受从 node 节点迁移出的槽位 slot

前面的命令很好理解,只有最后的两条命令需要详细解释: 假设我们在 A 节点执行:

代码语言:javascript
复制
CLUSTER SETSLOT 866 MIGRATING B

同时,我们在 B 节点执行:

代码语言:javascript
复制
CLUSTER SETSLOT 866 IMPORTING A

这样,我们将 866 号槽从 A 节点迁移到 B 节点。 这样,再次请求 866 槽时,都会判断操作的键是否是一个新的键,如果是一个新的键,那么就在 B 节点中进行操作,否则仍然在 A 节点中进行操作。 对于试图在 A 节点中 866 槽上新增键的操作,A 节点会返回一个 ASK 转向错误,指向 B 节点。 也就是说,MIGRATING、IMPORTING 命令不会进行数据的迁移,只决定新数据的去向。 而在这一组操作进行中,这两个节点都会被阻塞,以免竞争条件的发生。

4. ASK 转向

除了 MOVED 转向,Redis 规范还要求客户端实现对 ASK 转向的处理。 MOVED 转向与 ASK 转向的区别类似于 http 协议中 301 跳转与 302 跳转的区别:

  • MOVED 转向 — 当节点需要让一个客户端长期地(permanently)将针对某个槽的命令请求发送至另一个节点时,节点向客户端返回 MOVED 转向
  • ASK 转向 — 当节点需要让客户端仅仅在下一个命令请求中转向至另一个节点时,节点向客户端返回 ASK 转向

客户端是不能直接请求 ASK 转向的目标机器的,而是必须先发送一个 ASKING 命令。 因此,客户端也没有必要了解或保存槽位与节点的对应关系。

5. 参考资料

https://redis.io/topics/cluster-spec。 https://redis.io/commands/cluster-setslot。 https://github.com/go-redis/redis/blob/master/cluster.go。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引言
  • 2. MOVED 转向
    • 2.1. 性能优化
      • 2.2. Redis 的哲学
      • 3. 槽位的迁移
      • 4. ASK 转向
      • 5. 参考资料
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档