除了将键值对保存在数据库里面之外,节点还会用 clusterState 结构中的 slots_to_keys 跳跃表来保存槽和键之间的关系:
typedef struct clusterState {// ...zskiplist *slots_to_keys;// ...} clusterState;
【Redis Cluster 数据分片】slots_to_keys 跳跃表每个节点的分值(score)都是一个槽号,而每个节点的成员(member)都是一个数据库键:
- 每当节点往数据库中添加一个新的键值对时 , 节点就会将这个键以及键的槽号关联到 slots_to_keys 跳跃表 。
- 当节点删除数据库中的某个键值对时,节点就会在 slots_to_keys 跳跃表解除被删除键与槽号的关联 。
重新分片介绍重新分片Redis 集群的重新分片操作可以将任意数量已经指派给某个节点 (源节点)的槽改为指派给另一个节点(目标节点) , 并且相关槽所属的键值对也会从源节点被移动到目标节点 。
重新分片操作可以在线(online)进行,在重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求 。
重新分片的实现原理Redis 集群的重新分片操作是由 Redis 的集群管理软件 redis-trib 负责执行的 , Redis 提供了进行重新分片所需的所有命令,而 redis-trib 则通过向源节点和目标节点发送命令来进行重新分片操作 。
redis-trib 对集群的单个槽 slot 进行重新分片的步骤如下:
- 目标节点准备导入槽 slot 的键值对:redis-trib 对目标节点发送 cluster setslot < slot > importing <source_id> 命令,让目标节点准备好从源节点导入(import)属于槽 slot 的键值对 。
- 源节点准备迁移槽 slot 的键值对:redis-trib 对源节点发送 cluster setslot < slot > migrating <target_id> 命令,让源节点准备好将属于槽 slot 的键值对迁移(migrate)至目标节点 。
- redis-trib 向源节点发送 cluster getkeysinslot < slot > < count > 命令,获得最多 count 个属于槽 slot 的键值对的键名(key name) 。
- 对于步骤 3 获得的每个键名 , redis-trib 都向源节点发送一个 migrate <target_ip> <target_port> <key_name> 0 < timeout > 命令,将被选中的键原子地从源节点迁移至目标节点 。
- 将属于槽 slot 的键全部迁移至目标节点:重复执行步骤 3 和步骤 4,直到源节点保存的所有属于槽 slot 的键值对都被迁移至目标节点为止 。
- 将槽 slot 指派给目标节点:redis-trib 向集群中的任意一个节点发送 cluster setslot < slot > node <target_id> 命令,将槽 slot 指派给目标节点,这一指派信息会通过消息发送至整个集群,最终集群中的所有节点都会知道槽 slot 已经指派给了目标节点 。
- 如果重新分片涉及多个槽 , 那么 redis-trib 将对每个给定的槽分别执行上面给出的步骤 。

文章插图
ask 错误在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面 , 而另一部分键值对则保存在目标节点里面 。
当客户端向源节点发送一个与数据库键有关的命令,并且命令要处理的数据库键恰好就属于正在被迁移的槽时:
- 源节点会先在自己的数据库里面查找指定的键,如果找到的话 , 就直接执行客户端发送的命令 。
- 相反地,如果源节点没能在自己的数据库里面找到指定的键,那么这个键有可能已经被迁移到了目标节点 , 源节点将向客户端返回一个 ask 错误,指引客户端转向正在导入槽的目标节点 , 并再次发送之前想要执行的命令 。
源节点判断是否需要向客户端发送 ask 错误的整个过程 。

文章插图
被隐藏的 ask 错误:和接到 moved 错误时的情况类似,集群模式的 redis-cli 在接到 ask 错误时也不会打印错误,而是自动根据 ask 错误提供的 IP 地址和端口进行转向动作 。
推荐阅读
- R数据分析:孟德尔随机化实操
- JavaScript常用工具函数
- Redis系列10:HyperLogLog实现海量数据基数统计
- MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选
- 如何通过Java导出带格式的 Excel 数据到 Word 表格
- 砰砰军团数据处理谜题通关图文攻略汇总-砰砰军团数据谜题攻略大全
- Vue3实现动态导入Excel表格数据
- undefined,null,boolean类型 第一百零七篇:基本数据类型
- rabbitmq docker安装消息队列及数据库(mongo、mysql)
- 苹果手机如何刷机还原(苹果输错10次密码抹掉数据会怎样)