Ticketing
ドキュメント

Raftパラメータ

項目
ハートビート間隔250ms
選挙タイムアウト500〜1000ms — リーダー障害後、この期間内に新しい選挙が始まる
ノード数3または5(設定読み込み時に強制 — それ以外は起動を拒否)
ノードIDcluster_peersリスト内での(cluster_selfの)位置 — そのためリストの順序はすべてのノードで同一である必要がある
ブートストラップ起動から500ms後、すべてのノードが同じメンバーシップで初期化される — すでに初期化済みのクラスタに参加する場合は無視される
ログストレージインメモリ(揮発性) — 再起動したノードは複製/スナップショットで復旧する
lease失効の検知リーダーが100msごとにチェックし、合意によってExpireをコミットする
waitタイムアウトの粒度待機タイムアウト(T)も同じ100ms周期で決定される — 最大100ms遅れて届くことがある

なぜ3または5ノードなのか

コミットには過半数が必要です。偶数構成はコストが増えるだけで耐障害性は向上しない ため、サーバーはこれを拒否します。

ノード数過半数同時障害耐性
220 — 1台の障害でクラスタが停止する。シングルモードと変わらない
321
431 — 3ノードと同じで、コストだけが増える
532

障害時の動作まとめ

状況動作
リーダーでないノードへのクライアントリクエストM(リーダーアドレス)、リーダー不明ならE no_leader
リーダー障害500〜1000ms以内に新リーダーを選出。その間のリクエストはE no_leaderを受け、クライアントが再試行する
リーダー交代中保留中の獲得リクエストはM/E no_leaderでクリアされ、クライアントは新リーダーへ再試行する
ノード再起動空の状態で起動 → ピアのログ複製/スナップショットで追いつく
過半数を喪失コミットが不可能になる → 書き込みが停止(安全優先)、過半数が復旧すれば自動的に再開

用語

  • クォーラム — 全ノードの半数を超える数(3台中2台、または5台中3台)。あらゆる決定に クォーラムの合意が必要なため、分断された2つのグループが互いに矛盾する決定を同時に コミットすることは決してありません。
  • 選挙タイムアウト — フォロワーがハートビートを受け取らないままリーダーの死亡と 判断し、選挙を開始するまでの待機時間。同時に立候補が起きにくいよう、ノードごとに ランダム化されています。