Graceful Exit
v3.3 以降、StarRocks は Graceful Exit をサポートしています。
概要
Graceful Exit は、StarRocks FE、BE、CN ノードの非破壊的なアップグレードと再起動をサポートするために設計されたメカニズムです。その主な目的は、ノードの再起動、ローリングアップグレード、またはクラスターのスケーリングなどのメンテナンス操作中に、実行中のクエリやデータ取り込みタスクへの影響を最小限に抑えることです。
Graceful Exit は以下を保証します:
- ノードは、終了が始まると新しいタスクの受け入れを停止します。
- 既存のクエリとロードジョブは、制御された時間枠内で完了することが許可されます。
- システムコンポーネント(FE/BE/CN)は、クラスターが正しくトラフィックを再ルーティングするように状態変更を調整します。
Graceful Exit のメカニズムは、FE と BE/CN ノードで異なります。以下に説明します。
FE Graceful Exit メカニズム
トリガーシグナル
FE Graceful Exit は以下で開始されます:
stop_fe.sh -g
これは SIGUSR1 シグナルを送信し、デフォルトの終了(-g オプションなし)は SIGTERM シグナルを送信します。
ロードバランサーの認識
シグナルを受信すると:
- FE は
/api/healthエンドポイントでHTTP 500 を即座に返します。 - ロードバランサーは約15秒以内に劣化状態を検出し、この FE への新しい接続のルーティングを停止します。
接続ドレインとSHUTDOWNロジック
Follower FE
- 読み取り専用クエリを処理します。
- FE ノードにアクティブなセッションがない場合、接続は即座に閉じられます。
- SQL が実行中の場合、FE ノードは実行が終了するのを待ってからセッションを閉じます。
Leader FE
-
読み取りリクエストの処理は、Follower と同じです。
-
書き込みリクエストの処理には以下が必要です:
- BDBJE のクローズ。
- 新しいリーダー選出の完了を許可。
- 後続の書き込みを新しく選出されたリーダーにリダイレクト。
タイムアウト制御
クエリが長時間実行される場合、FE は60秒(--timeout オプションで設定可能)後に強制終了します。
BE/CN Graceful Exit メカニズム
トリガーシグナル
BE Graceful Exit は以下で開始されます:
stop_be.sh -g
CN Graceful Exit は以下で開始されます:
stop_cn.sh -g
これは SIGTERM シグナルを送信し、デフォルトの終了(-g オプションなし)は SIGKILL シグナルを送信します。
状態遷移
シグナルを受信すると:
- BE/CN ノードは自分自身をEXITINGとマークします。
- 新しいクエリフラグメントを拒否し、
INTERNAL_ERRORを返します。 - 既存のフラグメントの処理を続行します。
フライト中のクエリの待機ループ
BE/CN が既存のフラグメントの終了を待つ動作は、BE/CN の設定 loop_count_wait_fragments_finish によって制御されます(デフォルト:2)。実際の待機時間は loop_count_wait_fragments_finish × 10 秒(デフォルトでは 20 秒)です。タイムアウト後もフラグメントが残っている場合、BE/CN は通常のSHUTDOWNを続行します(スレッド、ネットワーク、その他のプロセスを閉じる)。
改善された FE 認識
v3.4 以降、FE はハートビートの失敗に基づいて BE/CN を DEAD とマークしなくなりました。BE/CN の「EXITING」状態を正しく認識し、フラグメントが完了するための大幅に長いグレースフルエグジットウィンドウを許可します。
設定
FE 設定
stop_fe.sh -g --timeout
- 説明:FE が強制終了されるまでの最大待機時間。
- デフォルト:60(秒)
- 適用方法:スクリプトコマンドで指定します。例:
--timeout 120。
最小 LB 検出時間
- 説明:LB は劣化した健康状態を検出するのに少なくとも 15 秒を必要とします。
- デフォルト:15(秒)
- 適用方法:固定値
BE/CN 設定
loop_count_wait_fragments_finish
- 説明:BE/CN が既存のフラグメントを待機する期間。値に 10 秒を掛けます。
- デフォルト:2
- 適用方法:BE/CN 設定ファイルで変更するか、動的に更新します。
graceful_exit_wait_for_frontend_heartbeat
- 説明:BE/CN がハートビートを介して FE がSHUTDOWNを確認するのを待つかどうか。v3.4.5 以降。
- デフ ォルト:false
- 適用方法:BE/CN 設定ファイルで変更するか、動的に更新します。
stop_be.sh -g --timeout, stop_cn.sh -g --timeout
- 説明:BE/CN が強制終了されるまでの最大待機時間。BE/CN の待機期間に達する前に終了しないように、
loop_count_wait_fragments_finish* 10 より大きい値に設定します。 - デフォルト:false
- 適用方法:スクリプトコマンドで指定します。例:
--timeout 30。
グローバルスイッチ
Graceful Exit は v3.4 以降、デフォルトで有効です。一時的に無効にするには、BE/CN 設定 loop_count_wait_fragments_finish を 0 に設定します。