RPCの種類
フレーム内のtagがRPCの種類を決めます。すべての ペイロードはpostcardでシリアライズされたopenraft型です。
| tag | 名前 | リクエストペイロード | レスポンスペイロード | 役割 |
|---|---|---|---|---|
1 | Vote | VoteRequest | VoteResponse | リーダー選出 — 候補者が他ノードに投票を求める |
2 | AppendEntries | AppendEntriesRequest | AppendEntriesResponse | ログ複製 + ハートビート — リーダーが複製コマンドをフォロワーに伝播する |
3 | FullSnapshot | (Vote, SnapshotMeta, snapshot_bytes)のタプル | SnapshotResponse | 遅れたノードにスナップショット全体を送る |
- Vote — リーダーが落ちると、ハートビートが途絶えたノードが候補者になり投票を 要求します。過半数を獲得したノードが新しいリーダーになります。
- AppendEntries — リーダーがコミット対象のロックコマンドをログエントリとして運びます。 エントリなしのAppendEntriesがそのままハートビートです — 別途のハートビート メッセージはありません。
- FullSnapshot — ログでは追いつけないほど遅れたノード(または参加したばかりの ノード)に、現在の状態全体を送ります。ストリーミングなしで、1つのフレームに全体を 乗せて送られます。
フロー — リーダーが落ちたとき
ノードA
ノードB
ノードC
リーダーのハートビートが途絶えたことを検知 → 候補者になる
Vote · 投票を要求
Vote · 投票を要求
賛成
自分自身を含む過半数 → 新リーダー
AppendEntries (エントリなし = ハートビート)
AppendEntries (エントリなし = ハートビート)
合意形成RPC(Raft)
新しく選出されたリーダーの最初のハートビートが届いた瞬間、クラスタは通常のサービスに 戻ります — 全体の空白時間は通常0.5〜1秒です。通常運用時のAppendEntries(ログ複製)の 流れは複製コマンドを参照してください。
用語
- ログ複製 — リーダーが決定したコマンドを順序付きのログに変換し、フォロワーに そのまま記録させること。同じログを同じ順序で適用することで、すべてのノードが 同じ状態に収束します。
- ハートビート — 定期的に送られる「生きている」という信号。これが途絶えると、 フォロワーはリーダーが落ちたと判断し、選挙を開始します。