从moved、ask到智能客户端:一次彻底搞懂RedisCluster的数据路由

1 moved重定向

每个节点通信共享Redis Cluster中槽和集群中对应节点的关系。

  1. 客户端向Redis Cluster的任一节点发送命令
  2. 接收命令的节点再计算自己的槽和对应节点

如果保存数据的槽被分配给当前节点,则去槽中执行命令,并把命令执行结果返回给客户端:

127.0.0.1:6379> cluster keyslot hello
(integer) 866   # 直接返回

键槽计算公式:

slot = CRC16(key) mod 16384

如果保存数据的槽不在当前节点的管理范围内,则向客户端返回moved重定向异常

  1. 客户端接收到节点返回的结果,如果是moved异常,则从moved异常中获取目标节点的信息
  2. 客户端向目标节点发送命令,获取命令执行结果

重定向流程

  1. 客户端向节点6379发送 'set php best' 命令
  2. 节点6379计算键'php'对应槽位9244
  3. 槽位9244不在节点6379管理范围内(0~5460)
  4. 返回MOVED重定向: 'moved 9244 127.0.0.1:6380'
  5. 客户端根据重定向信息连接节点6380
  6. 节点6380成功执行命令并返回OK

键槽信息:

CRC16('php') mod 16384 = 9244

客户端不会自动找到目标节点执行命令,需要二次执行

2 ask重定向

集群伸缩时,需数据迁移。

当客户端访问某key,节点告诉客户端key在源节点,再去源节点访问时,却发现key已迁移到目标节点,就会返回ask。

![](/Users/javaedge/Library/Application Support/typora-user-images/image-20250710161135067.png)

  1. 客户端向目标节点发送命令,目标节点中的槽已经迁移到其它节点
  2. 目标节点会返回ask转向给客户端
  3. 客户端向新节点发送Asking命令
  4. 再向新节点发送命令
  5. 新节点执行命令,把命令执行结果返回给客户端

为啥不用MOVED重定向?

虽然MOVED意味着我们认为哈希槽由另一节点永久提供,且应对指定节点尝试下一个查询,所以ASK意味着仅将下一个查询发送到指定节点。

需要这样做,是因为下一个关于哈希槽的查询可能是关于仍在A中的键,因此我们始终希望客户端尝试A,然后在需要时尝试B。由于只有16384个可用的哈希槽中有一个发生,因此集群层面的性能下降可接受。

3 moved V.S ask

虽然都是客户端重定向,但是:

  • moved:槽已确定转移
  • ask:槽还在迁移中

4 智能客户端

为追求性能。

4.1 设计思路

  • 从集群中选一个可运行节点,用Cluster slots初始化槽和节点映射
  • 将Cluster slots结果映射在本地,为每个节点创建JedisPool,之后即可进行数据读写操作

4.2 注意

  • 每个JedisPool缓存了slot和节点node的关系
  • key和slot:对key进行CRC16,hash后与16383取余得到的结果就是slot槽
  • JedisCluster启动时,已知key、slot和node之间关系,可找到目标节点
  • JedisCluster对目标节点发送命令,目标节点直接响应给JedisCluster
  • 如果JedisCluster与目标节点连接出错,则JedisCluster会知道连接的节点是一个错误的节点
  • 此时JedisCluster会随机节点发送命令,随机节点返回moved异常给JedisCluster
  • JedisCluster会重新初始化slot与node节点的缓存关系,再向新的目标节点发命令,目标命令执行命令并向JedisCluster响应
  • 若命令发送次数超过5次,抛"Too many cluster redirection!"

架构设计

基图:

全图:

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

### Redis MOVED 错误的原因分析 当在分布式环境中操作 Redis 数据时,如果遇到 `MOVED` 错误,则表明客户端尝试访问的数据被重新分配到了另一个分片上。这种现象通常发生在使用 Redis Cluster 的场景下。 #### 原因解释 Redis Cluster 使用哈希槽(hash slot)来分布键值对。整个集群有 16384 个哈希槽,每个节点负责一部分槽位。当某个键对应的槽位不在当前节点而是在其他节点时,Redis 就会返回 `MOVED` 错误并告知目标节点的信息[^1]。 --- ### 解决方案 以下是几种常见的解决方案: #### 方法一:自动重定向处理 大多数现代 Redis 客户端库支持透明地处理 `MOVED` 和 `ASK` 错误。这些库会在收到此类错误后,自动更新内部的状态表并将请求转发到正确的节点。因此,建议升级至最新版本的 Redis 客户端以利用此功能[^2]。 例如,在 Python 中可以使用 `redis-py-cluster` 库: ```python from rediscluster import RedisCluster startup_nodes = [ {"host": "192.168.4.239", "port": "6479"} ] rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True) # 删除指定 key rc.delete("your_key_name") ``` 上述代码片段展示了如何通过 `redis-py-cluster` 来连接 Redis 集群,并执行删除操作。该库能够自动解析和跳转到正确的节点[^3]。 #### 方法二:手动调整 Slot 映射关系 如果不想依赖于高级客户端的功能,也可以手动维护 Slot 到 Node 的映射关系。具体做法如下: 1. 查询当前集群状态,了解各节点所管理的 Slot 范围。 ```bash CLUSTER SLOTS ``` 2. 根据查询结果计算特定 Key 所属的 Slot 号码。 ```python def hash_slot(key): crc = binascii.crc32(key.encode('utf-8')) & 0xffff return crc % 16384 ``` 3. 确定对应的目标节点地址后再发起请求。 这种方法虽然可行但较为繁琐,仅适用于特殊需求下的定制化开发[^4]。 #### 方法三:优化数据分区策略 为了避免频繁发生跨节点迁移的情况,可以从源头出发改进应用层面对 Redis 的调用方式。比如采用一致性 Hashing 技术或者预设固定的路由规则减少不必要的切换次数。 --- ### 总结说明 综上所述,针对 Redis 出现 MOVED 错误的情形,推荐优先考虑引入具备良好异常捕获能力的专业驱动程序;其次再视具体情况决定是否采取额外措施进一步增强系统的稳定性和效率表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值