问题排查

本页面介绍了各种错误场景、这些场景的错误消息以及解决这些错误的问题排查步骤。

连接错误场景

如果实例遇到连接问题,请检查本部分中的场景,看看是否是某个原因导致了问题。

如果不是,请使用 telnet 连接到某个 Redis 节点并运行一些简单的 Redis 命令,以查看实例是否响应。

由于在不同区域或不同 VPC 网络中预配资源而导致的连接错误

要从 Google Cloud 资源(例如 Compute Engine 虚拟机)连接到 Memorystore 实例,这些资源必须在同一区域和同一 VPC 网络中预配。

如果尝试通过位于不同区域或 VPC 网络中的资源使用 telnet 连接到 Memorystore 实例,则会导致以下错误消息:

telnet: Unable to connect to remote host: Connection timed out

由于 VPC 网络对等互连已删除而导致的连接错误

创建 Memorystore for Redis 实例时会在您的 VPC 网络和 Google 内部 VPC 网络之间创建一个 VPC 对等互连。

网络对等互连采用以下格式:

redis-peer-############

如果删除了此网络对等互连,则尝试使用 telnet 连接到 Redis 实例将会导致以下错误消息:

telnet: Unable to connect to remote host: Connection timed out

要重新建立已删除的网络对等互连,最简单的方法是创建一个新的 Memorystore for Redis 实例。创建新的 Redis 实例可以重新建立已删除的网络对等互连,因此您可以删除该对等互连,您的原始 Redis 实例具有所需的网络对等互连。

防火墙规则会阻止您的实例 IP 地址

如果您创建的出站防火墙规则阻止了 Redis 端口 (6379) 或实例的 IP 地址,则可能会出现连接问题。

切勿创建会阻止 Redis 实例 IP 范围的网络防火墙规则。

高 CPU 使用率错误场景

由于不当使用开销大的 Redis 命令而导致的 Redis 实例无响应

如果 Redis 实例遇到高延迟、无响应或连接问题,则问题可能是由于不当使用以下 Redis 命令造成的:

这些命令可能会给实例带来沉重的 CPU 压力。开源 Redis 不鼓励在生产环境中运行 KEYS。使用 LRANGE 查询所有或大部分键空间可能需要大量 CPU 资源。通过 EVAL 使用复杂的 Lua 脚本可能会导致 CPU 使用率较高。

如果实例遇到高延迟或无响应的情况,请检查您的客户端日志,看看是否运行了任何开销大的命令。如果有,请记下时间。接下来,使用 Cloud Monitoring 查看 redis.googleapis.com/stats/cpu_utilization 指标。查看高 CPU 利用率的时间段是否与运行开销大的命令的相同。

建议您不要在生产环境中使用 KEYS 命令。对于 EVAL,请使用不太复杂的 Lua 脚本。对于 LRANGE,请减少在单个操作中查询的键集中的键数。

网络错误场景

已用完分配的 IP 范围

Memorystore for Redis 要求您使用专用服务访问连接以及与该连接关联的 IP 地址范围。可以用尽该范围内 Redis 实例和其他 Google Cloud 资源可用的 IP 地址。

如果 IP 地址已用尽,则创建实例将返回以下错误消息:

The IP ranges for the connection do not have enough available IPs. Allocate a new range or expand existing range and try again.

您可以通过分配其他 IP 地址来解决此问题。如需详细了解如何执行此操作,请参阅 IP 地址范围用尽

您没有为网络建立专用服务访问连接

如果您的 Redis 实例使用专用服务访问连接模式,但您的网络不存在专用服务访问连接,您可能会收到以下错误:

Google private service access is not enabled. Enable private service access and try again

为解决此问题,请建立专用服务访问通道连接

已删除专用服务访问通道的网络对等互连

建立专用服务访问连接会创建一个名为 servicenetworking-googleapis-com 的网络对等互连连接,该连接显示在项目的 VPC 网络对等互连页面中。

如果删除网络对等互连,您会收到现有 Redis 实例发生的以下错误:

  • telnet: Unable to connect to remote host: Connection timed out

如果删除网络对等互连,当您创建 Redis 实例时,会收到以下错误:

  • Private services access is not configured correctly. For steps on how to verify the connection, check the documentation.

为解决此问题,请按照建立专用服务访问连接中 gcloud 说明的最后一步进行操作。

创建 Redis 实例期间存在冲突的网络标志

如果您同时使用 --reserved-ip-range 参数和 --connect-mode=private-service-access 参数,则会收到以下错误:

Reserved IP range is not supported for --connect-mode private services access

为解决此问题,请搭配使用 --reserved-ip-range--connect-mode=direct-peering 或使用 --connect-mode=PRIVATE_SERVICE_ACCESS

您不能同时使用这两者,因为专用服务访问连接模式不支持 --reserved-ip-range 参数。

您的项目超出子网配额

您的项目中可创建的子网数量存在限制。如果超出此配额,则会收到以下错误消息:

Internal network quota exceeded. Please request higher limit here: https://forms.gle/ZfVduUGq2iSYcYGm8

为解决此问题,请填写错误消息中的表单,或与 Google Cloud 支持团队联系。

服务项目未附加到宿主项目

如果您使用的是共享 VPC,当您收到以下错误时,您的服务项目未附加到宿主项目:

Invalid network name <network-name>. Project <project-name> referenced is not the host project for <service-project-name>.

为解决此问题,请将您的服务项目附加到宿主项目。

创建实例期间使用的直接对等互连连接模式和共享 VPC 网络不兼容

从实例的宿主项目中指定共享 VPC 网络时,您无法在具有直接对等互连连接模式的服务项目中创建 Redis 实例。

