Redis 源码剖析与实战
蒋德钧
中科院计算所副研究员
17747 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
Redis 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

28 | Redis Cluster数据迁移会阻塞吗?

你好,我是蒋德钧。
上节课,我给你介绍了 Redis Cluster 节点处理命令的过程。现在你知道,在这个过程中,节点会调用 getNodeByQuery 函数检查访问的 key 所属的节点,如果收到命令的节点并不是 key 所属的节点,那么当前节点就会生成 CLUSTER_REDIR_MOVED 或者 CLUSTER_REDIR_ASK 的报错信息,并给客户端返回 MOVED 或 ASK 命令。
其实,这两个报错信息就对应了 Redis Cluster 的数据迁移。数据迁移是分布式存储集群经常会遇到的一个问题,当集群节点承担的负载压力不均衡时,或者有新节点加入或是已有节点下线时,那么,数据就需要在不同的节点间进行迁移。所以,如何设计和实现数据迁移也是在集群开发过程中,我们需要考虑的地方。
那么今天这节课,我就来介绍下 Redis Cluster 是如何实现数据迁移的。从源码层面掌握这部分内容,可以帮助你了解数据迁移对集群节点正常处理命令的影响,这样你就可以选择合适时机进行迁移。而且,掌握 Redis 的数据迁移实现,也能为你自己开发集群提供一个不错的参考示例。
好了,接下来,我们就先来看下和数据迁移相关的主要数据结构。这些数据结构比较重要,它们记录了数据迁移的状态信息。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Redis Cluster数据迁移是分布式存储集群中常见的问题,涉及节点负载压力不均衡、新节点加入或已有节点下线等情况。本文详细介绍了Redis Cluster数据迁移的实现方式和相关数据结构。首先,通过标记迁入、迁出节点,然后获取迁出的keys,源节点实际迁移数据,目的节点处理迁移数据,最后标记迁移结果。文章通过对数据迁移过程的源码层面掌握,使读者可以了解数据迁移对集群节点正常处理命令的影响,选择合适时机进行迁移,并为自己开发集群提供参考示例。此外,文章还介绍了MIGRATE命令的执行基本过程,包括命令参数检查、读取要迁移的key和value、填充迁移用的命令、key和value,以及发送迁移用的命令和数据,并读取返回结果。通过本文的内容,读者可以快速了解Redis Cluster数据迁移的技术细节,对于对分布式存储集群感兴趣的读者具有一定的参考价值。文章还介绍了数据迁移过程的源码实现,包括标记迁入、迁出节点、获取待迁出的keys、源节点实际迁移数据、目的节点处理迁移数据和标记迁移结果等五大步骤。同时,提醒读者在实际应用中要控制迁移的key数量和大小,避免阻塞Redis正常处理请求。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Redis 源码剖析与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • Kaito
    1、Redis Cluster 因为是多个实例共同组成的集群,所以当集群中有节点下线、新节点加入、数据不均衡时,需要做数据迁移,把某些实例中的数据,迁移到其它实例上 2、数据迁移分为 5 个阶段 - 标记迁入、迁出节点 - 获取待迁出的 keys - 源节点实际迁移数据 - 目的节点处理迁移数据 - 标记迁移结果 3、获取待迁出的 keys 会用 CLUSTER GETKEYSINSLOT 命令,可返回指定 slot 下的 keys 4、从源节点迁出数据,会调用 MIGRATE 命令,该命令可指定一批 key,迁移到目标 Redis 实例。迁移时,源节点会把 key-value 序列化,然后传输给目标节点 5、目标节点收到源节点发来的数据后,会执行 RESTORE 命令逻辑,校验序列化的数据格式是否正确,正确则解析数据,把数据添加到实例中 6、标记迁移结果会向源节点和目标节点执行 CLUSTER SETSLOT 命令,目的是设置迁移 key 的最终归属 slot 课后题:在维护 Redis Cluster 集群状态的数据结构 clusterState 中,有一个字典树 slots_to_keys。当在数据库中插入 key 时它会被更新,db.c 更新 slots_to_keys 字典树的相关函数调用有哪些? 全局搜索 slots_to_keys 关键词,可以看到 db.c 中的相关函数有: - slotToKeyUpdateKey,分别被 slotToKeyAdd 和 slotToKeyDel 调用,看名字是向 slots_to_keys 添加 / 删除 key - slotToKeyFlush,清空 slots_to_keys 中的数据 - getKeysInSlot:获取指定 slot 下的 keys - delKeysInSlot:删除指定 slot 下的 keys
    2021-10-18
    3
  • 曾轼麟
    回答老师的问题: clusterState 中的 slots_to_keys 在查阅git历史提交记录中发现,之前是使用跳跃表(zskiplist)在后来才替换成了-字典树,其最主要的目的是为了方便通过 slot 快速查找到solt下的keys,getKeysInSlot 函数正是使用这种方式来获取待迁出的 keys。 【获取key调用路径】:clusterCommand -> getKeysInSlot -> raxStart(迭代器) 【插入key调用路径】:dbAdd -> slotToKeyAdd -> slotToKeyUpdateKey -> raxInsert 【删除key调用路径】:dbAsyncDelete/dbSyncDelete -> slotToKeyDel -> slotToKeyUpdateKey -> raxRemove 总结: 本篇文章老师介绍了Redis Cluster 数据迁移过程的实现思路,其中数据迁移整体可以归纳为5个步骤: 1、标记迁入、迁出节点; 2、获取待迁出的 keys; 3、源节点实际迁移数据; 4、目的节点处理迁移数据; 5、标记迁移结果; 其中迁移涉及的函数有clusterCommand,migrateCommand,restoreCommand,其中老师有个点提醒的很好,syncWrite 和 syncReadLine是进行同步调用的,需要对key数量进行控制。 此外Redis为了保证传输效率和传输的安全性,分别使用了自定义的序列化方案(这里复用了DUMP命令,文件序列化的方案) 和 CRC64验证其中结构大致如下所示: ----------------+---------------------+---------------+ ... RDB payload | 2 bytes RDB version | 8 bytes CRC64 | ----------------+---------------------+---------------+ 理论上来说RESP协议也能实现类似的效果,但是在传输效率上来说自定义的序列化方案效率更高。
    2021-10-14
    2
  • 秦静
    还是没回答问题呀,,,阻塞还是不阻塞
    2022-12-02归属地:北京
    1
  • shan
    Redis Cluster数据迁移总结 1.在源节点和目标节点分别标记slot迁出和迁入信息 (1)在需要迁入的目标节点使用IMORITING命令标记要将SLOT从哪个节点迁入 (2)在源节点也就是slot所在节点使用MIGRATING命令标记数据迁出到哪个节点 2.在源节点使用CLUSTER GETKEYSINSLOT命令获取待迁出的KEY 3.在源节点执行MIGRATE命令进行数据迁移 4.在源节点和目标节点使用CLUSTER SETSLOT标记slot最终迁移的节点 总结了一篇集群故障迁移的源码分析 https://www.cnblogs.com/shanml/p/16290642.html
    2022-06-15
    1
  • 飞龙
    cluster这个章节还是很吃力的
    2022-10-26归属地:广东
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部