1. 引言

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

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

2. MOVED 转向

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

(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 节点执行:

CLUSTER SETSLOT 866 MIGRATING B

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

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. 微信公众号

欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤。

6. 参考资料

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

Redis 的 MOVED 转向与 ASK 转向相关推荐

  1. 汽车转向角度和转向半径的关系

    我们都知道汽车方向盘转动汽车就会转弯,可是前轮转的度数和转弯的半径有何关系呢? 要让汽车顺利转向,每个车轮都必须按不同的圆圈运动. 由于内车轮所经过的圆圈半径较小,因此它的转向角度比外车轮要大. 如果 ...

  2. 如何理解不足转向和过度转向?

    理想状况下,到达弯角时,车辆将沿着蓝色的路径行驶.出现转向不足时,车辆将会出现下图中情况一的样子,有打转的可能.出现转向过度时,车辆将会出现下图中情况二的样子,有打转的可能. 转向过度这一现象发生在试 ...

  3. matlab转向梯形优化设计,转向梯形优化设计matlab程序.doc

    转向梯形优化设计matlab程序.doc -WORD格式-可编辑-优化计算 MATLAB 程序首先,将目标函数写成 M 文件,其程序语句如下: function f = fun (x)global K ...

  4. redis (error) MOVED 11863 xxx.xxx.xxx.xxx:6379

    最近在集群中查询redis碰到这个问题, (error) MOVED 11863 xxx.xxx.xxx.xxx:6379 简单查询后发现,是因为redis是集群方式的,而使用redis-cli连接r ...

  5. redis:(error) MOVED报错的原因和解决

    Redis操作get等操作出现如下错误 百度查原因: 1.这种情况一般是因为启动 redis-cli 时没有设置集群模式所导致: 2.在集群模式下,redis-cli用普通用户登录无法操作集群中的数据 ...

  6. php页转向,301页面转向 php

    新建301.php页面,在程序入口文件index.php引用301.php页面 301.php内容如下,仅用于参考: $the_host = $_SERVER['HTTP_HOST'];//取得当前域 ...

  7. matlab转向梯形优化设计,转向梯形优化设计matlab程序

    优化计算MATLAB程序 首先,将目标函数写成M文件,其程序语句如下: function f = fun (x) global K L thetamax alpha for i=1:61 f = 0 ...

  8. 301转向和网址规范化

    写了网址规范化后,尚奇公司的柳先生建议再深入讨论一下301转向/重定向.下面就谈谈我所了解的301转向在搜索引擎优化方面的应用. 什么是301转向? 301转向(或叫301重定向,301跳转)是当用户 ...

  9. php 301目录对应,PHP 301转向实现代码

    一,301转向定义 301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另 ...

最新文章

  1. 基于yolov5的工业缺陷检测方案
  2. 某员工在工作群回复领导“OK”,被领导批不懂规矩!直接开除!
  3. 使用【飞桨】实现【手写数字识别】
  4. CentOS安装sshd服务
  5. java解析lrc_java中用正则表达式解析LRC文件
  6. nginx配置ssl(配置文件)
  7. C++中如何初始化类中const或引用类型的数据成员?
  8. Android 通过腾讯WebService API获取 地址经纬度
  9. Windows与Linux下进程间通信技术比较
  10. oracle 结果缓存,Result cache结果缓存
  11. 如何使frame能居中显示
  12. 阿里云商标注册服务及常见问题
  13. @Bean和@Componet区别
  14. 加速Android Studio/Gradle构建
  15. 使用SDKMAN来安装JDK和管理多个JDK版本
  16. 腾讯地图SDK公交路线规划Demo
  17. arduino 超声波测距原理_[Arduino]超声波测距
  18. 2055041-21-7,Acid-PEG4-S-PEG4-acid在EDC和HATU等活化剂存在下,羧酸基团可与伯胺反应
  19. 以合力加速基础软件创新:拆解鲲鹏众智如何繁荣新计算生态
  20. 计算机等级考试《二级Java语言程序设计》题库

热门文章

  1. Freebsd7 Xorg7.3 KDE3.5 桌面系统安装及美化
  2. 倒金字塔java语言_金字塔和倒金字塔
  3. 生活是一种态度,得失是一种心境
  4. 商创网络带你看电商:租房免押金,你的芝麻信用多少分了?
  5. mysql选取除某一列的所有行_在 MySQL 中选择除了某一列以外的所有列
  6. Telephone dialer
  7. Cassandra的使用
  8. cpci检索为什么那么慢_cpci见刊多久检索
  9. OA厂商的硬实力—技术水平
  10. 蚂蚁全媒体中心刘鑫炜解答:为什么要打造个人品牌