このページでは、さまざまなエラーのシナリオと、それらのシナリオのエラーメッセージ、エラーを解決するためのトラブルシューティング手順について説明します。
接続性エラーのシナリオ
インスタンスで接続の問題が発生している場合は、このセクションのシナリオを確認して、そのうちのどれが問題の原因かを確認します。
もし原因が確認できない場合は、いずれかの Redis ノードに Telnet で接続し、いくつかのシンプルな Redis コマンドを実行してインスタンスが応答するかどうかを確認します。
- ノードが応答しない場合は、ネットワーク エラーのシナリオのトラブルシューティングの問題のいずれかが、ノードのネットワーク接続をブロックしていないか確認します。ブロックしていない場合は、Google Cloud サポートにお問い合わせください。
異なる VPC ネットワークでプロビジョニングされたリソースによる接続エラー
Compute Engine VM などの Google Cloud リソースから Memorystore インスタンスに接続するには、承認済みの同じ VPC ネットワークに Redis インスタンスとしてリソースをプロビジョニングする必要があります。
別のリージョンまたは VPC ネットワーク内のリソースから Memorystore インスタンスに Telnet で接続しようとすると、次のエラー メッセージが表示されます。
telnet: Unable to connect to remote host: Connection timed out
削除された VPC ネットワーク ピアリングによる接続エラー
Memorystore for Redis インスタンスを作成すると、使用する VPC ネットワークと Google の内部 VPC ネットワークの間に VPC ピアリングが作成されます。
ネットワーク ピアリングは次の形式を使用します。
redis-peer-############
このネットワーク ピアリングが削除された場合に、Redis インスタンスに Telnet で接続しようとすると、次のエラーメッセージが表示されます。
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
を実行することは推奨されていませんが、KEYS
コマンドの代わりに、SCAN
を使用できます。LRANGE
を使用してキースペースの全体または大部分をクエリすると、CPU リソースに対する要求が増大する可能性があります。EVAL
で複雑な Lua スクリプトを使用すると、CPU 使用率が上昇する可能性があります。
HGETALL
と ZRANGE
は、非常に多くのキーを返す可能性があり、サーバーのパフォーマンスに悪影響を及ぼす可能性があります。
負荷の高いコマンドを実行する前に、コマンドがクエリするデータ構造のサイズを確認し、レイテンシが発生しないようにする必要があります。
インスタンスのレイテンシが高い場合や応答性が低い場合は、クライアント側のログをチェックして、負荷が大きなコマンドが実行されているかどうかを確認します。実行されている場合は、現在の時刻をメモします。次に、Cloud Monitoring を使用して redis.googleapis.com/stats/cpu_utilization
指標を表示します。高い CPU 使用率が、負荷が大きなコマンドが実行された時間と一致するかどうかを確認します。
本番環境では KEYS
コマンドは使用しないことをおすすめします。EVAL
については、あまり複雑でない Lua スクリプトを使用してください。LRANGE
については、1 回の操作でクエリされるキーセットのキーの数を減らしてください。
ネットワーク エラーのシナリオ
割り当てられた 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
この問題を解決するには、--connect-mode=direct-peering
で --reserved-ip-range
を使用するか、--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
に設定されます。インスタンスの作成中にダイレクト ピアリング接続モードを使用しようとして、--network
の値としてホスト プロジェクトから共有 VPC ネットワークも選択すると、次のエラーが発生します。
Authorized_network must exist in the same project as redis instance
この問題を解決するには、Redis インスタンス作成コマンドで --connect-mode=PRIVATE_SERVICE_ACCESS
を指定するか、Redis インスタンスと同じプロジェクトで承認済みの VPC ネットワークを選択します。
Compute Engine の IP アドレス範囲がサポートされていない
172.17.0.0/16
の範囲内の IP アドレスを持つ Compute Engine VM からは Memorystore for Redis にアクセスできません。これは、この範囲のアドレスは内部コンポーネント用に予約されているためです。
他の Google Cloud リソースから Redis インスタンスに接続する際のエラー
サーバーレス VPC アクセス コネクタを必要とするサーバーレス環境からインスタンスに接続する際のエラー
サーバーレス VPC アクセス コネクタを必要とするサーバーレス環境のいずれかを使用して Redis インスタンスに接続できない場合は、ご使用の環境でサーバーレス 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 Service Control の境界内にない
共有 VPC と VPC service control の境界を使用していて、Redis インスタンスの作成オペレーションがタイムアウトした場合は、サービス プロジェクトとホスト プロジェクトが同じサービス境界にないことを示している可能性があります。Redis インスタンスが共有 VPC ネットワークを介して接続クライアントと通信するには、サービス プロジェクトとホスト プロジェクトが同じ境界内にある必要があります。
問題が発生しているかどうかを確認するには、次のエラーの Redis インスタンスの監査ログを確認してください。
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
この問題を解決するには、ホスト ネットワークとサービス ネットワークを同じサービス境界に配置します。
インポートとエクスポートに関する問題のトラブルシューティング
このセクションでは、Memorystore for Redis のインポートとエクスポートを使用するときに発生する可能性がある、一般的な問題について説明します。
Google Cloud コンソールで [インポート] ボタンと [エクスポート] ボタンが無効になっている
問題: コンソールにログインしているユーザーに、RDB ファイルのインポートやエクスポートに必要な redis.instances.import
権限や redis.instances.export
権限がない。
解決策: ユーザーに権限を付与し、インスタンスの詳細ページを更新します。
インポート オペレーションは完了したが、データが復元されない
インポート オペレーションが完了してもデータが復元されない場合は、まず CGoogle Cloud コンソールまたはコマンドラインでエラーメッセージを確認し、エラー メッセージに記載されている問題を解決します。
インポート プロセス中にエラーが発生した場合、インスタンスは空の RDB ファイルを使用して復元されます。同じ RDB ファイルを再度インポートするか、別の RDB ファイルを使用してデータを復元を試すことができます。
RDB ファイルが大きすぎるため、インポートできない
「Import RDB file gs://bucket/object.rdb size exceeds max memory 10GB」というエラー メッセージが表示された場合は、インスタンスをスケールアップして、インポートを再試行する必要があります。サイズの小さい RDB ファイルをインスタンスにインポートすることも試行できます。
Google Cloud CLI に関する問題のトラブルシューティング
gcloud CLI コマンドが使用できない問題が発生した場合や、コマンドの動作がドキュメントと異なる場合は、gcloud CLI を更新してください。
gcloud components update
Redis インスタンスに対して進行中のコマンドと接続をすべて停止する
Memorystore for Redis は Google が管理するプロダクトであるため、安全で信頼性の高い環境を確保するために、コマンドには Redis インスタンスでブロックされるものもあります。制限されるコマンドの 1 つは、コマンドの停止に使用される CLIENT KILL
を含む CLIENT
です。
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 は 2 つの異なるサービス アカウント形式のいずれかを使用します。インスタンスで使用されているサービス アカウントの形式を確認するには、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.
というエラーが発生することがあります。
この問題を解決するには、次の 2 つの方法があります。
オプション 1
新しいインスタンスを作成できます。新しく作成されたインスタンスでは、組織のポリシーと互換性のある適切なサービス アカウント形式が使用されます。キャッシュの内容を保持する必要がある場合は、既存のデータをバックアップするためにエクスポートして、新しいインスタンスにインポートできます。新しく作成したインスタンスには、アプリケーションで構成する必要がある新しいサービス IP アドレスがあるので注意してください。
オプション 2
Memorystore インスタンスを再作成できない場合は、アカウントへのアクセスを強制する回避策をご覧ください。