consulのリーダー選出の仕組み
よくわかっていなかったのでメモ。
consulのリーダー選出には、Raft プロトコル(分散合意アルゴリズム)が使用されている。
- 各ノードは次の3つのステートを持つ。
- leader
- follower
- candidate
- 遷移
- 起動直後はみんな
follower
- followerはランダムなTimeout(150ms~300ms)値を持ち、過ぎると
candidate
に変わる。- 非サーバモードの場合は
candidate
にならない
- 非サーバモードの場合は
-
candidate
になると自分のtermをインクリメントする # よくわからない -
candidate
は各ノード(follower
)にRequestVoteRPC(投票リクエスト)をブロードキャストする -
follower
RequestVoteRPCを受け取ったら自分のTimeoutをリセットして、投票レスポンスをするfollower
は最初にRequestVoteRPCを投げたcandidate
に投票する
- 過半数以上の得票を受け取った時点で
candidate
はleader
になる -
leader
は定期的にAppendEntriesRPC(ハートビート)を各follower
にブロードキャストする -
follower
はハートビートを受け取ると自分のTimeoutをリセットする
- 起動直後はみんな
- 参照