排查问题

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

连接问题

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

如果本部分中的问题与您的问题不符,请使用 telnet 连接到某个 Redis 节点并运行一些 Redis 命令,以查看实例是否响应。

如果节点无响应,请查看是否有任何网络问题导致节点的网络连接被阻止。如果上述问题均无法解决问题,请与 Cloud Customer Care 联系。

您在不同的 VPC 网络中预配资源。

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

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

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

您删除了 VPC 网络对等互连。

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

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

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

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

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

如需重新建立已删除的网络对等互连,请创建另一个实例。然后,删除此实例。您的原始实例现在具有所需的网络对等互连。

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

如果您创建的出站防火墙规则阻止了 Memorystore for Redis 实例的端口 (6379) 或 IP 地址,则可能会遇到连接问题。请勿创建会阻止实例 IP 地址范围的网络防火墙规则。

CPU 使用率问题

本部分介绍了 Memorystore for Redis 实例可能会遇到的 CPU 使用率问题。

实例出现高延迟或无响应的情况。

如果您的 Memorystore for Redis 实例遇到高延迟或无响应问题,则这些问题可能是由于使用了以下消耗大量资源的 Redis 命令造成的:

这些命令可能会给实例带来沉重的 CPU 压力。建议您不要在生产环境中运行 KEYS 命令。请改用 SCAN,因为此命令使用的资源比 KEYS 少。

使用 LRANGE 查询所有或大部分键空间可能需要大量 CPU 资源。为解决此问题,我们建议您减少在单个操作中查询的键集中的键数。

通过 EVAL 使用复杂的 Lua 脚本也可能会导致 CPU 使用率较高。我们建议您使用不太复杂的 Lua 脚本。

HGETALLZRANGE 可能会返回大量键,从而对服务器的性能产生不利影响。我们建议您运行 HSCAN 命令,而不是 HGETALL。此外,在开始使用 ZRANGE 之前,我们建议您限制查询所用范围的大小。

在运行资源密集型命令之前,请检查该命令查询的数据结构的大小,以确保它不会导致延迟。

如果您的实例遇到高延迟或无响应的情况,请执行以下操作:

  1. 检查客户端日志,看看是否运行了任何占用大量资源的命令。 如果有,请记下日期和时间。
  2. 使用 Cloud Monitoring 查看 redis.googleapis.com/stats/cpu_utilization 指标。查看高 CPU 利用率的时间段是否与运行资源密集型命令的时间段相同。

实例的输出缓冲区空间不足。

如果 Memorystore for Redis 实例的输出缓冲区空间不足,请执行以下操作:

当实例的内存已满且有新的写入时,Memorystore for Redis 会根据实例的 maxmemory 政策逐出键,为写入腾出空间。allkeys-lru 政策会从整个键集中逐出最近最少使用的 (LRU) 键。

建议您监控实例的 maxmemory 和已用内存。这有助于您了解实例是否达到预配的实例容量。此外,通过减小 maxmemory-gb 参数的值,您可以为开销留出更多空间。

网络问题

本部分介绍了实例可能会遇到的网络问题。

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

在专用于 Memorystore for Redis 的 IP 地址范围中创建资源时,您可能会耗尽所有 IP 地址。或者,可能存在与您正在尝试创建的 Memorystore for 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 地址范围用尽

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

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

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

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

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

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

如果您删除网络对等互连,现有实例会显示以下错误消息:

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

此外,如果您删除网络对等互连并创建实例,则会显示以下错误消息:

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

如需解决此问题,请通过运行以下命令在您的网络和专用服务访问网络之间创建专用服务访问通道连接

gcloud services vpc-peerings connect --service=servicenetworking.googleapis.com --ranges=RESERVED_RANGE_NAME --network=VPC_NETWORK --project=PROJECT_ID

您使用了冲突的参数。

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

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

您不能同时使用这两个参数,因为 Memorystore for Redis 不支持专用服务访问通道连接模式的 --reserved-ip-range 参数。

如需解决此问题,请执行以下某项操作:

  • --reserved-ip-range 参数与 --connect-mode=direct-peering 参数搭配使用。
  • 请勿使用 --reserved-ip-range 参数。