如果您没有为 --connection-mode 设置值,则连接模式会默认设置为 direct-peering。如果您在实例创建期间尝试使用直接对等互连连接模式,并且还从宿主项目中选择共享 VPC 网络作为 --authorized-network 的值,则会收到以下错误:

Authorized_network must exist in the same project as redis instance

要解决此问题,请确保在 Redis 实例创建命令中指定 --connect-mode=PRIVATE_SERVICE_ACCESS,或在 Redis 实例所在的项目中选择常规 VPC 网络。

不受支持的 Compute Engine IP 地址范围

您无法从 IP 地址在 172.17.0.0/16 范围内的 Compute Engine 虚拟机访问 Memorystore for Redis,因为该范围是为内部组件预留的。

从其他 GCP 资源连接到 Redis 实例时出错

从需要 Serverless VPC Access 连接器的无服务器环境连接到实例时出错

如果您无法使用其中一个需要无服务器 VPC 访问通道连接器的无服务器环境,可能的原因是您没有为环境设置无服务器 VPC 访问通道连接器。

如需了解详情,请参阅无服务器 VPC 访问通道连接器要求

使用 Google Kubernetes Engine 集群连接到实例时出错

如果您的集群上未启用 VPC 原生/IP 别名,则您无法从 GKE 集群连接到 Memorystore for Redis 实例。在 GKE 集群创建期间启用 VPC 原生/IP 别名最为简单。创建集群时,请选择高级选项下的 VPC 原生。如需了解详情,请参阅创建 VPC 原生集群

Identity and Access Management (IAM) 错误场景

恢复服务帐号已删除的政策绑定

Memorystore for Redis 使用以下服务帐号来管理 Redis 实例:

  • service-project-number@service-networking.iam.gserviceaccount.com
  • service-project-number@cloud-redis.iam.gserviceaccount.com

删除这些服务帐号的政策绑定会导致您无法创建新实例。

如果您尝试在此场景中使用 gcloud 创建 Redis 实例,则可能会收到以下错误消息:

(gcloud.redis.instances.create) FAILED_PRECONDITION: A required IAM policy might be missing. Please run this command:"gcloud projects add-iam-policy-binding <YOUR-PROJECT-ID> --member='serviceAccount:service-<YOUR-PROJECT-NUMBER>@cloud-redis.iam.gserviceaccount.com' --role='roles/redis.serviceAgent'" and try again. com.google.apps.framework.request.StatusException: <eye3 title='FAILED_PRECONDITION'/> generic::FAILED_PRECONDITION: A required IAM policy might be missing. Please run this command:"gcloud projects add-iam-policy-binding <YOUR-PROJECT-ID> --member='serviceAccount:service-<YOUR-PROJECT-NUMBER>@cloud-redis.iam.gserviceaccount.com' --role='roles/redis.serviceAgent'" and try again.

要为这些服务帐号重新建立政策绑定,请运行以下命令之一,并将 variables 替换为适当的值。运行与已删除服务帐号相关联的命令。

gcloud projects add-iam-policy-binding project-id --member='serviceAccount:service-project-number@service-networking.iam.gserviceaccount.com' --role='roles/servicenetworking.serviceAgent'
gcloud projects add-iam-policy-binding project-id --member='serviceAccount:service-project-number@cloud-redis.iam.gserviceaccount.com' --role='roles/redis.serviceAgent'

操作超时错误

以下错误场景会导致 Redis 实例无响应和/或实例/节点操作超时。

网络分区错误

有时,由于 Google Cloud 服务器中发生网络分区错误,导致 Google Cloud 资源无法在某个区域内的各地区之间进行通信。这可能会导致实例失去连接,从而造成超时错误。

在 Google Cloud 解决预配了实例的区域或地区的网络分区错误后,连接应该恢复正常。

在此场景中,您可能会看到类似如下所示的连接错误消息:

telnet: Unable to connect to remote host: Connection timed out

如果您无法确定超时错误的原因,请与 Google Cloud 支持团队联系。

服务项目和宿主项目不在同一个 VPC 服务控制边界内

如果您使用的是共享 VPCVPC 服务控制边界,并且 Redis 实例创建操作超时,这可能表示您的服务项目和宿主项目不在同一服务边界中。您的服务项目和宿主项目必须位于同一边界内,以便 Redis 实例通过共享 VPC 网络与进行连接的客户端通信。

要查看您是否遇到了此问题,请检查 Redis 实例的审核日志中是否存在以下错误:

violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"

为解决此问题,请将您的主机网络和服务网络置于同一服务边界内。

排查导入和导出的问题

本节概述了在使用 Memorystore for Redis 的导入和导出时可能会遇到的一些常见问题。

在 Cloud Console 中已停用导入和导出按钮

问题:已登录控制台的用户没有导入和/或导出 RDB 文件所需的 redis.instances.import 和/或 redis.instances.export 权限。

解决方案:向用户授予权限,然后刷新实例详情页面。

导入操作已完成,但数据未恢复

如果导入操作已完成,但数据未恢复,请先检查 Cloud Console 或命令行中的错误消息,然后解决错误消息所述的所有问题。

如果在导入过程中发生失败,则使用空 RDB 文件恢复实例。您可以尝试通过再次导入同一 RDB 文件或使用其他 RDB 文件来恢复数据。

由于 RDB 文件过大,导入失败

如果您收到错误消息“导入 RDB 文件 gs://bucket/object.rdb 大小超出了 10GB 的最大内存”,您应该扩充实例并重试导入操作。您还可以尝试将更小的 RDB 文件导入至实例。

排查 gcloud 命令行工具的问题

如果您遇到 gcloud 工具命令不可用的问题,或者该命令的行为与其记录方式不同,请尝试更新 gcloud SDK:

gcloud components update