

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Valkey 或 Redis OSS 的在线迁移
Valkey 或 Redis OSS 的在线迁移

 使用在线迁移，您可以将数据从 Amazon EC2 上的自托管开源 Valkey 或 Redis OSS 迁移到 Amazon ElastiCache。

这指的是从自托管实例迁移到 ElastiCache 服务。有关在 ElastiCache 上从 Redis OSS 升级到 Valkey 的信息，请参阅[升级引擎版本，包括跨引擎升级升级引擎版本](VersionManagement.HowTo.md)。

**注意**  
在 r6gd 节点类型上运行的 ElastiCache 无服务器缓存或集群不支持在线迁移。

## 概览


要将数据从 Amazon EC2 上运行的开源 Valkey 或 Redis OSS 迁移到 Amazon ElastiCache，需要使用现有或新创建的 Amazon ElastiCache 部署。该部署必须具有准备好进行迁移的配置。它还应该符合所需的配置，包括实例类型、分片数量和副本数量等属性。

在线迁移设计用于从 Amazon EC2 上自托管的开源 Valkey 或 Redis OSS 到 ElastiCache 的数据迁移，而不是 ElastiCache 集群之间的数据迁移。

**重要**  
我们强烈建议您完整阅读以下部分，然后再开始在线迁移过程。

在调用 `StartMigration` API 操作或 Amazon CLI 命令时，将开始迁移。迁移 Valkey 或 Redis OSS（已禁用集群模式）集群时，迁移过程会使 ElastiCache（兼容 Valkey 或 Redis OSS）集群的主节点成为源 Valkey 或 Redis OSS 主节点的副本。迁移 Valkey 或 Redis OSS（已启用集群模式）集群时，迁移过程会使每个 ElastiCache 分片的主节点成为源集群的拥有相同槽的对应分片的副本。

