障害タイプ | ビジネスシナリオ | Lettuce バージョン | 核心問題 |
主動切り替え | 互換性バージョンのアップグレード、プロキシバージョンのアップグレード、データ移行 | Lettuce 6.1.05より前のバージョン | デフォルトではTCP Keepalive(アイドル接続の生存確認)が無効のため、クライアントの接続プールはバックエンドVIPの切り替えを感知できません。古い接続はプール内に保持され続け、サーバー側で切り替えが完了しても、クライアントは無効な接続を使い続けてエラーを発生させます。 |
受動的切り替え | 物理マシンの異常ダウン | Lettuce 6.3.0より前のバージョン | TCP_USER_TIMEOUTパラメータが未設定の場合、ネットワークの瞬断やノードのダウンが発生すると、OSは長時間(デフォルトで30分以上)ハーフオープン接続を維持する可能性があります。クライアントの接続プールはこれらの「ゾンビ接続」をタイムリーに回収できず、継続的なエラーが発生します。 |
SocketOptions socketOptions = SocketOptions.builder().keepAlive(SocketOptions.KeepAliveOptions.builder()// 2回のkeepalive間の時間間隔.idle(Duration.ofSeconds(TCP_KEEPALIVE_TIME))// 接続がどのくらいアイドル状態になったらkeepaliveを開始するか.interval(Duration.ofSeconds(TCP_KEEPALIVE_TIME/3))// keepaliveが数回行われた後に接続を切断します。.count(3)// キープアライブ接続を有効にするかどうか.enable().build()).tcpUserTimeout(SocketOptions.TcpUserTimeoutOptions.builder()// サーバー側のrstによる長時間のタイムアウト問題を解決します。.tcpUserTimeout(Duration.ofSeconds(TCP_USER_TIMEOUT)).enable().build())// tcp接続タイムアウト設定.connectTimeout(Duration.ofMillis(redisConnectTimeout)).build();
フィードバック