2024 年 2 月、StackExchange.Redis コミュニティにより、タイムアウトエラーを引き起こすバグが修正されました。このバグは、StackExchange.Redis クライアントがプロキシモードで動作する Tair (Redis OSS-compatible) インスタンスにアクセスし、複数データベース(DB)機能を使用する場合に発生します。この問題を解決するには、StackExchange.Redis クライアントをバージョン 2.7.20 以降にアップグレードしてください。
詳細
影響範囲
以下のすべての条件が満たされる場合にタイムアウトエラーが発生します:
StackExchange.Redis クライアントのバージョンが 2.7.20 より古いこと。
Tair インスタンスが クラスタアーキテクチャ(プロキシモード) または 読み書き分離アーキテクチャ を採用していること。
複数 DB 機能が使用されており、SELECT コマンドが実行されていること。
エラー例
1. StackExchange.Redis.RedisTimeoutException: Timeout performing xxx (5000ms), inst: 0, qu: 0, qs: 0, aw: False, rs: ReadAsync, ws: Idle, in: 0, in-pipe: 0, out-pipe: 0, serverEndpoint: XX.XX.XX.XX:6379, mgr: 10 of 10 available, clientName: 67c80fdab92d, PerfCounterHelperkeyHashSlot: 11235, IOCP: (Busy=0,Free=1000,Min=12,Max=1000), WORKER: (Busy=18,Free=32749,Min=12,Max=32767), v: xx.y.xx.xxx (クライアント側でタイムアウトを引き起こす一般的な問題については、こちらの記事をご参照ください:https://stackexchange.github.io/StackExchange.Redis/Timeouts)
2. Multiple databases are not supported on this server; cannot switch to database原因
オープンソースの Redis Cluster では複数データベースがサポートされていません。そのため、プライマリ/スタンバイアーキテクチャからクラスタアーキテクチャへ移行した後は、SELECT コマンドを実行できません。一方、Tair (Redis OSS-compatible) のプロキシモードでは複数データベースがサポートされており、クラスタアーキテクチャや読み書き分離アーキテクチャにおいても SELECT コマンドによるデータベース間切り替えが可能です。この機能により、スタンドアロン版からクラスタまたは読み書き分離アーキテクチャへのスムーズなアップグレードが実現されます。詳細については、「Tair プロキシ機能の概要」をご参照ください。
StackExchange.Redis の 2.7.20 より前のバージョンでは、Tair のプロキシノードが標準のクラスタノードと誤って識別され、その結果 SELECT コマンドが失敗します。この問題は StackExchange.Redis バージョン 2.7.20 で修正されています。
対応策
StackExchange.Redis をバージョン 2.7.20 以降にアップグレードしてください。