以最短的停机时间将 Redis 迁移到 AWS Elasticache

Posted

技术标签:

【中文标题】以最短的停机时间将 Redis 迁移到 AWS Elasticache【英文标题】:Migrating Redis to AWS Elasticache with minimal downtime 【发布时间】:2016-10-13 18:23:44 【问题描述】:

让我们从列举一些事实开始:

Elasticache 不能成为我现有 Redis 设置的从属设备。真可惜,那样会更有效率。 我只有一台 Redis 服务器要迁移,大约有 3GB 的数据。 停机时间必须少于 10 分钟。我假设通常的“停止站点,停止 redis,使用快照配置集群”将花费比这更长的时间。

类似这个问题:How do I set an elasticache redis cluster as a slave?

关于这可能如何工作的一个想法:

    将 Redis 设置为同时使用 AOF 和触发 BGSAVE。 BGSAVE 完成后,为 Elasticache 集群配置 RDB 种子。 停止站点并关闭我的本地 Redis 实例。 使用 aof-replay 工具将 AOF 重播到 Elasticache 中。 再次启动站点,指向 Elasticache 集群。

我的问题:

    我如何保证我的 AOF 文件正好在 RDB 文件结束时开始,并且在这之间不会写入任何数据? Redis 的维护者是否支持 AOF 工具,或者它们都是第三方解决方案,因此(可能)可靠性有问题?*

* 无意冒犯此类工具的任何作者,我相信他们很棒,我只是觉得使用由与产品相同的团队编写的工具来避免潜在的兼容性错误更有信心。

【问题讨论】:

你的应用可以在没有 Redis 的情况下运行吗?它会变慢(当然不能访问缓存)还是会失败? 您的用户在一夜之间有多活跃?凌晨 3 点到 5 点?那时我会迁移需要为我们的业务用户准备的生产应用程序的重大更改。即使您的应用 24/7 全天候使用,您也有可能会在迁移期间离线 30 分钟时计划将您注意到的影响降到最低的低使用期。 App没有Redis基本没用,也没有真正的日常使用模式。这是一个 24 小时内不断加载的应用程序。是什么让您猜测停机时间只有 30 分钟? 请检查:aws.amazon.com/about-aws/whats-new/2019/10/… 【参考方案1】:

我只有一台 Redis 服务器要迁移,大约有 3gb 的数据

我会停下来,将 REDIS 保存到 S3,然后将其上传到新集群。

我猜需要 10 分钟来保存文件并将其放入 s3。 只需 10 分钟即可从该数据启动一个 elasticache 集群。 让您多花 10 分钟来配置和测试。

但是有一种简单的方法可以准确地知道多长时间。 对其进行测试迁移。

    不要停止您的实时系统 运行 BGSAVE 并转储您的 Redis(让一切正常运行) 移动转储 S3 为其启动一个 elasticache 集群。

做详细的笔记,对每一步计时,将命令复制到记事本窗口。

放一个 Word/excel 文档,这样你就有了一个迁移文档。这样你就知道需要多长时间并且没有意外。让我们知道进展如何。

【讨论】:

【参考方案2】:

有几种方法可以在不停机的情况下迁移数据。但它们更难实现。

    您可以让您的应用程序同时写入两个 redis 实例 - 其中一个将在 EC 上。一旦缓存都“温暖”了,您就可以重新启动您的应用,然后从 EC 缓存中读取。

    您最初可以迁移到 EC2 而不是 EC。不是你希望听到的,我想。这很容易做到,因为您可以将 EC2 设置为您的 redis 实例的辅助。此外,从 EC2 迁移到 EC 稍微容易一些(数据已经在 AWS 上),因此对于拥有大量数据集的用户来说是有好处的。

    理论上,您可以拦截来自客户端的命令并将它们发送到 EC,从而有效地“复制”。但这需要一些编程(我不相信这样的工具存在 ATM)并且对于多个临时客户端来说会很困难。

【讨论】:

【参考方案3】:

ElastiCache 支持在线迁移。您可以使用 start-migration API 开始从自我管理的集群迁移到 ElastiCache 集群。

aws elasticache start-migration --replication-group-id <ElastiCache Replication Group Id> --customer-node-endpoint-list "Address='<IP Address>',Port=<Port>"

API 的输入是您的 ElastiCache 复制组 ID 以及您的自我管理集群的主节点的 IP 和端口。您需要确保可以从 ElastiCache 节点访问 IP 地址。 (示例 IP 地址是您的自我管理集群的主服务器的私有 IP 地址)。此 API 将使 ElastiCache 集群的主节点在您的自我管理集群的主节点上调用“SLAVEOF”。这将建立一个复制流,并将开始将数据从自我管理的集群迁移到 ElastiCache 集群。在迁移期间,ElastiCache 集群的主节点将停止接受直接发送给它的写入。您可以从您的应用程序开始使用 ElastiCache 集群进行读取。

在 ElastiCache 集群中拥有所有数据后,您可以使用完整迁移 API 来停止迁移。此 API 将停止从自我管理的集群到 ElastiCache 集群的复制。

aws elasticache complete-migration --replication-group-id <ElastiCache Replication Group Id>

此后,ElastiCache 集群的主节点将开始接受写入。您可以从应用程序开始使用 ElastiCache 集群进行读写。

此迁移方法需要注意以下limitations:

现有或新创建的 ElastiCache 部署应满足以下迁移要求: 使用 Redis 引擎 5.0.5 或更高版本禁用集群模式。 它没有启用传输中加密或静态加密。 它具有启用自动故障转移的多可用区。 它有足够的可用内存来容纳来自 EC2 实例上的 Redis 的数据。要配置正确的预留内存设置,请参阅管理预留内存。

【讨论】:

在线迁移是仅支持托管在 Amazon Linux EC2 上的 redis,还是也支持其他操作系统? 迁移过程与操作系统无关。所以它也应该适用于其他操作系统。

以上是关于以最短的停机时间将 Redis 迁移到 AWS Elasticache的主要内容,如果未能解决你的问题,请参考以下文章

Javascript long else / if语句以最短的方式

图论 - 从顶点 A 开始,经过两个方向的所有路径,并以最短的方式再次到达 A

实战应用:借助Kubernetes不停机从Heroku迁移至AWS

如何将整数转换为 Python 中最短的 url 安全字符串?

将数据库从 Heroku 迁移到 AWS

AWS php sdk 用于即时写入 s3 存储桶