ElastiCache Redis クライアントでのエラーメッセージをトラブルシューティングする方法を教えてください。
Redis クライアントを使用して Amazon ElastiCache Redis クラスターに接続すると、エラーメッセージが表示されます。
解決策
"Connection reset by peer" エラー
Redis サーバーが接続を終了させると、次のエラーメッセージが表示されます。
"java.io.IOException: Connection reset by peer
io.netty.channel.unix.Errors$NativeIoException: readAddress(..) failed: Connection reset by peer"
このエラーは、サーバーまたはクライアントから発生する可能性があります。
サーバーがこのエラーを返す場合は、次の手順を実行して問題を解決します。
- 基盤ハードウェアまたはネットワークの問題を確認してください。
- CLIENT LIST コマンドを実行し、クライアント出力バッファのクォータを確認します。詳細については、Redis の ウェブサイトで「CLIENT LIST」を参照してください。クラスターのパラメータグループのパラメータでは、ElastiCache におけるクライアント出力バッファのクォータを定義します。
- ElastiCache のパラメータグループで設定したタイムアウト値がクォータに達したかどうかを確認します。
クライアントがこのエラーを返す場合は、次の手順を実行して問題を解決します。
- アプリケーションのタイムアウト設定が低すぎないかどうかを確認します。
- 接続のリセットに関連する既知のバグについては、Redis クライアントライブラリの公式ドキュメントまたはサポートページを確認してください。
- Redis クライアントの最新バージョンを使用していることを確認します。
- クラスターで TLS を有効にした場合は、クライアントで暗号化が設定されていることを確認します。
"Connection refused" または "Unable to connect to Redis" エラー
サーバーが接続を拒否すると、次のエラーメッセージが表示されます。
"JedisConnectionException: java.net.ConnectException: Connection refused
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException:
Connection refused
ECONNREFUSED
org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis org.redisson.client.RedisConnectionException: Unable to connect to Redis server ###"
この問題を解決するには、次のことを確認します。
- Redis エンドポイントに到達できる。telnet や redis-cli などのツールを使用します。
- セキュリティグループのルールでは、ポート 6379 でトラフィックを許可している。
- いずれのファイアウォールも接続をブロックしていない。
- メモリ、CPU、ネットワーク、接続リソースの制約が存在しない。
注: tcpdump などのツールを使用すると接続試行を分析できます。
"Connection timed out" エラー
接続がタイムアウトすると、次のエラーメッセージが表示されます。
"redis.exceptions.TimeoutError: Timeout connecting to server io.netty.channel.ConnectTimeoutException: connection timed out org.redisson.client.RedisTimeoutException: Unable to acquire connection!"
Connection timed out エラーは、持続的に発生する場合も断続的に発生する場合もあります。
タイムアウトエラーが持続的である場合は、次の手順を実行して問題を解決します。
- ネットワーク接続と設定を検証し、ElastiCache Redis クラスターへの接続を確認します。
- 正しい Redis エンドポイントを指定したことを確認します。
持続的なタイムアウトエラーのトラブルシューティングについては、「持続的な接続の問題」を参照してください。
タイムアウトエラーが断続的である場合は、次の手順を実行して問題を解決します。
- ElastiCache コンソールを使用してノードのリカバリまたはフェイルオーバーイベントが発生していないかを確認します。
- メモリ、CPU、ネットワーク、接続リソースの制約がないかを確認します。
- 問題の発生時に遅延が大きかったかどうかを確認します。
- クライアントアプリケーションのタイムアウト設定を確認します。
"Read timed out" エラー
設定したタイムアウト値以内にコマンドが完了しない場合、次のエラーメッセージが表示されます。
"StackExchange.Redis.RedisTimeoutException: Timeout performing GET (5000ms) io.lettuce.core.RedisCommandTimeoutException: Command timed out org.springframework.data.redis.RedisConnectionFailureException: java.net.SocketTimeoutException: Read timed out redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out"
このエラーは、Redis スレッドが複雑なコマンドや実行時間の長いコマンドを処理している場合に発生します。
このエラーを解決するには、次の操作を行います。
- メモリ、CPU、ネットワーク、接続リソースの制約がないかを確認します。
- クライアント側でリソースのスロットリングが発生していないことを確認します。
- 問題の発生時に遅延が大きかったかどうかを確認します。
- Redis は一度に 1 つのクエリを処理するシングルスレッドエンジンであるため、実行時間が長いコマンドにより Redis エンジンがブロックされていないかを確認します。手順については、Redis のウェブサイトで「SLOWLOG GET」を参照してください。
- 単位時間あたりのコマンド数が多すぎないかどうかを確認します。手順については、Redis のウェブサイトで「INFO」を参照してください。
"Operation timed out" エラー
接続のアイドル状態が設定したタイムアウト値よりも長い場合、次のエラーメッセージが表示されます。
"io.lettuce.core.RedisException: java.io.IOException: Operation timed out"
次の要因で Operation timed out エラーが発生する場合があります。
- ElastiCache クラスターの負荷が高く、コマンドを時間内に処理できない。
- ネットワークトラフィックが、クラスターまたはクライアント側の帯域幅クォータを超過した。
このエラーを解決するには、次の操作を行います。
- メモリ、CPU、ネットワーク、接続リソースの制約がないかを確認します。
- クライアント側でリソースのスロットリングが発生していないことを確認します。
- 長時間実行されるコマンドにより、Redis エンジンがブロックされていないかを確認します。手順については、Redis のウェブサイトで「SLOWLOG GET」を参照してください。
- クライアントアプリケーションとクラスターのタイムアウト設定を確認し、アイドル状態での切断を防ぐために適切なタイムアウトパラメータを設定します。
"NOAUTH Authentication required" エラー
有効な認証情報を指定せずに、認証が必要な Redis サーバーに接続すると、NOAUTH Authentication required というエラーメッセージが表示されます。
このエラーを解決するには、次の操作を行います。
- クラスターに接続するための正しいユーザー名とパスワードを指定します。
- クライアントライブラリの設定と接続文字列の構文が正しいことを確認します。
"ERR max number of clients reached" エラー
クラスタノードが最大接続クォータに達すると、ERR max number of clients reached というエラーメッセージが表示されます。
このエラーを解決するには、次の操作を行います。
- CurrConnections メトリクスが maxclients クォータ以内であることを確認します。詳細については、Redis のウェブサイトで「最大同時接続クライアント数」を参照してください。
- 接続プールを使用して接続を再利用します。
- クライアント構成で適切なタイムアウト値を設定します。
- クライアントがリードレプリカに直接接続するように設定し、読み取り操作で複数のクラスターノードにわたり負荷を分散させます。
"LOADING Redis is loading the dataset in memory" エラー
起動中またはレプリカの同期中、データセットをメモリに読み込んでいるノードに接続すると、次のエラーメッセージが表示されます。
"LOADING Redis is loading the dataset in memory (error) LOADING Redis is loading the dataset in memory"
バックオフの実装をおすすめします。詳細については、「Redis クラスターのクライアント検出とエクスポネンシャルバックオフ」セクションを参照してください (ベストプラクティス: Redis クライアントおよび Amazon ElastiCache for Redis)。
"OOM command not allowed when used memory > 'maxmemory'"エラー
maxmemory パラメータでは、Redis ノードがデータストレージに使用できる最大メモリ量を設定します。
メモリ使用量が maxmemory のクォータを超えると、Redis はパラメータグループで設定した maxmemory-policy を適用します。maxmemory-policy に基づき、Redis はキーを削除するか、OOM command not allowed エラーを返します。
このエラーを解決するには、次の操作を行います。
- maxmemory-policy を設定し、アプリケーションの要件に応じてキーを除外するようにします。
- メモリ使用量が常にクォータを超えている場合は、クラスターを大容量のノードタイプにアップグレードしてください。
"CROSSSLOT Keys in request don't hash to the same slot" エラー
クラスターモードが有効であり、複数のハッシュスロットを持つクラスターでマルチキー操作を実行すると、CROSSSLOT エラーが発生します。
この問題を解決する方法については、「ElastiCache (Redis OSS) の独自設計クラスターでマルチキー操作を使用すると、CROSSSLOT エラーが発生する場合の解決方法を教えてください」を参照してください。
"CLUSTERDOWN The cluster is down" エラー
ノードが応答を停止すると、クラスターが使用できなくなり、The cluster is down というエラーメッセージが表示されます。
このエラーを解決するには、次の操作を行います。
- ElastiCache コンソールを使用してノードのリカバリまたはフェイルオーバーイベントが発生していないかを確認します。
- メモリ、CPU、ネットワーク、接続リソースの制約がないかを確認します。
- 実行が遅いコマンドが問題の原因であるかどうかを確認する手順については、Redis のウェブサイトで「SLOWLOG GET」を参照してください。
"READONLY You can't write against a read-only replica" エラー
リードレプリカとして設定した Redis ノードに書き込もうとした際、エラーが発生する理由を次に示します。
- アプリケーションがリードレプリカに直接接続している。
- アプリケーションの DNS キャッシュは、トラフィックを古いプライマリノードにルーティングしている。
問題の解決方法については、「独自に設計した ElastiCache for Redis クラスターでフェイルオーバー後に READONLY エラーが発生する場合のトラブルシューティング方法を教えてください」を参照してください。
"MOVED [slot] [IP address] [port]" エラー
MOVED というリダイレクトメッセージには、リクエストしたキーに関するハッシュスロット、IP アドレス、ポートが記載されています。
"-MOVED 3999 127.0.0.1:6381"
MOVED エラーは、次の要因で発生します。
- クライアントは、接続されたノードにないハッシュスロットのキーにアクセスを試みた。
- クラスターでクラスターモードが有効であるものの、クライアントはクラスターに対応していない。
- リードレプリカに readonly フラグを設定していない。
- クライアントには、シャードやノード数の変化など、古いクラスター情報が含まれている。
この問題を解決するには、次の操作を行います。
- クラスターモードを有効化した場合は、クライアントがクラスター対応であることを確認します。
- readonly コマンドを実行し、レプリカノードがリクエストを読み取っていることを確認します。詳細については、「ElastiCache for Redis において、Redis クライアントの読み取りリクエストがレプリカノードではなく、シャードのプライマリノードにリダイレクトされる場合の解決方法を教えてください」を参照してください。
- クライアントがクラスターのトポロジを頻繁にクエリするように設定します。
注: クラスターのシャードに関する詳細を確認するには、CLUSTER SHARDS コマンドを実行します。クラスターノードの詳細を取得するには、CLUSTER NODES コマンドを実行します。詳細については、Redis のウェブサイトで「CLUSTER SHARDS」および「CLUSTER NODES」を参照してください。
