ログ複製:全ノードが同じ履歴に
Raft では、リーダーに追加したコマンドが各フォロワーへ複製され、過半数が持った時点で commit 確定(緑)。障害や旧リーダー復帰で生じた分岐ログも、新リーダーのログで上書きされ全員が同じ履歴に揃います。
5
40%
未 commit(過半数未満)
commit 確定(過半数到達)
分岐ログ(孤児・上書き対象)
リーダー
現在の term
—
リーダー
—
過半数 = ⌊N/2⌋+1
—
commitIndex
—
各ノードのログ(横=ログのインデックス、行=ノード)
分散データベースでは、複数ノードがまったく同じ操作履歴(ログ)を持つことで一貫性を保ちます。Raft では特定の1台がリーダーになり、クライアントのコマンドをまず自分のログに書き、各フォロワーへ
あるエントリを過半数(
リーダーが落ちて新しいリーダーが選ばれると、古いリーダーだけが持っていた未 commit のエントリ(分岐ログ・赤)は孤児になり、新リーダーのログで上書きされて全員が同じ履歴に戻ります。
AppendEntries で複製します。あるエントリを過半数(
⌊N/2⌋+1 台)が持った瞬間、それは commit 確定(緑)となり、もう失われません。リーダーが落ちて新しいリーダーが選ばれると、古いリーダーだけが持っていた未 commit のエントリ(分岐ログ・赤)は孤児になり、新リーダーのログで上書きされて全員が同じ履歴に戻ります。
いま何が起きている?
ここがポイント
- 複製は片方向 ── 書き込みは必ずリーダー経由。リーダーが各フォロワーへエントリを押し出す。
- commit は多数決 ── 過半数
⌊N/2⌋+1が持ったエントリだけが確定。1〜2台遅れても止まらない。 - 遅延ノードは追いつく ── 後から
AppendEntriesで欠けたエントリを順に受け取り、いずれ全員のログが一致する。 - 分岐は新リーダーが解消 ── 旧リーダーの未 commit エントリは上書きされ、commit 済みエントリは必ず生き残る(Leader Completeness)。