问题排查

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

连接错误情况

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

如果不能,请使用 Telnet 连接到其中一个 Redis 节点,并运行一些简单的 Redis 命令以查看实例是否属于响应式实例。

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

如需从 Google Cloud 资源(例如 Compute Engine 虚拟机)连接到 Memorystore 实例,您必须在 Redis 实例所在的授权 VPC 网络上预配这些资源。

如果尝试从其他区域或 VPC 网络中的资源远程连接到 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 资源。将复杂的 Lua 脚本与 EVAL 搭配使用可能导致高 CPU 使用率。

如果您的实例延迟时间较长或无响应,请检查您的客户端日志,看看是否运行了任何昂贵的命令。如果是,请记下时间。 接下来,使用 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 网络

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

如果您没有为 --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,因为该范围是为内部组件预留的。

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

从使用无服务器 VPC 访问通道连接器的无服务器环境连接到实例时出错

如果您无法使用需要无服务器 VPC 访问通道连接器的无服务器环境连接到 Redis 实例,则您可能未为您的环境设置无服务器 VPC 访问通道连接器。

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

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

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

身份和访问权限管理 ( 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 Service Control 边界,并且 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 文件过大

如果您收到错误消息“Import RDB file 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

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