本頁說明各種問題、這些問題的錯誤訊息,以及解決問題的疑難排解步驟。
連線問題
如果 Memorystore for Redis 執行個體發生連線問題,請檢查本節中的問題,看看是否為問題原因。
如果這個章節的問題與您的問題不符,請 Telnet 至其中一個 Redis 節點,並執行一些 Redis 指令,查看執行個體是否會回應。
如果節點沒有回應,請檢查是否有網路問題導致節點的網路連線遭到封鎖。如果上述問題都無法解決問題,請與 Cloud Customer Care 聯絡。
在不同的虛擬私有雲網路中佈建資源。
如要從 Compute Engine VM 等 Google Cloud 資源連線至 Memorystore for Redis 執行個體,您必須在與執行個體相同的授權 VPC 網路中佈建資源。
如果嘗試從不同區域或虛擬私有雲網路的資源,對執行個體執行 Telnet,會收到下列錯誤訊息:
telnet: Unable to connect to remote host: Connection timed out
刪除 VPC 網路對等互連。
建立 Redis 專用 Memorystore 執行個體時,您會在虛擬私有雲網路和 Google 內部虛擬私有雲網路之間建立虛擬私有雲對等互連。
網路對等互連採用下列格式:
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 指令碼。
HGETALL 和 ZRANGE 可能會傳回大量鍵,對伺服器效能造成負面影響。建議您執行 HSCAN 指令,而非 HGETALL。此外,建議您在使用 ZRANGE 前,先限制查詢範圍的大小。
執行耗用大量資源的指令前,請先檢查指令查詢的資料結構大小,確保不會造成延遲。
如果執行個體發生高延遲或無回應的情況,請執行下列操作:
- 檢查用戶端記錄檔,確認是否有任何耗用大量資源的指令正在執行。 如果可以,請記下日期和時間。
- 使用 Cloud Monitoring 查看
redis.googleapis.com/stats/cpu_utilization指標。查看 CPU 使用率偏高的時間段,是否與執行耗用大量資源的指令時間段一致。
執行個體的輸出緩衝區空間不足。
如果 Memorystore for Redis 執行個體的輸出緩衝區空間不足,請採取下列措施:
- 為
maxmemory-gb參數設定較小的值。 - 使用
allkeys-lrumaxmemory政策。
當執行個體的記憶體已滿,但有新的寫入作業要執行時,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 network peering」(虛擬私有雲網路對等互連) 頁面。
如果刪除網路對等互連,現有執行個體會顯示下列錯誤訊息:
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>.
如要解決這個問題,請將服務專案附加到主專案。
您可以在服務專案中建立執行個體,並使用直接對等互連連線模式,然後指定共用虛擬私有雲網路。
如果您在服務專案中建立 Memorystore for Redis 執行個體,並為該執行個體指定主專案的共用虛擬私有雲網路,則無法使用直接對等互連連線模式。
根據預設,連線模式會設為直接對等互連。如果您在建立執行個體時嘗試使用這個連線模式,並從主專案中選擇共用虛擬私有雲網路做為 --network 參數的值,則會收到下列錯誤訊息:
Authorized_network must exist in the same project as redis instance
如要解決這個問題,請按照下列其中一種做法進行:
- 建立執行個體時,請使用私人服務存取連線模式
(--connect-mode=private-service-access)。 - 選擇與執行個體位於相同專案的授權虛擬私有雲網路。
您使用的 Compute Engine IP 位址範圍,Memorystore for Redis 無法存取。
您無法從 IP 位址位於 172.17.0.0/16 範圍的 Compute Engine VM 存取 Memorystore for Redis 執行個體。這個範圍是保留給內部元件使用。
如要解決這個問題,請從 IP 位址位於不同範圍的 Compute Engine VM 存取執行個體。
從其他 Google Cloud 資源連線至執行個體時發生問題
本節說明其他資源嘗試連線至 Memorystore for Redis 執行個體時,該執行個體可能遇到的問題。
您無法從需要 Serverless VPC Access 連接器的無伺服器環境連線至執行個體
如果您無法透過需要無伺服器虛擬私有雲存取連接器的無伺服器環境連線至 Memorystore for Redis 執行個體,請確認您是否為環境設定了這個連接器。詳情請參閱「無伺服器虛擬私有雲存取連接器需求條件」。
無法從 Google Kubernetes Engine (GKE) 叢集連線至執行個體
如要從 GKE 叢集連線至 Memorystore for Redis 執行個體,您必須在叢集上啟用 VPC 原生/IP 別名。
建立叢集時,啟用虛擬私有雲原生/IP 別名最簡單。在進階選項區段中,選取「虛擬私有雲原生叢集」。詳情請參閱「建立 VPC 原生叢集」。
身分與存取權管理 (IAM) 問題
本節說明 Memorystore for Redis 執行個體可能遇到的 IAM 問題。
您想還原已刪除的服務帳戶政策繫結
Memorystore for Redis 會使用下列服務帳戶管理執行個體:
service-PROJECT_NUMBER@service-networking.iam.gserviceaccount.comservice-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 支援團隊聯絡。
服務專案和主專案不在同一個虛擬私有雲服務控制範圍內
如果您使用 Shared VPC 和 VPC 服務控制項 perimeter,且 Redis 執行個體建立作業逾時,這可能表示您的服務專案和主專案不在同一個服務 perimeter。服務專案和主專案必須位於相同安全防護範圍內,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 檔案過大,因此無法匯入
如果收到「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 服務帳戶格式」。
已知問題:使用 [PROJECT_NUMBER]-compute@developer.gserviceaccount.com 服務帳戶格式的 Memorystore for Redis 執行個體時,iam.allowedPolicyMemberDomains 機構政策會導致錯誤。
在這些問題中,您可能會遇到這項錯誤:
One or more users named in the policy do not belong to a permitted customer.
解決這個問題的方法有兩種。
- 建立執行個體:新建立的執行個體會採用適當的服務帳戶格式,與機構政策相容。如果必須保留快取內容,可以匯出資料來備份現有資料,然後匯入新執行個體。新建立的執行個體會有新的服務 IP 位址,您需要在應用程式中設定該位址。
- 強制存取帳戶:只有在無法重新建立執行個體時,才使用這個選項。