本页面介绍了各种错误场景、这些场景的错误消息以及解决这些错误的问题排查步骤。
连接错误场景
如果实例遇到连接问题,请检查本部分中的场景,看看是否是某个原因导致了问题。
如果不是,请使用 telnet 连接到某个 Redis 节点并运行一些简单的 Redis 命令,以查看实例是否响应。
- 如果节点无响应,请查看网络错误场景中是否有任何问题排查问题阻止了节点的网络连接。否则请与 Google Cloud 支持团队联系。
不同 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 资源。通过 EVAL
使用复杂的 Lua 脚本可能会导致 CPU 使用率较高。
HGETALL
和 ZRANGE
还可能会返回非常多的键,从而对服务器的性能产生不利影响。
在运行耗时命令之前,您应检查该命令查询的数据结构的大小,以确保不会导致延迟。
如果实例遇到高延迟或无响应的情况,请检查您的客户端日志,看看是否运行了任何开销大的命令。如果有,请记下时间。接下来,使用 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 服务控制边界内
如果您使用的是共享 VPC 和 VPC 服务控制边界,并且 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
如果无法重新创建 Memorystore 实例,请按照强制执行账号访问权限权宜解决方法操作。