我有两个 AWS Elasticache 实例,其中一个实例(比如说
instance A
)具有非常重要的数据集和连接,停机时间是不可接受的。由于这种情况,我没有进行正常的迁移(例如阻止源数据进行新写入、对其进行转储,然后将其恢复到新数据),而是尝试将 instance A
的数据同步到另一个 Elasticache 实例(让说instance B
)。正如我所说,这个过程应该是downtime-free
。为了做到这一点,我尝试了RedisShake,但由于AWS限制用户运行某些命令(bgsave
、config
、replicaof
、slaveof
、sync
等),RedisShake无法工作使用 AWS Elasticache。它给出了以下错误。
2022/04/04 11:58:42 [PANIC] invalid psync response, continue, ERR unknown command `psync`, with args beginning with: `?`, `-1`,
[stack]:
2 github.com/alibaba/RedisShake/redis-shake/common/utils.go:252
github.com/alibaba/RedisShake/redis-shake/common.SendPSyncContinue
1 github.com/alibaba/RedisShake/redis-shake/dbSync/syncBegin.go:51
github.com/alibaba/RedisShake/redis-shake/dbSync.(*DbSyncer).sendPSyncCmd
0 github.com/alibaba/RedisShake/redis-shake/dbSync/dbSyncer.go:113
github.com/alibaba/RedisShake/redis-shake/dbSync.(*DbSyncer).Sync
... ...
我已经尝试过rump,但它没有足够的稳定性来处理任何重要的过程。首先,它不是作为后台进程运行,当第一次同步完成时,它会被
signal: exit done
关闭,因此在第一次完成后它不会得到持续的更改。
其次,它在每次运行中识别创建/修改的key/values
,例如,在第一次运行中键apple
等于pear
,它按原样同步到目的地,但是当我删除键apple
并且它在源中的值并再次运行 rump
同步脚本,它没有在目标中被删除。所以基本上它并不是真正同步源和目标。另外,最后一次提交 rump
github 存储库是大约 3 年前。对我来说,这似乎有点过时的项目。
在所有这些信息和尝试之后,我的问题是,有没有办法同步两个
Elasticache for Redis
实例,正如我所说,在我的情况下没有停机的空间。如果有此类经验的你们能提出可靠的建议,我将不胜感激。我尝试过,但不幸的是没有找到。
非常感谢,
致以诚挚的问候。
如果这两个 Elasticache Redis 集群存在于同一账户但不同区域中,您可以考虑使用 AWS Elasticache global-datastore。
它对区域、节点类型有一些限制,并且两个集群在节点数量等方面应具有相同的配置
否则,有一个简单的暴力机制,我相信你可以自己编写代码。
注意 - 您必须确保集群位于可连接的 VPC 中。 Elasticache 仅适用于 VPC 内的资源。如果您的实例 A 和实例 B 位于不同的 VPC 中,您必须对它们进行对等或通过 TransitGateway 连接它们。
RedisShake的文档已经针对这种情况进行了解释:
首选。 AWS ElastiCache 和 MemoryDB 未启用 默认情况下使用 PSync 协议,但您可以请求启用 PSync 通过提交票证进行协议。 AWS将提供更名的PSync 工单中的命令,例如sync_reader
和xhma21yfkssync
。 该命令与nmfu2bl5osync
命令效果相同,只是多了一个 不同的名字。用户只需修改psync
RedisShake配置文件中的配置项。对于单个 例如,写一对aws_psync
。对于集群实例, 全部写下ip:port@cmd
,用逗号分隔。ip:port@cmd
不方便提交工单时,可以使用
。 值得注意的是,scan_reader
会给 源数据库。scan_reader
我建议您尝试提交支持票。
或者,您可以尝试在扫描模式下启用KSN支持来获取增量数据。