問題のトラブルシューティング

このページでは、さまざまな問題と、それらの問題のエラー メッセージ、問題を解決するためのトラブルシューティング手順について説明します。

接続に関する問題

Memorystore for Redis インスタンスで接続の問題が発生した場合は、このセクションの問題を確認して、そのうちのどれが問題の原因かを確認します。

このセクションの問題が該当しない場合は、いずれかの Redis ノードに Telnet で接続し、いくつかの Redis コマンドを実行してインスタンスが応答するかどうかを確認します。

ノードが応答しない場合は、ネットワークの問題のいずれかが、ノードのネットワーク接続がブロックされている原因になっていないか確認します。これらの問題のいずれでも問題が解決しない場合は、Cloud カスタマーケアにお問い合わせください。

異なる VPC ネットワークにリソースをプロビジョニングする。

Compute Engine VM などの Google Cloud リソースから 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 リソースに対する要求が増大する可能性があります。この問題を解決するには、1 回のオペレーションでクエリするキーセットのキーの数を減らすことをおすすめします。

EVAL で複雑な Lua スクリプトを使用すると、CPU 使用率が上昇する可能性があります。あまり複雑でない Lua スクリプトを使用することをおすすめします。

HGETALLZRANGE は多数のキーを返すことがあり、サーバーのパフォーマンスに悪影響を及ぼす可能性があります。HGETALL ではなく、HSCAN コマンドを実行することをおすすめします。また、ZRANGE を使用する前に、クエリに使用する範囲のサイズを制限することをおすすめします。

リソースを大量に消費するコマンドを実行する前に、コマンドがクエリするデータ構造のサイズを確認して、レイテンシが発生しないようにします。

インスタンスのレイテンシが高い場合や応答性が低い場合は、次の操作を行います。

  1. クライアント側のログを調べて、リソースを大量に消費するコマンドが実行されたかどうかを確認します。該当する場合は、日付と時刻をメモします。
  2. Cloud Monitoring を使用して redis.googleapis.com/stats/cpu_utilization 指標を表示します。高い CPU 使用率が、リソースを大量に消費するコマンドが実行された時間と一致するかどうかを確認します。

インスタンスの出力バッファの容量が不足している。

Memorystore for Redis インスタンスの出力バッファの容量が不足した場合は、次の操作を行います。

  • maxmemory-gb パラメータに小さい値を設定します。
  • allkeys-lru maxmemory ポリシーを使用します。

インスタンスのメモリがいっぱいになり、新しい書き込みが発生すると、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 パラメータがサポートされていないため、両方のパラメータを同時に使用することはできません。

この問題を解決するには、以下のいずれかを行います。

  • --connect-mode=direct-peering パラメータで --reserved-ip-range パラメータを使用します。
  • --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 カスタマーケアにお問い合わせください。

サービス プロジェクトをホスト プロジェクトに接続しない。

共有 VPC を使用していて、サービス プロジェクトをホスト プロジェクトに接続していない場合は、次のエラー メッセージが表示されます。

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

この問題を解決するには、サービス プロジェクトをホスト プロジェクトに接続します。

ダイレクト ピアリング接続モードでサービス プロジェクトにインスタンスを作成し、共有 VPC ネットワークを指定します。

サービス プロジェクトに Memorystore for Redis インスタンスを作成し、インスタンスにホスト プロジェクトの共有 VPC ネットワークを指定した場合、ダイレクト ピアリング接続モードは使用できません。

デフォルトでは、接続モードはダイレクト ピアリングに設定されています。インスタンスの作成時にこの接続モードを使用しようとして、--network パラメータの値としてホスト プロジェクトから共有 VPC ネットワークも選択すると、次のエラー メッセージが表示されます。

Authorized_network must exist in the same project as redis instance

この問題を解決するには、以下のいずれかを行います。

  • インスタンスを作成するときは、プライベート サービス アクセス接続モード
    --connect-mode=private-service-access)を使用します。
  • インスタンスと同じプロジェクトにある承認済みの VPC ネットワークを選択します。

Memorystore for Redis がアクセスできない Compute Engine の IP アドレス範囲を使用している。

172.17.0.0/16 範囲の IP アドレスを持つ Compute Engine VM から Memorystore for Redis インスタンスにアクセスすることはできません。この範囲は内部コンポーネント用に予約されています。

この問題を解決するには、別の範囲の IP アドレスを持つ Compute Engine VM からインスタンスにアクセスします。

他のリソースからインスタンスに接続する際の問題 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 Service Control の境界内にない

共有 VPCVPC 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 権限がない。

解決策: ユーザーに権限を付与し、インスタンスの詳細ページを更新します。

インポート オペレーションは完了したが、データが復元されない

インポート オペレーションが完了してもデータが復元されない場合は、まず Google 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. アカウントへのアクセスを強制する: このオプションは、インスタンスを再作成できない場合にのみ使用してください。