Raftパラメータ
| 項目 | 値 |
|---|---|
| ハートビート間隔 | 250ms |
| 選挙タイムアウト | 500〜1000ms — リーダー障害後、この期間内に新しい選挙が始まる |
| ノード数 | 3または5(設定読み込み時に強制 — それ以外は起動を拒否) |
| ノードID | cluster_peersリスト内での(cluster_selfの)位置 — そのためリストの順序はすべてのノードで同一である必要がある |
| ブートストラップ | 起動から500ms後、すべてのノードが同じメンバーシップで初期化される — すでに初期化済みのクラスタに参加する場合は無視される |
| ログストレージ | インメモリ(揮発性) — 再起動したノードは複製/スナップショットで復旧する |
| lease失効の検知 | リーダーが100msごとにチェックし、合意によってExpireをコミットする |
waitタイムアウトの粒度 | 待機タイムアウト(T)も同じ100ms周期で決定される — 最大100ms遅れて届くことがある |
なぜ3または5ノードなのか
コミットには過半数が必要です。偶数構成はコストが増えるだけで耐障害性は向上しない ため、サーバーはこれを拒否します。
| ノード数 | 過半数 | 同時障害耐性 |
|---|---|---|
| 2 | 2 | 0 — 1台の障害でクラスタが停止する。シングルモードと変わらない |
| 3 | 2 | 1 |
| 4 | 3 | 1 — 3ノードと同じで、コストだけが増える |
| 5 | 3 | 2 |
障害時の動作まとめ
| 状況 | 動作 |
|---|---|
| リーダーでないノードへのクライアントリクエスト | M(リーダーアドレス)、リーダー不明ならE no_leader |
| リーダー障害 | 500〜1000ms以内に新リーダーを選出。その間のリクエストはE no_leaderを受け、クライアントが再試行する |
| リーダー交代中 | 保留中の獲得リクエストはM/E no_leaderでクリアされ、クライアントは新リーダーへ再試行する |
| ノード再起動 | 空の状態で起動 → ピアのログ複製/スナップショットで追いつく |
| 過半数を喪失 | コミットが不可能になる → 書き込みが停止(安全優先)、過半数が復旧すれば自動的に再開 |
用語
- クォーラム — 全ノードの半数を超える数(3台中2台、または5台中3台)。あらゆる決定に クォーラムの合意が必要なため、分断された2つのグループが互いに矛盾する決定を同時に コミットすることは決してありません。
- 選挙タイムアウト — フォロワーがハートビートを受け取らないままリーダーの死亡と 判断し、選挙を開始するまでの待機時間。同時に立候補が起きにくいよう、ノードごとに ランダム化されています。