シチュエーション
- 3台のノードからなるクラスタにJavaのTransport Clientで接続(接続先IPアドレスに3つのノードすべてを列挙)
- 1台のノードをシャットダウン・起動
- 20%前後の確率で https://github.com/elastic/elasticsearch/issues/11202 のエラーがJava Client側で発生
概要
Javaアプリケーションを起動したまま、検索できる状態を維持しつつノードを1つずつ再起動したいです(ローリングアップデートなどのため)。
しかしTransport Clientで接続した場合、ノードを再起動するとcatchすることができないエラーが発生する場合があります。
これに対する私が知っている解決策は現状3つあります。
- REST API(9200ポート)をLBで束ねてREST APIへアクセスする。ノードのシャットダウン時にはLBからそのノードを一時的に切り離す
- Node Clientを使用する(手元で実験してみたところNode Clientによる接続ではエラーは発生しませんでした)
- ノードのシャットダウン前にTransport Clientの接続先一覧からそのノードのIPを削除、その後Javaアプリケーションを再起動してTransport Clientがシャットダウンするノードへアクセスしないようにする(起動後には逆の手順を行う)
しかし、現状の私達の環境で採用するにはそれぞれ問題があります。
- 現状使用しているelastic4sというライブラリが使えない
- ノードサーバからアプリケーションサーバへの接続がネットワーク環境の制約上できないため使えない
- 3ノード・2アプリケーションの場合、接続先の書き換えと再起動を8回もする必要があり煩雑。
Transport Clientによる検索を維持しつつノードを再起動する方法はなにかないでしょうか?