ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

当redis集群在slot迁移过程中redis客户端如何处理

2021-10-26 15:31:33  阅读:318  来源: 互联网

标签:slot node key1 redis key 节点 客户端


1.背景

假设,当前redis集群只有2个节点 node-A 和 node-B,总共有3个slot, 其和节点的对应关系如图, client 会将其缓存一个映射map
image

现在要扩容新增一个节点 node-3, 并把 slot3 的数据迁移到 node-3,如下图
image

2. 问题

在 slot-3 迁移结束前,crc16(key) % 16384 = 3 的 key, 可能还在 node-B, 也可能迁移到 node-C 了

  • 那么 client 是应该向 node-B 发送请求,还是向 node-C发送请求?
  • 客户端的 slot -> node 的映射缓存什么时候更新?

3.redis cluster 中协议找答案

先看看 key 迁移过程中,redis cluster 节点会返回什么响应

假设slot-3 共有 key1,key2,key3,key4,key5 5个key,当前 key1、key2、key3 已经迁移到 node-C 了, 如下图:
image

3.1 操作还在原节点 node-B 的 key: key4

正常返回
image

3.2 操作已经迁移到新节点node-C 的 key: key1

image
(1) 由于key1已经迁移到 node-C了, 这个时候 node-B 会返回 -ASK 重定向到 node-C
(2) 接着需要先向 node-C 发送一个 ASKING 指令,然后才能从 node-C 获取到 key1 的值
(3) 如果直接向 node-C 发送 get key1 的话,会收到 moved 响应,让你去 node-B 执行;所以此时更新客户端 node映射缓存是没有用的

结论

在slot迁移过程中,任然向 slot 原节点发送命令,每次收到 ASK 后,先发送 ASKING 指令临时重定向到新节点,再正常执行命令, 此时不需要更新 客户端slot-node 映射缓存

扩展:ASK 和 MOVED 重定向的区别

  • ASK 只是临时重定向,此时 slot 对应的数据在多个节点上,并不明确,redis-cluster还是将其归属在老节点;要先向 ASK 的新节点发 asking 后才能向新节点发送命令,下一次命令还是需要向老节点发送命令
  • MOVED 是永久重定向,表示 slot 不在当前 redis 节点了,发错地方了 ,后续该slot的请求都应该发往 MOVED 重定向的 node, 如果客户端收到 MOVED 说明 slot-node的映射不对了,该执行 cluster slots 获取新的映射关系 更新本地缓存了

参考:https://redis.io/topics/cluster-spec#ask-redirection

标签:slot,node,key1,redis,key,节点,客户端
来源: https://www.cnblogs.com/mushishi/p/15466013.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有