MOVED转向
1 ) 标题描述
- 在客户端操纵Redis集群的时候 MOVED转向 或 MOVED错误是经常遇到的一类标题
- 我们先连入集群:$ /usr/local/redis/bin/redis-cli -a 123456 -h 192.168.10.101 -p 6371
- 之前在Redis中存储过一些数据,比如下面的情况,当输入 $ get username, 会有
- (error) MOVED 14315 192.168.10.103:6375
复制代码
- 它提示 usrename 这个key的槽在 14315,槽在 103:6375节点
- 这里它已经提示你key在哪里,但就是不给你
- 这个涉及到 Redis 的一个官方规范
2 )Redis 规范
- 这个规范是:
- 一个 Redis 的客户端, 它向集群中的恣意节点发送下令请求
- 请求节点会对下令请求进行分析,如果该下令是集群可以执行的下令
- 之后,对这个key做crc16的运算,对16384取余,最后得到一个值
- 它会对这个key所在的槽进行查找,如果槽在当前节点,则可以顺遂执行
- 否则当前节点会给你返回一个 MOVED 错误
- 这个 MOVED 错误会告诉你槽和对应的节点在哪里
3 )解决方案
3.1 解决方案 1
- 让你的这个客户端利用集群的方式来连接就行了
- $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.101 -p 6371
- 看到这里多了一个 -c
- 它会帮助我们做 MOVED 转向
- 这里利用的是 redis-cli, 另外,你的第三方的客户端, 比如一些可视化的客户端
- 包罗项目里的代码,也要以集群 cluster 的方式接入
3.2 解决方案 2
- 如果你的客户端不支持集群
- 但是在你连接你每次获取请求的时候,实际上会拿到这个槽和这个节点的信息
- 把记录下来之后,再次有这个下令的时候,就可以寻找到正确的谁人节点去执行下令
- 最终集群处于一个稳定状态了,所有的客户端都会保存一个完整的哈希槽对应一个节点的映射记录,集群呢就非常高效了
- 然后有下令过来,客户端就可以直接向正确的这个节点发送下令请求就无需转向等等的这些操纵了
- MOVED 转向是 Redis 官方规范要求,就是客户端必须要处置惩罚MOVED的错误
- 要么就是以集群的方式连接, 交给那种第三方的东西帮你去做
- 要么就是你本身行止置惩罚
- 由于我们要实现对用户的一种透明
- 总结下来
- 就是保持 server 端,尽量简洁
- 能不在server端做的事情就不在server端做
- 降低 server端 的压力
ASK转向
1 ) 标题描述
- 除了上面 MOVED 转向 和 Redis 的规范,还要求客户端必须也要实现对 ASK 转向的处置惩罚
- 在进行节点与插槽管理的时候,比如添加一个主节点
- 需要把其他节点的槽重新分配给了这个新的主节点
- 在这个过程中,移动了许多的槽,槽在做迁移
- 包罗在删除主节点的时候,也是先把那些槽转移到可用的节点上
- 就是先迁移已往,然后再删它
- 就在上面这个过程中,如果你发了一个下令,你这个下令要处置惩罚的谁人键
- 恰恰就属于正在被迁移的这个槽,这时候就会产生 ASK 转向
- 原节点会在本身的数据里面去找你指定的这个键
- 如果找到了,那就直接执行客户端发送的下令就返回了
- 没找到,这个键有可能已经被迁移到目的的节点了, 原节点就会向客户端返回一个ASK错误
- 指引客户端向正在导入槽的目的节点,再次发送之前要执行的下令
- 在情况稳定的情况下,是不可能产生ask错误的
- 由于 ASK 错误,是你的集群中有槽在迁移
- 而且你请求的谁人key 正好就是在迁移的那些槽中才会发生这个错误
2 ) 解决方案
2.1 解决方案1
- 让你的客户端都利用集群的方式连接,它内部会帮你去做
2.2 解决方案2
- 以正常的方式去登录,登录之后呢,它这个里边有一个 ASKING 的一个下令
- 这个 ASKING 的下令是干嘛的呢?
- 就是打开辟送该下令客户端的一个Redis ASK 标识
- 假设,现在有一些槽正在迁移,我请求的key就在迁移的那些槽中
- 这个时候 Redis 会给我返回一个error,ask 告诉怎么做
- 这时候,再敲一下 ASKING 看到这个OK之后
- 再去获取,就能拿到了这个 key
- 它的原理就是 ASKING 下令打开 Redis ASKING 的一个标识
- 当你拿完以后,这个 ASKING 的标识也会被移除,它是一次性的
- 也就是说你的这个槽在迁移的过程中,如果想要多次获取它
- 每次获取都得通过 ASKING 获取
ASK 错误和 MOVED 错误的区别
1 ) 关于 MOVED 转向
- MOVED 错误,它代表的这个槽的负责权已经从一个节点转到另一个节点了
- 而且就是当节点需要让一个客户端长期的针对某个槽的下令请求发送至另一个节点
- 节点就会向客户端返回 MOVED 转向
- 利用了集群的方式登录客户端,这个标题就解决了
2 )关于 ASK 转向
- ASK 转向只是两个节点在迁移过程中,就是槽迁移过程中利用的一种暂时步伐
- 就是当节点需要让客户端仅仅只是在下一次下令请求转向另一个节点
- 节点向客户户会返回 ASK 的一个转向, 要先发送一个 ASKING 的下令,才气够去请求
- 否则的话会执行失败
3 )简朴理解
- MOVED 转向相当于告诉你这个槽在哪,你要本身去获取, 解决办法是以集群的方式连入,或者说本身去维护槽对应节点信息, 在每次下令之前本身去做处置惩罚判断,让他向正确的节点发送请求
- ASK 转向是槽迁移的过程中产生的一种错误,它会给你返回 ASK error
- 解决办法,也是你的客户端以集群的方式接入,它会本身帮你行止置惩罚
- 否则的话,先发送一个 ASKING,然后再去获取,就能正常拿到
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |