このトピックでは、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 キーが存在する可能性があります。 オフラインキー分析またはインスタンス診断機能を使用して原因を特定できます。
WRONGTYPE: Wrong data type
考えられる原因:コマンドがキーのデータ型に対して無効です。たとえば、String 型のキーに対して HASH コマンドを実行した場合などです。
ソリューション:誤ったコードまたはコマンドを修正します。詳細については、「Redis コマンド」をご参照ください。
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 Community Edition でサポートされているコマンド および 高リスクコマンドを無効にするをご参照ください。
ソリューション:実行したいコマンドを #no_loose_disabled-commands で指定された無効化コマンドから削除します。
NOPERM this user has no permissions to run the 'xxx'
考えられる原因: Tair の特定のコマンドが、Alibaba Cloud で無効化されているか、または #no_loose_disabled-commands によって指定されています。 詳細については、「」、「Community Edition でサポートされているコマンド」、「」、および「高リスクコマンドを無効にする」をご参照ください。
ソリューション:実行したいコマンドを #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 アドレスを ECS インスタンスのホワイトリストに追加します。詳細については、「IP ホワイトリストの設定」をご参照ください。
パブリックネットワーク経由で ECS インスタンスにアクセスする場合は、アウトバウンド 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 コマンド」をご参照ください。
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
考えられる原因: EVAL コマンドおよび EVALSHA コマンドで、キーが指定されていないか、numkeys パラメーターが 0 以下の値に設定されている。
解決策: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"
考えられる原因:ClusterNodeInformationParser は Jedis 2.8.0 以前で導入され、cluster slots の出力を解決します。しかし、オープンソースの 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 プロトコルによる「不明なコマンド」エラー
考えられる原因: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 互換) インスタンスでは、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 クラスター構文との互換性を無効にします。その後、クライアントを再起動して再試行します。詳細については、「」または「インスタンスのパラメーターを設定する」をご参照ください。
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 以降に更新します。