Tair (Redis 互換) の一般的なエラーとその解決策を一覧で示します。
エラーの概要
|
カテゴリ |
エラー項目 |
|
一般的な Redis の例外 |
|
|
redis-cli |
|
|
一般的なプロキシモードの例外 |
|
|
Lua スクリプトとトランザクション |
|
|
Jedis クライアント |
|
|
Lettuce クライアント |
|
|
Redisson クライアント |
|
|
Spring Data Redis クライアント |
|
|
StackExchange.Redis クライアント |
|
|
Predis クライアント |
|
|
phpredis クライアント |
|
|
Go-redis クライアント |
|
|
node-redis クライアント |
一般的な Redis の例外
ERR illegal address
考えられる原因:ご利用のクライアントの IP アドレスが Tair インスタンスのホワイトリストに追加されていません。
解決策:ご利用のクライアントの IP アドレスを Tair インスタンスのホワイトリストに追加します。詳細については、「接続診断の実行」をご参照ください。
ERR Sentinel compatibility mode is disabled
考えられる原因:Tair インスタンスで Sentinel 互換モードが有効になっていません。
解決策:コンソールでインスタンスの Sentinel 互換モードを有効にします。詳細については、「Sentinel 互換モードの有効化」をご参照ください。
ERR max number of clients reached
考えられる原因:Tair インスタンスへの接続数が上限に達しました。
解決策:
クライアントで接続リークが発生していないか確認します。たとえば、Jedis クライアントで JedisPool を使用した後に
close関数が呼び出されているか確認します。現在の接続セッションが正常に実行されているか確認します。詳細については、「インスタンスセッションの管理」をご参照ください。セッションを終了するか、「インスタンス構成のアップグレード」でインスタンスへの最大接続数を増やすことができます。
NOAUTH
考えられる原因:Tair インスタンスにパスワードベースの認証が設定されていますが、クライアントがパスワードを提供していないか、誤ったパスワードを提供しています。
解決策:正しいユーザー名とパスワードを使用してください。インスタンスへのログイン方法。
Lettuce クライアントのバージョン 6.4.0.RELEASE から 6.4.1.RELEASE を使用している場合、正しいパスワードを提供してもこのエラーが発生することがあります。この問題は、Lettuce が CLIENT SETINFO のサポートを追加した際に発生し、バージョン 6.4.2.RELEASE で修正されました。redis/lettuce#3035。
この問題が発生した場合は、「手動でプロトコルを RESP2 に切り替える」か、クライアントを Lettuce 6.4.2.RELEASE 以降にアップグレードしてください。Spring Data Redis クライアントを使用している場合は、Spring Data Redis 3.4.2 以降にアップグレードしてください。
WRONGPASS invalid username-password pair
考えられる原因:パスワードが無効です。
解決策:正しいアカウントのユーザー名とパスワードを使用してインスタンスに接続します。詳細については、「インスタンスへの接続」をご参照ください。
インスタンスで Sentinel 互換モードが有効になっている場合は、「Sentinel 互換モードを使用したインスタンスへの接続」のトピックをご参照ください。
ERR invalid password
考えられる原因:パスワードが無効です。
解決策:正しいアカウントのユーザー名とパスワードを使用してインスタンスに接続します。詳細については、「インスタンスへの接続」をご参照ください。
このエラーが Data Management (DMS) で報告された場合、考えられる原因は、DMS が前回のログイン時に保存したパスワードがインスタンスの現在のパスワードと一致しないことです。DMS の [インスタンスリスト] で対象のインスタンスを見つけ、[操作] 列で [詳細] > [編集] を選択します。次に、[データベースパスワード] フィールドに新しいパスワードを入力して、再度お試しください。
Connection reset by peer
考えられる原因:クライアントバッファーの例外により接続が閉じられました。
解決策:アプリケーションコードを確認するか、クライアントのバッファーサイズを調整してください。「Unexpected end of stream」のセクションをご参照ください。
UnknownHostException
または、failed to connect: xxx.redis.rds.aliyuncs.com could not be resolved というエラーが発生します。
考えられる原因:クライアントが Tair インスタンスのドメイン名を解決できません。
解決策:DNS サーバーを正しく設定してください。詳細については、「DNS 名前解決の失敗による接続問題のトラブルシューティング方法」をご参照ください。
OOM: Used memory > 'maxmemory'
考えられる原因:Tair インスタンスに設定された最大メモリに達しました。
Tair インスタンスがクラスターアーキテクチャを使用している場合、データシャードのメモリ使用量が、そのデータシャードに設定された最大メモリを超えることがあります。
解決策:
インスタンスのメモリ使用量が 100% に達した場合は、インスタンスの構成をアップグレードすることを推奨します。詳細については、「インスタンスの構成変更」をご参照ください。
単一のデータシャードのメモリ使用量が 100% に達した場合、インスタンス内に large key が存在する可能性があります。オフラインキー分析またはインスタンス診断機能を使用して原因を特定できます。
WRONGTYPE: Wrong data type
考えられる原因:コマンドがキーのデータ型と一致しません。たとえば、String 型のキーに対して HASH コマンドを実行した場合などです。
解決策:誤ったコードまたはコマンドを修正してください。Redis Commands。
ERR unknown command 'xxx'
考えられる原因:インスタンスがこのコマンドをサポートしていません。
`ERR unknown command 'WAIT'` エラーは、クラスターアーキテクチャのプロキシモードでは `WAIT` コマンドがサポートされていないことを示します。直接接続モードを使用してください。
解決策:ご利用のインスタンスのバージョンでコマンドがサポートされているか確認してください。「Tair (Enterprise Edition) のコマンドサポートと制限事項」、「Redis オープンソース版のコマンドサポートと制限事項」、および「クラスターアーキテクチャまたは読み書き分離を使用するインスタンスのコマンド制限」をご参照ください。
新機能の利用と安定性の向上のため、最新のマイナーバージョンにアップグレードしてください。「マイナーバージョンとプロキシバージョンのアップグレード」をご参照ください。
Command 'xxx' not supported
考えられる原因:Tair の特定のコマンドが Alibaba Cloud で無効にされているか、これらのコマンドが #no_loose_disabled-commands によって指定されています。詳細については、「Redis オープンソース版がサポートするコマンド」および「高リスクコマンドの無効化」をご参照ください。
解決策:実行したいコマンドを #no_loose_disabled-commands で指定された無効化コマンドから削除します。
NOPERM this user has no permissions to run the 'xxx'
考えられる原因:Tair の特定のコマンドが Alibaba Cloud で無効にされているか、これらのコマンドが #no_loose_disabled-commands によって指定されています。詳細については、「Redis オープンソース版がサポートするコマンド」および「高リスクコマンドの無効化」をご参照ください。
解決策:実行したいコマンドを #no_loose_disabled-commands で指定された無効化コマンドから削除します。
ERR FLUSHDB is not allowed in migrating mode
考えられる原因:Tair クラウドネイティブクラスターインスタンスのデータシャード数が変更中の場合、FLUSHDB および FLUSHALL コマンドは無効になります。
解決策:Tair クラウドネイティブクラスターインスタンスの変更が完了するまで待ちます。詳細については、「インスタンスのシャード数の調整」をご参照ください。
CROSSSLOT: Keys not in the same slot
考えられる原因:DEL、MSET、MGET など、複数のスロットにまたがる複数のキーを含むコマンドは、直接接続モードの Tair クラスターインスタンスではサポートされていません。
解決策:
複数のキーを含むコマンドを実行する前に、CLUSTER KEYSLOT コマンドを使用して、すべてのキーが同じスロットに存在することを確認します。
キー名を変更し、ハッシュタグを実装して、関連するキーが同じスロットに割り当てられるようにします。ただし、ハッシュタグを使用する際は、データスキューを防ぐことが重要です。
インスタンスを、DEL、MGET、MSET などの複数のスロットにまたがる複数のキーを含むコマンドをサポートするプロキシモードのクラスターインスタンスに変更します。詳細については、「プロキシノードの機能」をご参照ください。
読み取り専用インスタンスのエラー
考えられる原因:ご利用の Tair インスタンスのマスター/レプリカスイッチオーバー、構成変更、またはマイナーバージョンアップ中に、一時的な切断が発生し、インスタンスは最大 30 秒間読み取り専用のままになります。
解決策:インスタンスが回復するまで待ちます。手動操作は不要です。ご利用のアプリケーションに再接続および例外処理のメカニズムを設計してください。詳細については、「インスタンスの構成変更」をご参照ください。
Failed to connect to any host resolved for DNS name
考えられる原因:ホワイトリストの設定が正しくありません。
解決策:クライアントの IP アドレスをホワイトリストに追加します。「IP ホワイトリストの設定」をご参照ください。
パブリックネットワーク経由で接続する場合は、ご利用のエグレス IP アドレスをホワイトリストに追加してください。エグレス IP は https://cip.cc/ で確認できます。
redis-cli の例外
Connection reset by peer
考えられる原因:標準アーキテクチャのインスタンスで TLS/SSL が有効になっていますが、証明書なしで接続しました。
解決策:
-
証明書を使用して接続します。「TLS/SSL 暗号化接続を介してインスタンスに接続する」をご参照ください。
-
TLS/SSL 暗号化を使用する必要がない場合は、「TLS 暗号化を無効にする」を参照して再度お試しください。
ERR must use ssl connection in ssl port
考えられる原因:クラスターアーキテクチャのインスタンスで TLS/SSL が有効になっていますが、証明書なしで接続しました。
解決策:
-
証明書を使用して接続します。「TLS/SSL 暗号化接続を介してインスタンスに接続する」をご参照ください。
-
TLS/SSL 暗号化を使用する必要がない場合は、「TLS 暗号化を無効にする」を参照して再度お試しください。
一般的なプロキシの例外
ERR client IP is not in whitelist
考えられる原因:ご利用のクライアントの IP アドレスが Tair インスタンスのホワイトリストに追加されていません。
解決策:ご利用のクライアントの IP アドレスを Tair インスタンスのホワイトリストに追加します。詳細については、「接続診断の実行」をご参照ください。
NOWRITE: Cannot write to a read-only instance
または、NOREAD You can't read against a non-read redis というエラーが発生します。
考えられる原因:ご利用のインスタンスに支払い遅延があるか、期限切れになっています。インスタンスは ロック済 状態です。
解決策:アカウントにチャージするか、インスタンスを更新します。詳細については、「有効期限と支払い遅延」をご参照ください。
ERR syntax error
考えられる原因:コマンドの構文が正しくありません。たとえば、4 つのパラメーターが必要な場合に 3 つしか渡していないなどです。
解決策:コマンドの構文を確認してください。Redis Commands。
ERR no such db node
考えられる原因:Tair の内部コマンドを実行する際に、指定された db node パラメーターが無効です。
解決策:db node パラメーターを正しく指定します。db node の値は、インスタンスのデータシャード数より小さくする必要があります。詳細については、「プロキシモードのインスタンスの内部コマンド」をご参照ください。
ERR 'xxx' command keys must in same slot
考えられる原因:トランザクションまたはスクリプトが、Tair クラスターインスタンスの異なるスロットにあるキーにアクセスしています。
解決策:トランザクションまたはスクリプトを修正します。CLUSTER KEYSLOT コマンドを使用して、リクエストされたキーが格納されているスロットをクエリできます。
Tair クラスターインスタンスは、巡回冗長検査 (CRC) アルゴリズムを使用して、キーを異なるスロットに均等に分散します。キーを同じスロットに格納したい場合は、ハッシュタグを使用できます。ただし、これによりデータスキューが発生する可能性があるため、注意して進めてください。
EVAL/EVALSHA: Key count must be positive
考えられる原因: キーが指定されていないか、numkeys パラメーターが 0 以下の値に設定されているのは、EVAL および EVALSHA コマンドの場合です。
解決策:EVAL および EVALSHA コマンドを使用する際は、少なくとも 1 つのキーを指定し、numkeys パラメーターを 0 より大きい値に設定する必要があります。詳細については、「Lua スクリプトの使用方法」をご参照ください。
Too many pending requests
考えられる原因:クライアントが無効なパイプラインを使用しているため、Tair のバックエンドで保留中のリクエストが溜まっています。
解決策:パイプライン化されたリクエストの数を減らしてください。
ERR redis temporary failure
考えられる原因:Tair インスタンスのノードに接続する際に、ネットワークジッター、過剰な接続、マスター/レプリカスイッチオーバー、または進行中のスロークエリが原因でタイムアウトエラーが発生します。
解決策:インスタンスが回復するまで待ちます。手動操作は不要です。ご利用のアプリケーションに再接続および例外処理のメカニズムを設計してください。
ERR redis temporary failure (ErrorCode 7002)
考えられる原因:Tair インスタンスのノードに接続する際に、進行中のインスタンス構成変更またはマスター/レプリカスイッチオーバーが原因でタイムアウトエラーが発生します。
解決策:インスタンスが回復するまで待ちます。手動操作は不要です。ご利用のアプリケーションに再接続および例外処理のメカニズムを設計してください。
Lua スクリプトとトランザクション
NOSCRIPT: No matching script
考えられる原因:EVALSHA コマンドを実行する際に、SHA1 値に対応するスクリプトが Tair インスタンスにキャッシュされていません。
解決策:EVAL または SCRIPT LOAD コマンドを実行して、必要なスクリプトを Tair インスタンスにキャッシュしてから、再度お試しください。詳細については、「NOSCRIPT エラーの処理」をご参照ください。
BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
考えられる原因:Lua スクリプトがタイムアウトしました。
解決策:SCRIPT KILL コマンドを実行してスクリプトの実行を終了するか、実行が完了するまで待ちます。詳細については、「Lua スクリプトのタイムアウト処理」をご参照ください。
EVAL command not supported
考えられる原因:EVAL 関連のコマンドを実行できません。
解決策:インスタンスを最新のマイナーバージョンに更新してください。詳細については、「インスタンスのマイナーバージョンの更新」をご参照ください。
Keys for eval/evalsha must be in same slot
解決策:Lua スクリプトを修正します。CLUSTER KEYSLOT コマンドを実行して、キーが存在するスロットをクエリできます。詳細については、「クラスターインスタンスにおける Lua スクリプトの制限」をご参照ください。
ERR bad Lua script for Redis cluster
考えられる原因:このエラーは、プロキシノードの Lua スクリプトに関する制限が原因である可能性があります。
解決策:すべてのキーを配列で指定します。例:EVAL "return redis.call('mget', KEYS[1], KEYS[2])" 2 foo {foo}bar。キーを Lua 変数で置き換えることはできません。詳細については、「クラスターインスタンスにおける Lua スクリプトの制限」をご参照ください。
EXECABORT: Transaction discarded
考えられる原因:トランザクションで実行したコマンドに構文の間違いやエラーがあります。
解決策:コードロジックを確認し、コマンドの構文の間違いを修正してください。
Unkillable script with write commands
考えられる原因:現在の Lua スクリプトに含まれる書き込み操作がすでに実行されています。この場合、SCRIPT KILL コマンドは実行できません。
解決策:コンソールでインスタンスを見つけ、[操作] 列の 再起動 をクリックします。詳細については、「インスタンスの再起動」をご参照ください。
UNKILLABLE: Cannot kill replicated scripts
考えられる原因:現在の Lua スクリプトは、マスターノードから対応するレプリカノードに転送されています。この場合、SCRIPT KILL コマンドは実行できません。
解決策:コンソールでインスタンスを見つけ、[操作] 列の 再起動 をクリックします。詳細については、「インスタンスの再起動」をご参照ください。
NOTBUSY
考えられる原因:実行中の Lua スクリプトがありません。
解決策:手動操作は不要です。SCRIPT KILL コマンドを実行しないでください。
Jedis クライアント
リソースプールの取得失敗
考えられる原因:JedisPool から Jedis 接続を借用できません。
blockWhenExhausted パラメーターがデフォルト値の true に設定されている場合、JedisPool から利用可能な接続がないと、クライアントは maxWaitMillis パラメーターで指定されたミリ秒数だけ待機します。長時間待機しても利用可能な Jedis 接続を取得できない場合、次の例外がスローされます:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool ... Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)blockWhenExhausted パラメーターが false に設定されている場合、JedisPool から利用可能な接続がないと、次の例外がスローされます:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool ... Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
解決策:エラーのトラブルシューティングには、次の点を考慮してください:
接続リーク
デフォルトでは、maxTotal は 8 に設定されています。次のコードは、Jedis クライアントが JedisPool から 8 回接続を借用し、これらの接続を返さないことを示しています。これが、Jedis クライアントが 9 回目の試行で JedisPool から別の接続を取得するために
jedisPool.getResource().ping()コマンドを実行できない理由です。GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379); // クライアントは JedisPool から 8 回接続を借用しますが、これらの接続を返しません。 for (int i = 0; i < 8; i++) { Jedis jedis = null; try { jedis = jedisPool.getResource(); jedis.ping(); } catch (Exception e) { logger.error(e.getMessage(), e); } } jedisPool.getResource().ping();推奨コード:
Jedis jedis = null; try { jedis = jedisPool.getResource(); // 実行したいコマンド。 jedis.executeCommand() } catch (Exception e) { // コマンドにキーが含まれる場合、エラーログにキーを表示するように設定することを推奨します。これにより、キーを使用して問題が発生したデータシャードを特定できます。 logger.error(e.getMessage(), e); } finally { // クライアントは借用した接続を閉じず、代わりに接続を JedisPool に返します。 if (jedis != null) jedis.close(); }maxTotal パラメーターの値が小さい
システムで多数の操作が同時に処理されている場合、maxTotal パラメーターの値が小さいと例外が発生する可能性があります。たとえば、コマンドの平均実行時間は約 1 ms です。これは、次の数式を使用して計算されます:
リソースの借用または返却にかかる時間+ Jedis がコマンドを実行するのにかかる時間 + ネットワーク遅延。1 つの接続の秒間クエリ数 (QPS) は約 1,000 で、期待される合計 QPS は 50,000 です。理論的には、期待される QPS 50,000 を達成するには、maxTotal の値が 50 必要です。maxTotal の値は、50,000 を 1,000 で割って求められます。この場合、クライアントで次のコマンドを実行して、クライアント接続数を取得できます。取得した値に基づいて maxTotal の値を調整できます。
netstat -an | grep 6379 | grep EST | wc -l接続ブロッキング
スロークエリなどの理由で Tair インスタンスへの接続がブロックされると、すべての接続が指定されたタイムアウト期間内に待機します。この場合、多数の操作が同時に処理されると、タイムアウトエラーが報告される可能性があります。詳細については、「java.net.SocketTimeoutException: connect timed out」をご参照ください。
接続拒否
JedisPool から接続を取得しようとして、利用可能な接続がない場合、Jedis は Jedis 接続を作成しようとします。しかし、接続試行が拒否され、例外がスローされます。例:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:50) at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99) at TestAdmin.main(TestAdmin.java:14) Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused at redis.clients.jedis.Connection.connect(Connection.java:164) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80) at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1676) at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:87) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) at redis.clients.util.Pool.getResource(Pool.java:48) ... 2 more Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:579) at redis.clients.jedis.Connection.connect(Connection.java:158) ... 9 moreat redis.clients.jedis.Connection.connect(Connection.java:158)は、Jedis がソケット接続を作成してconnect関数を呼び出そうとしたが、接続試行が拒否されたことを示します。Jedis のソースコード:socket.setSoLinger(true, 0); 158: socket.connect(new InetSocketAddress(host, port), connectionTimeout);通常、この問題に対処するには、Tair インスタンスのドメイン名設定が正しいかどうか、および対応する時間帯のネットワーク接続を確認する必要があります。
java.net.SocketTimeoutException: connect timed out
考えられる原因:ご利用のクライアントと Tair インスタンス間の接続がタイムアウトしました。
解決策:「Tair の接続問題のトラブルシューティング方法」のトピックをご参照ください。
java.net.SocketTimeoutException: Read timed out
考えられる原因:不安定なネットワーク接続、短い読み書きタイムアウト期間、スロークエリ、または接続ブロッキングが原因で、Jedis API 呼び出しがタイムアウトしました。
解決策:タイムアウト期間を長くするか、インスタンス診断を実行して、対応する時点でパフォーマンスの問題や例外が発生しているかどうかを確認します。
このエラーが DMS で発生した場合、VPC エンドポイントまたはポートが変更された可能性があります。DMS コンソールの [データベースインスタンス] リストでインスタンスを右クリックし、[インスタンスの編集] を選択します。[エントリメソッド] を [接続文字列アドレス] に設定し、[接続文字列アドレス] に更新されたエンドポイントを入力して、再度お試しください。
No reachable node in cluster
考えられる原因:JedisCluster にアクセスできません。
解決策:クライアントが初めて Tair インスタンスに接続する場合、クライアントの IP アドレスが Tair インスタンスのホワイトリストに追加されているか確認してください。Tair インスタンスへの接続が初めてでない場合は、インスタンス診断を実行して原因を特定してください。
Caused by: java.lang.NumberFormatException: For input string: "6379@13028"
考えられる原因:Jedis 2.8.0 以前では、cluster slots の出力を解決するために ClusterNodeInformationParser が導入されました。しかし、オープンソースの Redis が出力の型を変更したため、NumberFormatException エラーが報告されます。
解決策:ご利用の Jedis クライアントを 2.9.0 以降に更新してください。
No more cluster attempts left
考えられる原因:API 呼び出しがタイムアウトし、5 回のリトライも失敗しました。デフォルトでは、API 呼び出しがタイムアウトした後、JedisCluster は 5 回リトライします。
解決策:タイムアウト期間を長くするか、インスタンス診断を実行してください。
Unexpected end of stream
考えられる原因:Jedis クライアントのバッファーで例外が発生しました。エラーのトラブルシューティングには、次の点を考慮してください:
複数のスレッドが 1 つの接続を共有している
通常、1 つのスレッドが 1 つの Jedis 接続を使用します。次のコードは、2 つのスレッドが 1 つの Jedis 接続を共有していることを示しています:
new Thread(new Runnable() { public void run() { for (int i = 0; i < 100; i++) { jedis.get("hello"); } } }).start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 100; i++) { jedis.hget("haskey", "f"); } } }).start();この問題を回避し、スレッドセーフを確保するために、JedisPool を使用して Jedis 接続を管理できます。
長時間のアイドル接続
サーバーは長時間のアイドル接続を閉じます。インスタンスの timeout 設定と JedisPool の関連設定をクエリして、長時間のアイドル接続を定期的にチェックしてクリーンアップするかどうかを決定します。
説明デフォルトでは、Tair は長時間のアイドル接続を閉じません。timeout パラメーターの値を変更すると、このエラーが報告される可能性があります。詳細については、「アイドル状態のクライアント接続のタイムアウト期間の指定」をご参照ください。
解決策:複数のスレッドが Jedis コードを共有しているか、サーバーが長時間のアイドル接続を閉じているかを確認してください。
java.lang.Long cannot be cast to java.util.List
考えられる原因:同じ Jedis 接続が複数のスレッド間で共有されている場合、このエラーが報告されます。これは、Jedis 自体がスレッドセーフではなく、複数のスレッドで同時に使用してはならないためです。
解決策:単一のスレッドで 1 つの Jedis 接続を使用してください。そのためには、JedisPool を使用できます。
Broken pipe (Write failed)
考えられる原因:単一接続モードの Jedis クライアントでタイムアウトエラーが発生し、クライアントがソケットを閉じた後も、インスタンスにデータを書き込み続けています。
解決策:単一のスレッドで 1 つの Jedis 接続を使用してください。そのためには、JedisPool を使用できます。
Keys are in different slots
考えられる原因:JedisCluster が異なるスロットにあるキーに対して操作を実行しています。
解決策:ハッシュタグを使用してキーを修正してください。
プロキシモードを使用して、クラスターアーキテクチャの制限を無効にすることもできます。
Lettuce クライアント
Connection to xxx not allowed. This partition is not known in the cluster view.
考えられる原因:デフォルトでは、Lettuce クライアントの validateClusterNodeMembership は true に設定され、refreshOption は null に設定されています。Tair インスタンスのルーティングアドレスが変更された後、refreshOption が null に設定されているため、ルートテーブルは更新されません。この場合、validateClusterNodeMembership でエラーが報告されます。
解決策:refreshOption パラメーターを指定し、validateClusterNodeMembership パラメーターを false に設定します。詳細については、「Lettuce」をご参照ください。
io.lettuce.core.RedisConnectionException: Unable to connect xxx
考えられる原因:ご利用のクライアントと Tair インスタンス間の接続がタイムアウトしました。
解決策:「Tair の接続問題のトラブルシューティング方法」のトピックをご参照ください。
java.nio.channels.UnresolvedAddressException
考えられる原因:このエラーは、Netty のバージョンが原因である可能性が最も高いです。
解決策:ご利用の Netty 依存関係をアップグレードしてください。spring-projects/spring-boot#14307。
ERR Unknown sentinel subcommand 'master'
考えられる原因:マスター/レプリカ Sentinel モードでは、Lettuce クライアントは Sentinel master/slave コマンドを Tair インスタンスに送信します。しかし、Sentinel 互換モードのインスタンスは Sentinel get-master-addr-by-name コマンドのみをサポートします。
解決策:コードを修正して、非 Sentinel モードに切り替えてください。Tair は社内製の高可用性コンポーネントを使用しているため、Sentinel 互換モードを使用する必要はありません。
サポートされていない RESP3 プロトコルによる「Unknown command」エラー
考えられる原因:Redis 6.0 以降は RESP3 プロトコルをサポートしています。HELLO コマンドを実行して、接続を目的の RESP プロトコルバージョンに切り替えることができます。しかし、一部の旧バージョンのインスタンスは HELLO コマンドをサポートしていないため、互換性の問題が発生します。
解決策:プログラムを構成して、RESP2 プロトコルを使用して Tair インスタンスにアクセスできます。例:
client.setOptions(ClientOptions.builder()
.protocolVersion(ProtocolVersion.RESP2)
.build());Redis クライアントとして Lettuce を使用する Spring Data Redis の場合の例:
LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().
clientOptions(ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build()).build();
return new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration);Redisson クライアント
org.redisson.client.RedisConnectionException: Unable to connect to Redis server xxx
考えられる原因:ご利用のクライアントと Tair インスタンス間の接続がタイムアウトしました。
解決策:「Tair の接続問題のトラブルシューティング方法」のトピックをご参照ください。
No enum constant org.redisson.cluster.ClusterNodeInfo.Flag.NOFAILOVER
考えられる原因:旧バージョンの Redisson の既知のバグです。redisson/redisson#2399。
解決策:ご利用の Redisson クライアントを 3.11.6 以降に更新してください。
Spring Data Redis クライアント
NOPERM this user has no permissions to run the 'config|get' command
考えられる原因:インスタンス情報ページで、ご利用のインスタンスのバージョンが Redis 7.0 と表示されています。Redis 7.0 を実行する Tair (Redis OSS-compatible) インスタンスでは、CONFIG コマンドが無効になっています。
起動時に、Spring Data Redis は CONFIG SET コマンドを実行して notify-keyspace-events パラメーターを設定し、KeyspaceEventMessageListener を有効にします。CONFIG GET/SET コマンドが無効になっているため、これは起動エラーで失敗します。
解決策:keyspaceNotificationsConfigParameter を空の文字列に設定します。サンプルコード:SpringRedisTest.zip。Spring Data Redis。
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, keyspaceNotificationsConfigParameter = "")
KeyExpirationListener を使用する場合は、コンストラクターでも keyspaceNotificationsConfigParameter を空の文字列に設定します。
public RedisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer) {
super(redisMessageListenerContainer);
setKeyspaceNotificationsConfigParameter(""); // 重要
}
StackExchange.Redis クライアント
Multiple databases not supported
考えられる原因:SELECT コマンドはクラスターインスタンスではサポートされていません。
解決策:cluster_compat_enable パラメーターを 0 に設定して、オープンソースの Redis Cluster 構文との互換性を無効にします。その後、クライアントを再起動して再度お試しください。詳細については、「インスタンスパラメーターの設定」をご参照ください。
Predis クライアント
Error while reading line from the server
考えられる原因:読み取りリクエストがタイムアウトしました。スロークエリが進行中である可能性があります。
解決策:タイムアウト期間を長くするか、read_write_timeout を 0 または -1 に設定します。詳細については、「Predis に関する質問」をご参照ください。
Phpredis クライアント
Cannot assign requested address
考えられる原因:クライアントが短時間接続を介して Tair インスタンスに接続しています。
解決策:接続メソッドを connect から pconnect に変更するか、クライアント ECS インスタンスの tcp_max_tw_buckets カーネルパラメーターを変更します。「「Cannot assign requested address」エラー」をご参照ください。
redis protocol error, got ' ' as reply type byte
考えられる原因:古い phpredis バージョンのバグです。phpredis/phpredis#1585。
解決策:phpredis を最新バージョンにアップグレードしてください。
php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
解決策:DNS サーバーを正しく設定してください。詳細については、「DNS 名前解決の失敗による接続問題のトラブルシューティング方法」をご参照ください。
考えられる原因:クライアントが Tair インスタンスのドメイン名を解決できません。
Go-redis クライアント
panic: got 4 elements in cluster info address, expected 2 or 3
考えられる原因:Go-redis クライアントのバージョンが Redis 7.0 以降と互換性がありません。redis/go-redis#2085。
解決策:go-redis 9.0 以降を使用してください。
Node-redis クライアント
SCAN command loops infinitely or returns no data
考えられる原因:SCAN コマンドは、JavaScript の最大安全整数である Number.MAX_SAFE_INTEGER を超えるカーソル値を返す可能性があります。これにより、カーソルが不正確になり、無限ループが発生します。redis/node-redis#2561。
解決策:ご利用の node-redis クライアントを 5.0.0 以降に更新してください。