Raft
分散合意アルゴリズム
振る舞い
自動フェイルオーバー
データのレプリケーション
一貫性の担保
提供する機能
自動フェイルオーバー
ノードがクラッシュしても自動でリカバリーする
データの自動同期
アプリケーションログとは違い State Machine への命令
Raft ではログレプリケーションと呼ぶ
一貫性の維持や分断に対する耐性
リーダーを必ず経由するモデルを取る
ノードの役割
リーダー
クライアントからリクエストを受け取るノード
フォロワーに命令を送信するノード
フォロワー
リーダーから命令を受け取るノード
可溶性や冗長化のために存在する
候補者
リーダー候補
リーダーからハートビートが届かなかった場合に遷移
候補者になる前に term をインクリメントする
term:今のリーダーの何代目のリーダーかを表す
ログ・インデックス
今のリーダーにおける何個目の命令かを示す
コミットインデックス
リーダーがコミットした最新のログエントリのインデックスを示す
コミットには過半数のノードへの保存が必要
リーダー選出
リーダーは1つしか選出されない
2つ以上になることはない
リーダーが不在の時はある
リーダーがクラッシュして、あらたなリーダーが選出されるタイミング
選出のフロー
1. 選挙タイムアウト
ハートビートを受け取るとリセットされる
2. 候補者の立候補
自らの term を1つ増やし、自分に投票した上で他のノードに投票を求める
3. 投票
投票するノードの条件
その term で投票をしてない
候補者の term が自分以上
候補者のログが自分と同じかより新しい
Raft
強み
強い一貫性の維持
ノードのクラッシュやクラッシュ後の復帰に対する安全性
ネットワーク分断の環境下での正常動作
弱み
レイテンシー
スケーラビリティ・スループット
リーダー障害時の可用性の低下
参考