Undermoon - Redis Cluster Slots 迁移

简介: Undermoon - Redis Cluster Slots 迁移

目标:

  • 简单
  • 快速

迁移过程基于以下 Redis 命令:

  • SCAN
  • DUMP
  • PTTL
  • RESTORE
  • DEL


SCAN 命令有一个很好的特性,它可以保证在第一个 SCAN 命令之前设置的所有 key 最终都会返回,但有时会返回多次。我们可以执行 3 阶段迁移来模拟复制。


  • 等待 Redis 完成所有命令。
  • 将所有读写操作重定向到目标 Redis。如果 key 不存在,则目标 Redis 将需要在处理命令之前从源 Redis 转储 key 的数据。
  • 开始扫描并将数据转发到 peer Redis


详细步骤



  • migrating proxy(迁移代理) 通过 PreCheck 命令检查 importing proxy(导入代理) 是否也收到迁移任务。
  • migrating proxy 阻塞所有新添加的命令到 Queue,并等待现有命令完成。
  • migrating proxy importing proxy 发送 TmpSwitch 命令。收到此命令后,importing proxy 开始处理导入slot(槽)范围内的 key。当命令返回时,migrating proxy 释放 Queue 内的所有命令,并将它们重定向到 importing proxy
  • migrating proxy 使用 SCANPTTLDUMPRESTOREDEL 将迁移 slot 范围内的所有数据转发到 peer importing RedisRESTORE 不设置 REPLACEflag
  • importing proxy 在处理命令时,无论是读操作还是写操作,都会先
  • EXISTS 和处理后的命令发送到 local importing Redis,如果 EXISTS 返回 true,则将命令转发到 local importing Redis
  • 如果 EXISTS 返回 false,则发送 DUMPPTTL 到迁移的 Redis 获取数据,并 RESTORE 数据并将命令转发到 local Redis。然后最后将命令转发到 local importing Redis
  • 如果该命令不会删除 key,则获取 key lock
  • 如果该命令可能删除 key,则获取 key lock 并将 UMSYNC 发送到 migrating proxy,让 migrating proxy 使用 DUMPPTTLRESTOREDELkey 传输到 importing proxy。然后最后将命令转发到 local importing Redis
  • migrating proxy 完成扫描后,它会向 importing proxy 提出 CommitSwitch。然后importing proxy只需要在 local Redis 中处理命令。
  • 通知 coordinator 并等待 UMCTL SETCLUSTER 的最终提交。


为什么会这样设计



整个迁移过程基于以下命令 SCANPTTLDUMPRESTOREDELETE。仅向导入服务器代理发送 RESTORE 命令,因此为了获得更好的性能,应在迁移服务器代理中执行此扫描和传输。


由于扫描和传输在服务器代理和 Redis 上都占用了大量的 CPU 资源,因此最好在importing proxy上处理其他工作负载。因此,一开始我们将所有插槽(slots)直接转移到importing proxy


此时,importing proxy 仍然只有一小部分数据。当它需要处理新添加的 slots 上的命令时,需要在处理请求之前使用 PTTLDUMPRESTORE 从迁移的服务器代理中拉取数据。它还需要发送 DELETE 来删除 key


请注意,对于不会删除 key 的任何命令,由于它是幂等的,因此对同一 key 多次 RESTORE 仍然是正确的。所以仅仅让 importing proxy 来拉数据不会导致任何不一致。


但是对于那些可能删除 DELEXPIREKPOPkey 的命令,只让 importing proxy 拉取数据可能会导致以下情况:


  • key 被删除
  • 还有另一个 RESTORE 命令可以恢复 key

因此,在提取数据时,需要将其与

  • importing proxy中的其他 RESTORE 命令。
  • migrating proxy中的 SCANRESTORE

因此,我们需要在 importing proxy 中锁定 key,并且需要 migrating proxy 帮助我们发送数据而不是从importing proxy中拉取数据,以便对该 key 的操作只能按顺序处理。


性能



因此,在迁移过程中,迁移和导入 proxy 的工作量非常平衡。migrating proxy 使用 130%CPUimporting proxy使用 80%CPU

而且迁移 1G 数据只用了不到一分钟。


在测试中,在迁移的同时进行基准测试,吞吐量从 50k 减少到 28k 并逐渐增加到 40k。这是因为在迁移和importing proxy中,SCANDUMPRESTORE 会在 Redis 中消耗大量吞吐量。但是一旦 key 被迁移到导入服务器代理,它只需要在请求之前发送一个额外的 EXISTS 命令。


提交迁移后,吞吐量将翻倍。

相关文章
|
8月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
521 2
|
6月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
536 5
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
1605 2
|
NoSQL 安全 Redis
AWS迁移教程,Redis迁移到Elasticache
AWS迁移教程,Redis迁移到Elasticache
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
157 0
|
缓存 开发框架 NoSQL
【Azure Redis 缓存】VM 里的 Redis 能直接迁移到 Azure Cache for Redis ? 需要改动代码吗?
【Azure Redis 缓存】VM 里的 Redis 能直接迁移到 Azure Cache for Redis ? 需要改动代码吗?
201 0
|
缓存 NoSQL Redis
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
182 0
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 如何迁移
【Azure Redis 缓存】Azure Cache for Redis 如何迁移
149 0
|
存储 缓存 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】Redis支持的版本及不同版本迁移风险
【Azure Redis 缓存 Azure Cache For Redis】Redis支持的版本及不同版本迁移风险
230 0
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
558 0