如何排除从 S3 还原 ElastiCache 集群的故障?

上次更新时间:2022 年 8 月 5 日

从 Amazon Simple Storage Service (Amazon S3) 还原 Amazon ElastiCache for Redis 备份时,集群创建失败。我收到了“Create-failed”(创建失败)或“Permission denied”(权限被拒绝)”的错误消息。我应该如何对此进行故障排除?

简短描述

以下是从 Amazon S3 还原 ElastiCache 备份失败的常见原因:

  • 您正在尝试还原超出备份限制的备份。
  • ElastiCache 无法从 Amazon S3 中检索该文件。
  • ElastiCache 备份文件位于另一个区域的 Amazon S3 存储桶中。
  • 您正在将包含多个数据库的 .rdb 文件还原到 ElastiCache(已启用集群模式)集群。

解决方法

您正在尝试还原超出备份限制的备份

还原 ElastiCache for Redis 备份时,请务必注意以下备份限制

  • 您无法从使用 Redis(已启用集群模式)集群创建的备份还原到 Redis(已禁用集群模式)集群。
    • 还原从 ElastiCache(已启用集群模式)集群创建的备份时,您无法在 ElastiCache 控制台中选择“cluster mode disabled”(已禁用集群模式)选项。只有“cluster mode enabled”(已启用集群模式)选项可用。
    • 将 ElastiCache(已启用集群模式)集群备份导出到 Amazon S3 时,将创建多个 .rdb 文件(每个分片一个)。如果您尝试从 Amazon S3 为备份设定种子,则只能引用一个备份 (.rdb)。这会导致为单个分片的键设定种子。尝试通过包括通配符来规避这种情况会导致以下错误:
      错误:对于以下 S3 对象不存在对象或存储桶:examplebucket/cluster-mode-enabled-*.rdb
  • 您无法从使用数据分层的集群还原备份。例如,您无法将 r6gd 节点还原到不使用数据分层的集群(如 r6g 节点)中。
  • 如果 .rdb 文件引用了多个数据库,则您无法从 Redis(已禁用集群模式)集群还原到 Redis(已启用集群模式)集群。尝试这样做将导致以下错误:
    错误:要在集群模式下还原快照,RDB 文件中的所有键都应驻留在 DB 0 中。

ElastiCache 无法从 Amazon S3 检索文件

当 ElastiCache 没有访问存储在 S3 存储桶中的 ElastiCache 备份所需的权限时,就会发生此错误。您可以通过查看 ElastiCache Events(ElastiCache 事件)来确认权限问题。

以下示例 ElastiCache 事件显示,Redis 复制组“测试”创建失败,因为 ElastiCache 无法从 S3 检索备份文件:

Restore from snapshot failed for node group 0001 in replication group test. Failed to retrieve file from S3

确定错误的原因是 ElastiCache 无法从 Amazon S3 检索文件后,请确认您的区域是以下区域之一:

选择加入区域需要允许 ElastiCache 从 Amazon S3 检索备份文件的存储桶策略

如果您的 S3 存储桶位于以下区域之一,则您必须允许 ElastiCache 服务访问 S3 中的备份文件

  • 中国(北京)和中国(宁夏)
  • AWS GovCloud(美国西部)
  • 默认区域

注意:中国(北京)、中国(宁夏)和 AWS GovCloud(美国西部)区域的规范 ID 与默认 AWS 区域不同:

中国(北京)和中国(宁夏)

Canonical ID: b14d6a125bdf69854ed8ef2e71d8a20b7c490f252229b806e514966e490b8d83

AWS GovCloud(美国西部)区域

Canonical ID: 40fa568277ad703bd160f66ae4f83fc9dfdfd06c2f1b5060ca22442ac3ef8be6

AWS 默认区域

Canonical ID: 540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353

使用规范 ID 或存储桶策略授予 ElastiCache 对 Amazon S3 中 .rdb 备份对象的访问权限后,还原 Redis 集群

ElastiCache 备份文件位于另一个区域的 Amazon S3 存储桶中

以下错误消息表明您正在尝试还原位于另一个区域的 Amazon S3 存储桶中的 ElastiCache 备份:

“访问 S3 对象的权限被拒绝。请使用同一区域中的 S3 对象。”

要解决此问题,请执行以下操作:

1.    将备份 (.rdb) 从包含备份的 S3 存储桶复制到位于还原 Redis 集群的区域中的 S3 存储桶。

以下是一个示例 AWS 命令行界面 (AWS CLI) 命令,您可以使用该命令在不同区域的 Amazon S3 存储桶之间进行复制:

aws s3 cp s3://SourceBucketName/BackupName.rdb s3://DestinationBucketName/BackupName.rdb --acl bucket-owner-full-control --source-region SourceRegionName --region DestinationRegionName

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

2.    复制完成后,确认备份 (.rdb) 对象拥有以规范 ID 或存储桶策略的形式分配给它的正确权限。有关正确的规范 ID,请参阅上一节。

现在,备份对象已复制到正确的区域并应用了正确的权限,您可以继续还原集群了。

您正在将包含多个数据库的 .rdb 文件还原到 ElastiCache(已启用集群模式)集群

您无法将包含多个数据库的 Redis 备份 (.rdb) 文件还原到 ElastiCache(已启用集群模式)集群。ElastiCache(已启用集群模式)不支持多个数据库。所有键都应驻留在 DB0 中。您可以通过查看 ElastiCache Events(ElastiCache 事件)来确认这是否是还原失败的原因。

以下示例 ElastiCache 事件显示,由于 .rdb 文件包含多个数据库,Redis 复制组“测试”创建失败。

Restore from snapshot failed for node group 0001 in replication group test. To restore a snapshot in cluster mode, all keys in the RDB file should reside in DB 0. Snapshot ID: arn:aws:s3:::example-bucket/multidb.rdb

要更正此问题,请执行以下操作:

1.    确保将所有键都迁移到单个数据库中。

注意:如果源数据库位于 ElastiCache Redis 上,则不支持迁移命令

2.    当所有键都位于同一个数据库上之后,您可以创建 Redis 数据库的本地备份,将该备份上传到 Amazon S3,然后继续还原到 ElastiCache(已启用集群模式)集群


这篇文章对您有帮助吗?


您是否需要账单或技术支持?