在客户端更改准备就绪后，调用 `CompleteMigration` API 操作。此 API 操作将您的 ElastiCache 部署提升到具有主节点和副本节点（在适用时）的主 Valkey 或 Redis OSS 部署。现在，您可以重新导向客户端应用程序以开始将数据写入到 ElastiCache。在整个迁移过程中，您可以通过在 Valkey 节点和 ElastiCache 主节点上运行 [valkey-cli INFO](https://valkey.io/commands/info) 命令来查看复制状态。

## 迁移步骤


以下主题简要说明了迁移数据的过程：
+ [准备源和目标以进行迁移](Migration-Prepare.md)
+ [测试数据迁移](Migration-Test.md)
+ [开始迁移](Migration-Initiate.md)
+ [验证数据迁移进度](Migration-Verify.md)
+ [完成数据迁移](Migration-Complete.md)

# 准备源和目标以进行迁移


通过这些步骤，您可以准备将数据从 EC2 上的自托管 Valkey 或 Redis 源迁移到 ElastiCache，或者从 Redis OSS 集群迁移到 ElastiCache Valkey 集群。

这指的是从自托管实例迁移到 ElastiCache 服务。有关在 ElastiCache 上从 Redis OSS 升级到 Valkey 的信息，请参阅[升级引擎版本，包括跨引擎升级升级引擎版本](VersionManagement.HowTo.md)。

您必须确保已经满足了下面提到的所有四个先决条件，才能开始从 ElastiCache 控制台、API 或 Amazon CLI 迁移数据。

**准备源和目标 Valkey 或 Redis OSS 节点以进行迁移**

1. 确定目标 ElastiCache 部署，并确保您可以将数据迁移到该部署。

   现有或新创建的 ElastiCache 部署应满足以下要求才能进行迁移：
   + 它使用的是 Valkey 或 Redis OSS 5.0.6 或更高版本。
   + 它未启用传输中加密。
   + 它已启用多可用区。
   + 它具有足够的可用内存以容纳 Valkey 或 Redis OSS 集群中的数据。要配置正确的保留内存设置，请参阅[管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。
   + 对于已禁用集群模式，您可以直接从 Valkey 或 Redis OSS 2.8.21 及更高版本迁移到 Valkey 或 Redis OSS 5.0.6 及更高版本（使用 CLI），或迁移到 Valkey 或 Redis OSS 5.0.6 及以后版本（使用 CLI 或控制台）。对于已启用集群模式，您可以直接从任何已启用集群模式的 Valkey 或 Redis 版本迁移到 Redis OSS 5.0.6 及更高版本（使用 CLI），或迁移到 Redis OSS 5.0.6 及以后版本（使用 CLI 或控制台）。
   + 源和目标中的分片数量相匹配。
   + 它不是全局数据存储的一部分。
   + 它已禁用数据分层。

1. 确保开源 Valkey 或 Redis OSS 与 ElastiCache 部署的配置兼容。

   至少，目标 ElastiCache 部署中的所有以下内容应与 Valkey 或 Redis OSS 配置兼容才能进行复制：
   + 集群不应启用 AUTH。
   + 配置 `protected-mode` 应设置为 `no`。
   + 如果在 Valkey 或 Redis OSS 配置中具有 `bind` 配置，应对其进行更新以允许来自 ElastiCache 节点的请求。
   + ElastiCache 节点和 Valkey 或 Redis OSS 集群上的逻辑数据库数量应该相同。该值是在 Valkey 或 Redis OSS 配置中使用 `databases` 设置的。
   + 不应重命名执行数据修改的 Valkey 或 Redis OSS 命令来使数据复制成功完成。例如 `sync`、`psync`、`info`、`config`、`command` 和 `cluster`。
   + 要将数据从 Valkey 或 Redis OSS 集群复制到 ElastiCache，请确保具有足够的 CPU 和内存以处理这一额外负载。该负载来自于 Valkey 或 Redis OSS 集群创建并通过网络传输到 ElastiCache 节点的 RDB 文件。
   + 源集群上的所有 Valkey 或 Redis OSS 实例都应在同一个端口上运行。

1. 执行以下操作，以确保实例可以连接到 ElastiCache：
   + 确保每个实例的 IP 地址是私有的。
   + 在与实例上的 Valkey 或 Redis OSS 相同的虚拟私有云（VPC）中分配或创建 ElastiCache 部署（建议）。
   + 如果 VPC 不同，请设置 VPC 对等以允许集群之间的访问。有关 VPC 对等的更多信息，请参阅[用于访问 Amazon VPC 中的 ElastiCache 缓存的访问模式](elasticache-vpc-accessing.md)。
   + 附加到 Valkey 或 Redis OSS 实例的安全组应允许来自 ElastiCache 节点的入站流量。

1. 在数据迁移完成后，确保应用程序可以将流量传送到 ElastiCache 节点。有关更多信息，请参阅 [用于访问 Amazon VPC 中的 ElastiCache 缓存的访问模式](elasticache-vpc-accessing.md)。

# 测试数据迁移


在满足所有先决条件后，您可以使用 Amazon Web Services 管理控制台、ElastiCache API 或 Amazon CLI 验证迁移设置。下面显示了使用 CLI 的示例。

使用以下参数调用 `test-migration` 命令以测试迁移：
+ `--replication-group-id` – 数据要迁移到的复制组的 ID。
+ `--customer-node-endpoint-list` – 应从中迁移数据的端点的列表。列表应该只有一个元素。

以下是一个使用 CLI 的示例。

```
aws elasticache test-migration --replication-group-id test-cluster --customer-node-endpoint-list "Address='10.0.0.241',Port=6379"
```

ElastiCache 将在不进行任何实际数据迁移的情况下验证迁移设置。

# 开始迁移


在满足所有先决条件后，您可以使用 Amazon Web Services 管理控制台、ElastiCache API 或 Amazon CLI 开始迁移数据。如果启用集群模式，当插槽迁移有所不同时，将在实时迁移之前执行重新分片。下面显示了使用 CLI 的示例。

**注意**  
我们建议使用 `TestMigration` API 来验证迁移设置。但这完全是可选的。

可以使用以下参数调用 `start-migration` 命令以开始进行迁移：
+ `--replication-group-id` – 目标 ElastiCache 复制组的标识符
+ `--customer-node-endpoint-list` – 具有 DNS 或 IP 地址以及运行源 Valkey 或 Redis OSS 集群的端口的端点列表。对于禁用集群模式和启用集群模式，列表只能使用一个元素。如果启用了链式复制，则端点可能指向副本，而不是 Valkey 或 Redis OSS 集群中的主节点。

以下是一个使用 CLI 的示例。

```
aws elasticache start-migration --replication-group-id test-cluster --customer-node-endpoint-list "Address='10.0.0.241',Port=6379"
```

当您运行此命令时，ElastiCache 主节点（在每个分片中）会将自己配置成为您的 Valkey 或 Redis OSS 实例的副本（在启用集群的 redis 中拥有相同插槽的相应分片中）。ElastiCache 集群的状态将变为**正在迁移**，并开始将数据从 Valkey 或 Redis OSS 实例迁移到 ElastiCache 主节点。根据 Valkey 或 Redis OSS 实例上的数据大小和负载，迁移可能需要一段时间才能完成。您可以在 Valkey 实例和 ElastiCache 主节点上运行 [valkey-cli INFO](https://valkey.io/commands/info) 命令来检查迁移进程。

在成功复制后，写入到 Valkey 或 Redis OSS 实例的所有数据都将传播到 ElastiCache 集群。您可以使用 ElastiCache 节点执行读取操作。不过，您无法写入到 ElastiCache 集群。如果 ElastiCache 主节点连接了其他副本节点，这些副本节点将继续从 ElastiCache 主节点中进行复制。这样，Valkey 或 Redis OSS 集群中的所有数据将复制到 ElastiCache 集群中的所有节点。

如果 ElastiCache 主节点无法成为 Valkey 或 Redis OSS 实例的副本，则它会重试几次，然后最终将自身重新提升回为主节点。ElastiCache 集群的状态将变为 **available（可用）**，并发送有关启动迁移失败的复制组事件。要解决此类故障，请检查以下内容：
+ 查看复制组事件。使用事件中的任何特定信息修复迁移失败。
+ 如果事件未提供任何特定信息，请确保您遵循[准备源和目标以进行迁移](Migration-Prepare.md)中的准则。
+ 确保 VPC 和子网的路由配置允许 ElastiCache 节点和 Valkey 或 Redis OSS 实例之间的流量。
+ 确保附加到 Valkey 或 Redis OSS 实例的安全组允许来自 ElastiCache 节点的入站流量。
+ 检查实例的 Valkey 或 Redis OSS 日志，以获取有关特定于复制的失败的更多信息。

# 验证数据迁移进度


在数据迁移开始后，您可以执行以下操作以跟踪其进度：
+ 在 ElastiCache 主节点上验证 `INFO` 命令中的 Valkey 或 Redis OSS `master_link_status` 是否为 `up`。您还可以在 ElastiCache 控制台中找到该信息。选择集群，然后在 **CloudWatch metrics**（CloudWatch 指标）下观察 **Primary Link Health Status**（主链接运行状况）。在该值达到 1 后，数据就会同步。
+ 您可以在 Valkey 或 Redis OSS 实例上运行 `INFO` 命令来查看 ElastiCache 副本是否具有**在线**状态。这样做还会提供有关复制滞后的信息。
+ 对 Valkey 或 Redis OSS 实例使用 [CLIENT LIST](https://valkey.io/commands/client-list) 命令以验证低客户端输出缓冲区。

在数据迁移完成后，数据与进入 Valkey 或 Redis OSS 集群的主节点的任何新的写入保持同步。

# 完成数据迁移


在准备好切换到 ElastiCache 集群时，请使用具有以下参数的 `complete-migration` CLI 命令：
+ `--replication-group-id` – 复制组的标识符。
+ `--force` – 此值强制停止迁移，而不确保数据保持同步。

示例如下：

```
aws elasticache complete-migration --replication-group-id test-cluster
```

在运行该命令时，ElastiCache 主节点（在每个分片中）将停止从 Valkey 或 Redis OSS 实例进行复制，并将其提升为主实例。该提升通常在几分钟内完成。要确认提升为主节点，请检查事件 `Complete Migration successful for test-cluster`。此时，您可以将应用程序定向到 ElastiCache 写入和读取。ElastiCache 集群状态应从 **migrating（正在迁移）**变为 **available（可用）**。

如果提升为主实例失败，ElastiCache 主节点将继续从 Valkey 或 Redis OSS 实例中进行复制。ElastiCache 集群继续处于 **migrating（正在迁移）**状态，并发送有关该失败的复制组事件消息。要解决该故障，请查看以下内容：
+ 检查复制组事件。使用事件中的特定信息修复故障。
+ 您可能会收到有关数据不同步的事件消息。如果收到该消息，请确保 ElastiCache 主节点可以从 Valkey 或 Redis OSS 实例中复制，并且两者保持同步。如果仍要停止迁移，您可以使用 `—force` 选项运行前面的命令。
+ 如果正在替换其中一个 ElastiCache 节点，您可能会收到事件消息。在完成替换后，您可以重新尝试完成迁移步骤。

# 使用控制台执行联机数据迁移


您可以使用 Amazon Web Services 管理控制台将数据从您的集群迁移到 Valkey 或 Redis OSS 集群。

**使用控制台执行联机数据迁移**

1. 登录到控制台并打开 ElastiCache 控制台 ([https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/home/home))。

1. 创建新的 Valkey 或 Redis OSS 集群，或选择现有集群。确保集群满足以下要求：
   + 引擎版本应为 Valkey 7.2 及更高版本或者 Redis OSS 5.0.6 或更高版本。
   + 集群不应启用 AUTH。
   + 配置 `protected-mode` 应设置为 `no`。
   + 如果在 Valkey 或 Redis OSS 配置中具有 `bind` 配置，应对其进行更新以允许来自 ElastiCache 节点的请求。
   + ElastiCache 节点和您的 Valkey 或 Redis OSS 集群的数据库数量应该相同。该值是在引擎配置中使用 `databases` 设置的。
   + 不应重命名执行数据修改的 Valkey 或 Redis OSS 命令来使数据复制成功完成。
   + 要将数据从 Valkey 或 Redis OSS 集群复制到 ElastiCache，请确保具有足够的 CPU 和内存以处理这一额外负载。该负载来自于 Valkey 或 Redis OSS 集群创建并通过网络传输到 ElastiCache 节点的 RDB 文件。
   + 集群处于 **available (可用)** 状态。

1. 选择您的集群后，在 **Actions（操作）**中选择 **Migrate Data from Endpoint（从端点迁移数据）**。

1. 在**从端点迁移数据**对话框中，输入 Valkey 或 Redis OSS 集群可用的 IP 地址和端口。
**重要**  
IP 地址必须准确。如果未正确输入地址，迁移将失败。

1. 选择 **Start Migration (开始迁移)**。

   在集群开始迁移时，它将变为 **Modifying (正在修改)** 状态，然后变为 **Migrating (正在迁移)** 状态。

1. 在导航窗格上选择 **Events (事件)** 以监视迁移进度。

在迁移过程中的任何时候，您都可以停止迁移。为此，选择您的集群，然后在 **Actions（操作）**中选择 **Stop Data Migration（停止数据迁移）**。然后，集群将变为 **Available (可用)** 状态。

如果迁移成功，集群将变为 **Available (可用)** 状态，并且事件日志显示以下内容：

`Migration operation succeeded for replication group ElastiCacheClusterName.`

如果迁移失败，集群将变为 **Available (可用)** 状态，并且事件日志显示以下内容：

`Migration operation failed for replication group ElastiCacheClusterName.`