• Kaito
    2021-10-18
    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
    展开
    
    3
  • 曾轼麟
    2021-10-14
    回答老师的问题: 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协议也能实现类似的效果,但是在传输效率上来说自定义的序列化方案效率更高。
    展开
    
    2
  • 秦静
    2022-12-02 来自北京
    还是没回答问题呀,,,阻塞还是不阻塞
    
    1
  • shan
    2022-06-15
    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
    
    1
  • 飞龙
    2022-10-26 来自广东
    cluster这个章节还是很吃力的
    
    