無停止再起動(ローリング)手順
核心となる原則は1つだけです — 常に過半数を生かしておくこと。 3ノードなら一度に 1台まで、5ノードなら2台までしか落とせません。
- フォロワー(リーダーでないノード)から先に、1台ずつ再起動します — その間、 リーダーはサービスを継続します。再起動したノードがピアのログ複製/ スナップショットで追いついたことを確認してから、 次のノードに進みます。
- 最後に、リーダーを落とします。 残ったノードがハートビートの途絶を検知し、 0.5〜1秒以内に新しいリーダーを選出します。その間のクライアントリクエストは
E no_leaderを受けますが、公式クライアントは透過的に再試行するため、アプリケーション には短い遅延としてしか見えません。 - 落としていたノードを再び起動すると、フォロワーとして再参加し追いつきます (リーダーシップを自動的には取り戻しません)。
過半数が生き残っている限り、この間もロック状態は保たれます — 再起動中に発行・解放 されたロックもコミットを経るため、失われるものはありません。
フロー(3ノード)
リーダー
フォロワー1
フォロワー2
① フォロワー1を再起動 — リーダーはそのままサービスを継続
ログ複製/スナップショットで追いつく
② 追いついたら、フォロワー2を再起動
ログ複製で追いつく
③ 最後にリーダーを再起動
Vote → 0.5〜1秒以内に新リーダーを選出
旧リーダーはフォロワーとして再参加し追いつく
合意形成RPC(Raft)
リーダーが落ちている短い間、クライアントはE no_leaderを受け取ることがありますが、 公式クライアントは透過的に再試行するため、アプリケーションからは短い遅延にしか 見えません。