Raft(分散合意アルゴリズム)について
クラスタ内の全サーバに一貫性のあるステートマシンを提供するためのアルゴリズム(?):
イメージ図 (見返してみると、論文のFigure1とかなり似ていた...):

実用的な分散合意アルゴリズムは典型的には以下の性質を備えている(らしい):
論文では、Paxosは難しすぎる、というのが前提としてある:
Raftは理解可能性を最重視:
投票要求RPC(RequestVote)とログエントリ追加RPC(AppendEntries)若干不正確かもしれないですが、一応必要最低限の用語定義:
{インデックス、term}のペアで、ログのエントリを一意に特定するキーとなるログの図(論文のFigure6より):

termの図(論文のFigure5より):

NOTE: 後で再び触れるので、ここは項目名を読むくらいで飛ばす
{インデックス、term}のペアを保持しているなら、先頭からそのインデックスに至るまでの全てのエントリは等しい以下の三つのサブ問題に分割されている:
補足:
leader、candidate、followerの三つがあるRaftはリーダーに強い役割を割当てることでモデルを単純にしている:
leader => followerの流れしかない(一方通行)つまり、一度リーダーが選出されると、
基本的には多数決(majority)ルール:
follower => candidateにステートが変わったサーバが選出処理を始める (遷移条件は後述)leaderになるleaderを維持票が割れたらどうするか?
candidateサーバが同時にRequestVoteRPCをブロードキャストした場合等に発生する可能性あり競合者がいなくてもリジェクトされることがある:
followerにステートが遷移する(後述)この選出方法は[1] 選出安全性を保証する:
参考サイト: http://thesecretlivesofdata.com/raft/
follower、candidate、leaderのステートがどう遷移するか。
※ 末尾の遷移図を見れば十分
サーバの起動直後はfollower:
candidateになる(選出処理の開始)
candidateサーバは上述の選出処理を行い:
followerになる。
leaderに選ばれたleaderになるcandidateのままで(ウェイト後に)リトライするleaderは:
followerになる
candidateの時と同様に、自分よりも新しい(時間/termが進んでいる)のサーバがいたら、一度followerになるleader状態が維持されるステート遷移の図(論文のFigure4):

可用性をあげるためにはレプリケーションが必要。
ログのサーバ間での一貫性をどう維持するかが問題:
leaderのログがマスターfollowerとの間で差異(齟齬)が生じ得る:
leaderがクライアントからのリクエスト(コマンド)を受けて、ログにエントリを追加したfollowerが何らかの理由で(RPC通信に)極端に遅延しているfollowerのダウンからの復帰直後 (起動後はまずストレージに保存されたログを読み込む)leaderになった直後
(a)と(f))leaderに追従)が必要leaderとfollowerで差異が生じる例 (論文のFigure7):

クライアントからのリクエスト(コマンド)をどう処理するか(正常系?):
followerにブロードキャスト (AppendEntriesRPC)followerにもコミットを反映)正常系以外は?
followerのログが先に進みすぎ、後ろ過ぎ
followerはどうする?
このレプリケーション方法は[2] リーダーは追記のみと[3] ログマッチングを保証する:
{インデックス、term}のペアを保持しているなら、先頭からそのインデックスに至るまでの全てのエントリは等しい上の二節で取り上げた方法はかなりシンプル and アルゴリズムの外観を掴むには十分。
ただし、
{インデックス, term}の大小比較もします、という話:
candidateのログが、他のマジョリティのそれと同じくらい進んでいることを保証したいのでインデックスも加味するコミット破棄の図 (論文のFigure8):

要約:
! 以下の二つが満たされる:
サーバを止めずにクラスタの構成(メンバーリスト)を更新するにはどうすれば良いか?
idempotentだから大丈夫boardcatTime << electionTimeout << MTBFが満たせないと可用性が損なわれる
ログの肥大化を防ぐにはどうすれば良いか?
スナップショットを使う:
余裕があれば 9.3 を読んで軽く書く
Raftは実用的な分散合意アルゴリズムが備えるべき性質を保持しているか?
TODO: