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

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

接続に関する問題

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 アドレス範囲をブロックするネットワーク ファイアウォール ルールを作成しないでください。

応答しない接続がある

Memorystore for Redis への応答しない接続を検出するようにクライアント アプリケーションを構成することを強くおすすめします。応答しない接続が検出されたら、クライアントは接続をリセットする必要があります。復元力のあるアプリケーションを構築するには、次のクライアント構成をおすすめします。

  • TCP keep-alive パラメータを構成する: 接続が アイドル状態の場合でも、クライアントが応答しない接続をプロアクティブに 検出して削除するように、TCP keepalive time, TCP keepalive interval、および TCP keepalive probes パラメータを設定します。たとえば、TCP keepalive time パラメータを 30 秒、TCP keepalive interval を 10 秒、TCP keepalive probes を 3 に設定すると、クライアントは 1 分以内に応答しないアイドル接続をリセットします。
  • TCP ユーザー タイムアウトを構成する: 未処理のリクエストがあり、応答を停止した 接続をリセットするように、クライアントでこのタイムアウトを設定します。たとえば、タイムアウトを 15 秒に設定すると、クライアントは 15 秒後に未処理のリクエストがある応答しない接続をリセットします。

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 パラメータの値を小さくすると、オーバーヘッド用のスペースが増えます。

インスタンスの外部指標がない

インスタンスの CPU 使用率が高い場合や、インスタンスのリソースが枯渇している場合(接続数が多すぎるなど)、インスタンスが誤動作し、外部指標が欠落する可能性があります。

インスタンスのレイテンシの原因を特定する

発生しているレイテンシがインスタンスに起因するものか、クライアント アプリケーションとネットワーク環境に起因するものかを判断するには、redis-cli ツールを使用して継続的なレイテンシ テストを実行します。

インスタンスのレイテンシの原因を特定するには、次の操作を行います。

  1. インスタンスと同じリージョンと VPC ネットワークにある Compute Engine VM に接続します。

  2. redis-cli ツールがまだインストールされていない場合は、VM にインストールします。

    • Debian または Ubuntu ベースの VM の場合は、次のコマンドを実行します。

      sudo apt-get install redis-tools
      
    • RHEL または CentOS ベースの VM の場合は、次のコマンドを実行します。

      sudo yum install redis
      
  3. インスタンスのレイテンシをミリ秒単位で測定するには、次のコマンドを実行します。

    redis-cli --latency -h IP_ADDRESS -p PORT
    

    インスタンスで Redis AUTH または転送中の暗号化が有効になっている場合は、必要な認証(-a)または TLS(--tls)フラグを追加してください。

    次のように置き換えます。

    • IP_ADDRESS: インスタンスの IP アドレス。
    • PORT:インスタンス用に予約されたポート番号。 通常、このポート番号は 6379 です。
  4. コマンドを数分間実行します。このツールは、サーバーに継続的に ping を送信し、最小、最大、平均のレイテンシ値を計算します。

  5. 結果を表示できるようにコマンドの実行を停止するには、Ctrl+C を押します。

コマンドの出力が常に低い平均レイテンシ(通常は 1 ミリ秒以下)の場合、インスタンスは正常で、迅速に応答しています。

コマンドで通常のサーバー パフォーマンスが示されているのに、クライアント アプリケーションで遅延が発生する場合は、次の問題がレイテンシの原因となっている可能性があります。

  • ネットワーク: クライアントとインスタンス間で異なるリージョンまたはゾーンを通過するトラフィックは、ネットワークの遅延が大きくなる可能性があります。
  • クライアント: クライアントの CPU またはメモリ使用率が高い、接続 プールの枯渇、アプリケーション ロジックのボトルネックにより、クライアントで発生するラウンドトリップ時間 が長くなる可能性があります。

ネットワークに関する問題

このセクションでは、インスタンスで発生する可能性のあるネットワークの問題について説明します。

割り当てられた 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 パラメータをサポートしていないため、両方のパラメータを同時に使用することはできません。

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

  • --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 カスタマーケアにお問い合わせください。

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

共有 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

インスタンスを別のサイズにスケーリングした後、スケーリング オペレーションをもう一度実行して元のサイズに戻すことができます。

ドメイン制限付き共有に関する組織のポリシーの問題

`PROJECT_NUMBER-compute@` サービス アカウントの形式を使用する Memorystore for Redis インスタンスで iam.allowedPolicyMemberDomains 組織 ポリシーを使用すると、エラーが発生するという既知の問題があります。PROJECT_NUMBER-compute@developer.gserviceaccount.com

インスタンスが作成されたタイミングに応じて、Memorystore for Redis は 2 つの異なるサービス アカウント形式のいずれかを使用します。インスタンスのサービス アカウント形式を確認するには、Memorystore for Redis サービス アカウント形式をご覧ください。

この問題が発生すると、One or more users named in the policy do not belong to a permitted customer. というエラー メッセージが表示されることがあります。

組織のポリシーとインスタンスを再作成できるかどうかに応じて、次のいずれかの方法でこのエラーを解決できます。

  1. インスタンスを再作成する: 古いインスタンスでは PROJECT_NUMBER-compute@developer.gserviceaccount.com サービス アカウントの形式が使用されます。この形式は、ドメイン制限付き共有ポリシーでブロックされることがよくあります。 新しく作成されたインスタンスでは、ほとんどの組織のポリシーと互換性のある最新のサービス アカウント形式が使用されます。

    組織のポリシーで外部ドメインがすべてブロックされている場合、このオプションは機能しません。ポリシーをバイパスするには、2 番目のオプションを使用する必要があります。

  2. アカウント アクセスを強制する: 新しい サービス アカウント形式を取得するためにインスタンスを再作成できない場合、または組織のポリシーで新しいサービス アカウント ドメインがブロックされている場合は、プロジェクトのアカウント アクセスを強制してポリシーをバイパスする必要があります。詳細については、アカウント アクセスの強制をご覧ください。