疑難排解

本頁面說明各種錯誤情況、這些情況的錯誤訊息,以及解決錯誤的疑難排解步驟。

連線錯誤情境

如果執行個體發生連線問題,請檢查本節中的情況,看看是否有其中一種情況導致問題。

如果沒有,請使用 Telnet 連線至其中一個 Redis 節點,並執行一些簡單的 Redis 指令,看看執行個體是否有回應。

在不同虛擬私有雲網路中佈建的資源導致連線錯誤

如要從 Google Cloud資源 (例如 Compute Engine VM) 連線至 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 支援團隊聯絡。

服務專案未附加至主專案

如果您使用共用虛擬私有雲,當您收到下列錯誤時,服務專案就不會連結至主專案:

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

如要解決這個問題,請將服務專案附加到主專案。

在建立執行個體時,使用不相容的直接對等互連連線模式和共用虛擬私有雲網路

您無法在服務專案中使用直接對接連線模式建立 Redis 執行個體,同時為該執行個體從主機專案指定共用虛擬私有雲網路。

如果未為 --connection-mode 設定值,則連線模式預設為 direct-peering。如果您在建立執行個體時嘗試使用直接對等互連連線模式,並從主專案中選擇共用虛擬私有雲網路做為 --network 的值,就會收到以下錯誤訊息:

Authorized_network must exist in the same project as redis instance

如要解決這個問題,請務必在 Redis 執行個體建立指令中指定 --connect-mode=PRIVATE_SERVICE_ACCESS,或是在與 Redis 執行個體相同的專案中選擇已授權的虛擬私有雲網路。

不支援的 Compute Engine IP 位址範圍

您無法從 IP 位址範圍為 172.17.0.0/16 的 Compute Engine VM 存取 Memorystore for Redis,因為該範圍是保留給內部元件使用。

從其他 Google Cloud 資源連線至 Redis 執行個體時發生錯誤

從需要無伺服器虛擬私有雲存取連接器的無伺服器環境連線至執行個體時發生的錯誤

如果您無法使用需要無伺服器虛擬私有雲存取連接器的無伺服器環境連線至 Redis 執行個體,表示您可能未為環境設定無伺服器虛擬私有雲存取連接器。

詳情請參閱「無伺服器虛擬私有雲存取連接器需求」。

使用 Google Kubernetes Engine 叢集連線至執行個體時發生錯誤

如果叢集未啟用 VPC 原生/IP 別名,就無法從 GKE 叢集連線至 Memorystore for Redis 執行個體。在建立 GKE 叢集時啟用虛擬私人雲端原生/IP 別名最為簡單。建立叢集時,請選取進階選項下方的「VPC Native」。詳情請參閱「建立虛擬私有雲端原生叢集」。

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 服務控制邊界,但 Redis 執行個體建立作業逾時,這可能表示您的服務專案和主機專案不在同一個服務範圍內。服務專案和主專案必須位於相同的邊界,才能透過共用虛擬私有雲網路與連線的用戶端通訊。

如要瞭解是否遇到這個問題,請查看 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 檔案過大,因此匯入失敗

如果您收到「Import RDB file gs://bucket/object.rdb size exceeds max memory 10GB」(匯入 RDB 檔案 gs://bucket/object.rdb 的大小超過 10 GB 的記憶體上限) 錯誤訊息,請擴充執行個體並重新嘗試匯入。您也可以嘗試將較小的 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 例項,請按照強制帳戶存取權的替代做法操作。