スナップショット
ログでは追いつけないほど遅れたノード(例えば再起動直後)には、 FullSnapshot RPCによって現在の状態全体が送られます。 snapshot_bytesの中には、postcardでシリアライズされた次の構造が入っています。
| フィールド | 内容 |
|---|---|
last_applied | このスナップショットが反映している最後のログ位置 |
last_membership | メンバーシップ(ノード構成)情報 |
token_seq | フェンシングトークンの発行カウンタ — 複製されているため、リーダー交代をまたいでもトークンの単調性が保たれる |
locks | (key, token, remain_ms)のリスト — 保持中のすべてのロックとその残りlease |
remain_msはスナップショット取得時点での残りlease(ミリ秒)です。インストールする ノードは、自身の時計でnow + remain_msとして失効時刻を復元します — 絶対タイム スタンプは一切送られないため、ノード間の時計のずれは影響しません。- ミリ秒が使われるのはここだけで、精度のためです(クライアント向けの単位は秒です)。
- Raftログはインメモリ(揮発性)です。再起動したノードは空の状態で起動し、ピアの ログ複製かこのスナップショットで追いつきます — コミット済みの状態は、過半数が 生き残っている限り保たれます。
フロー
リーダー
遅れたノード
再起動直後 — 空の状態で起動
AppendEntries
ログでは追いつけないほど遅れている
FullSnapshot — 状態全体を1フレームで
インストール: 各ロックを now + remain_ms として復元
以降は通常のAppendEntriesログエントリに戻る
合意形成RPC(Raft)
用語
- スナップショット — 特定時点の状態全体のコピー。遅れたノードがスナップショットを インストールし、それ以降のログエントリだけを追えばよくなるため、最初からすべてを 再生する必要がなくなります。
- メンバーシップ — クラスタを構成するノードのリストとその役割情報。