Redis
このページでは FPT Database Engine で報告の多い Redis の問題を、特定に役立つ症状と解決手順とともにまとめています。自分で切り分けるとき、または FPT Support に渡す情報を集めるときに使ってください。
各項目は症状、原因、影響、対処の順で構成されています。
既知の問題
Redis が予期せず接続を切断する
症状
Redis に接続している client アプリケーションが次を返します。
Redis error: Server closed the connection
処理の途中で接続が終了します。その後アプリケーションはタイムアウトするか、再接続を繰り返します。
原因
Redis サーバー側から接続を切断しています。よくある原因は次のとおりです。
- アプリケーションと Redis の間のネットワークが不安定である。
- Redis のリソース (CPU、メモリ、接続数) が枯渇している。
- アプリケーション側の接続設定が正しくない。
- NAT gateway や Load Balancer などのファイアウォールやネットワーク機器が接続を終了させている。
影響
- キャッシュ、セッション、キューのデータを Redis に依存しているリクエストが失敗します。
- リトライと再接続によりアプリケーションのレイテンシが上昇します。
- Redis にまだ書き込まれていないデータが失われます。
- アプリケーションが database にフォールバックしたりロジックを再実行したりするため、全体の性能が低下します。
- セッションストアやメッセージブローカーなど Redis が重要な構成要素である場合、障害が連鎖する可能性があります。
対処
ネットワーク接続を確認します。 アプリケーションから Redis に到達できるか確認します。
redis-cli -h YOUR_REDIS_HOST -p YOUR_REDIS_PORT -a YOUR_REDIS_PASSWORD ping
応答が PONG でない場合、問題は client ではなくネットワーク接続かアクセス設定にあります。
Redis の性能を確認します。 監視ダッシュボードで CPU とメモリの使用率、接続数、応答時間を確認します。FMON による database の監視 を参照してください。
client の設定を確認します。 パラメータ名は Redis client によって異なりますが、次の 4 つの挙動がすべて設定されているか確認してください。
- 接続のヘルスチェック。切断された接続を検知して張り直します。redis-py では
health_check_intervalです。 - TCP keepalive。ネットワークや中間機器のタイムアウトによる切断を防ぎます。redis-py では
socket_keepaliveです。 - タイムアウト時のリトライ。タイムアウトの後にリクエストを再試行します。redis-py では
retry_on_timeoutです。 - エラー時のリトライ。接続の切断やサーバー側からの切断など一時的なエラーの後に再試行します。redis-py では
retry_on_errorです。
正確なパラメータ名は使用している client のドキュメントを参照してください。
ファイアウォールとネットワーク機器を確認します。 アプリケーションの Subnet と database の Subnet の間にファイアウォールや中間機器がある場合は、そのログで切断された接続を確認し、想定外のタイムアウトや接続数の上限が適用されていないかを確認し、トラフィックが不安定でないか観察してください。
Redis の接続に関するドキュメント も参照してください。
keepalive を有効にした接続プールを使えば、この種の切断はほとんど防げます。アプリケーション側のリトライと監視アラートを組み合わせれば、一時的な障害がユーザーに届くことはありません。