问题排查

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

连接错误场景

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

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

不同 VPC 网络中预配的资源导致的连接错误

如需从 Google Cloud 资源(例如 Compute Engine 虚拟机)连接到 Memorystore 实例,必须在 Redis 实例所在的已获授权的 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,但您可以使用 SCAN,它是 KEYS 命令更安全的替代方案。使用 LRANGE 查询所有键空间或大部分键空间可能需要高 CPU 资源。将复杂的 Lua 脚本与 EVAL 搭配使用可能会导致高 CPU 使用率。

HGETALLZRANGE 还可能返回大量键,从而对服务器的性能产生不利影响。

在运行开销高昂的命令之前,您应该检查该命令查询的数据结构的大小,以确保不会导致延迟。

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

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

网络错误场景

分配的 IP 地址范围已用尽,或者存在冲突的路由

在专用于 Memorystore for Redis 的 IP 地址范围中创建资源时,您可能会耗尽所有地址,从而导致以下错误消息。或者,可能存在与您正在尝试创建的 Redis 实例的 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

Unable to create instance. Network quota limit has been reached. 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 网络作为 --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,因为该范围是为内部组件预留的。

从其他 Google Cloud 资源连接到 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.

要为这些服务账号重新建立政策绑定,请运行以下命令之一,并将 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 的导入和导出时可能会遇到的一些常见问题。

Google Cloud 控制台中已停用导入和导出按钮

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

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

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

如果导入操作已完成,但数据未恢复,请先检查 Google Cloud 控制台或命令行是否存在错误消息,然后解决错误消息中所述的任何问题。

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

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

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

排查 Google Cloud CLI 问题

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

gcloud components update

停止 Redis 实例的所有正在进行的命令和连接

由于 Memorystore for Redis 是 Google 代管的产品,因此有一些命令在 Redis 实例中被屏蔽,以便提供安全可靠的环境。受限命令之一是 CLIENT(其中包含用于停止命令的 CLIENT KILL)。

如果 Redis 命令占用了大量 CPU/RAM 利用率并且影响生产环境,则需要重启实例(适用于基本层级配置)或故障切换到副本(用于标准层级配置)。此重启/故障切换操作会停止在 Redis 服务器上运行的所有命令,并结束所有正在进行的连接。

以下是用于为每个 Memorystore for Redis 配置执行重启或故障切换的命令。

在标准级 Memorystore for Redis 实例中停止命令

gcloud redis instances failover INSTANCE_NAME --data-protection-mode=limited-data-loss

在基本级 Memorystore for Redis 实例中停止命令

在 Memorystore for Redis 实例中执行重启的唯一方法是更改其配置,例如纵向扩容实例。您可以在下面找到用于重启实例的命令示例。

gcloud redis instances update INSTANCE_NAME --region REGION_ID --size NUMBER_GB

将实例扩缩为不同大小后,您可以运行其他扩缩操作来将其恢复到原始大小。

与网域限定共享组织政策相关的问题

Memorystore for Redis 使用两种不同的服务帐号格式之一,具体取决于实例的创建时间。如需确定您的实例使用的服务帐号格式,请参阅 Memorystore for Redis 服务帐号格式

存在一个已知问题:当与采用 [PROJECT_NUMBER]-compute@developer.gserviceaccount.com 服务帐号格式的 Memorystore for Redis 实例搭配使用时,iam.allowedPolicyMemberDomains 组织政策会导致错误。

在下列情况下,您可能会遇到以下错误: One or more users named in the policy do not belong to a permitted customer.

您可以通过以下两种方式解决此问题。

选项 1

您可以创建一个新实例。新创建的实例具有与组织政策兼容的服务帐号格式。如果维护缓存内容至关重要,您可以执行导出以备份现有数据,然后导入新实例。请注意,新创建的实例具有新的服务 IP 地址,您需要在应用中配置该地址。

选项 2

如果无法重新创建 Memorystore 实例,请按照强制帐号访问权宜解决方法。