您的项目超出子网配额。

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

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

如需解决此问题,请填写错误消息中显示的表单,或与 Cloud Customer Care 联系。

您未将服务项目关联到宿主项目。

如果您使用共享 VPC,但未将服务项目附加到宿主项目,则会收到以下错误消息:

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

如需解决此问题,请将您的服务项目关联到宿主项目

您可以在具有直接对等互连连接模式的服务项目中创建实例,并指定共享 VPC 网络。

如果您在服务项目中创建 Memorystore for Redis 实例,并为该实例指定宿主项目中的共享 VPC 网络,则无法使用直接对等互连连接模式。

默认情况下,连接模式设置为直接对等互连。如果您在创建实例时尝试使用此连接模式,并且还从宿主项目中选择共享 VPC 网络作为 --network 参数的值,则会收到以下错误消息:

Authorized_network must exist in the same project as redis instance

如需解决此问题,请执行以下某项操作:

  • 创建实例时,请使用专用服务访问通道连接模式
    (--connect-mode=private-service-access)。
  • 选择与实例位于同一项目中的授权 VPC 网络。

您使用的 Compute Engine IP 地址范围是 Memorystore for Redis 无法访问的。

您无法从 IP 地址在 172.17.0.0/16 范围内的 Compute Engine 虚拟机访问 Memorystore for Redis 实例。此范围已预留给内部组件。

如需解决此问题,请从 IP 地址位于不同范围内的 Compute Engine 虚拟机访问您的实例。

从其他 Google Cloud 资源连接到实例时出现问题

本部分介绍了当其他资源尝试连接到 Memorystore for Redis 实例时,该实例可能会遇到的问题。

您无法从需要无服务器 VPC 访问通道连接器的无服务器环境连接到实例

如果您无法使用其中一个需要无服务器 VPC 访问通道连接器的无服务器环境连接到 Memorystore for Redis 实例,请验证您是否已为环境设置此连接器。如需了解详情,请参阅无服务器 VPC 访问通道连接器要求

无法从 Google Kubernetes Engine (GKE) 集群连接到实例

如需从 GKE 集群连接到 Memorystore for Redis 实例,您必须在集群上启用 VPC 原生/IP 别名。

在创建集群时启用 VPC 原生/IP 别名最为简单。在高级选项部分中,选择 VPC 原生。如需了解详情,请参阅创建 VPC 原生集群

Identity and Access Management (IAM) 问题

本部分介绍了 Memorystore for Redis 实例可能遇到的 IAM 问题。

您想恢复服务账号已删除的政策绑定

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

service-PROJECT_NUMBER@service-networking.iam.gserviceaccount.com

service-PROJECT_NUMBER@cloud-redis.iam.gserviceaccount.com

如果您删除这些服务账号的政策绑定,则无法创建实例。

如果您尝试使用 Google Cloud CLI 创建 Memorystore for 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.

如需重新建立 service-networking 服务账号的政策绑定,请运行以下命令。将 VARIABLES 替换为适当的值。

gcloud projects add-iam-policy-binding PROJECT_ID --member='serviceAccount:service-PROJECT_NUMBER@service-networking.iam.gserviceaccount.com' --role='roles/servicenetworking.serviceAgent'

如需为 cloud-redis 服务账号重新建立政策绑定,请运行以下命令。将 VARIABLES 替换为适当的值。

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 组织政策在与使用 [PROJECT_NUMBER]-compute@developer.gserviceaccount.com 服务账号格式的 Memorystore for Redis 实例搭配使用时会导致错误。

在这些问题中,您可能会遇到以下错误: One or more users named in the policy do not belong to a permitted customer.

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

  1. 创建实例:新创建的实例具有与组织政策兼容的相应服务账号格式。如果您必须保留缓存内容,可以执行导出操作来备份现有数据,然后执行导入操作将数据导入到新实例。新创建的实例具有新的服务 IP 地址,需要在应用中进行配置。
  2. 强制执行账号访问权限:仅当无法重新创建实例时,才使用此选项。