问题排查

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

连接错误场景

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

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

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

从 Google Cloud 连接到 Memorystore 实例 例如 Compute Engine 虚拟机,则必须将这些资源 与 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-networkingiam.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 服务账号格式

iam.allowedPolicyMemberDomains 组织存在一个已知问题 政策导致在使用 Memorystore for Redis 实例(使用 [PROJECT_NUMBER]-compute@developer.gserviceaccount.com 服务账号 格式。

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

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

选项 1

您可以创建新实例。新创建的实例具有 与组织政策兼容的服务账号格式。如果 对维护缓存内容至关重要,您可以执行导出以备份 并将其导入新实例。请注意, 已创建的实例具有新的服务 IP 地址,需要在 部署应用

选项 2

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