# `Raft`リーダー選挙

![`smart`](RaftLeaderElect01_aa_002_20220511.png)

------------------------------------------------------------------------------
Raft分散合意アルゴリズムは、時間を小さな時間段階に分割する概念を最初に導入します。それは、Raft分散合意アルゴリズムの目に見えるところでは、時間が一つのtermから別のtermに分割されており、各termのサイズは異なる可能性があることを理解することができます。私たちは、これらのtermを識別するために連続して増加する数字を使用します。

ノードごとにtermが格納され、termの初期段階では選挙段階である必要があります。リーダーが誕生した後、Raftクラスタ全体はこのtermの残りの時間の間、正常なサービスを提供します。例外が発生しなければ、このtermは継続します。例外が発生した場合（リーダーのクラッシュやネットワークの問題など）、現在のtermは終了し、新しいノードは前のtermの識別子をインクリメントし、新しい選挙のラウンドを開始します。

Raft は、クラスタ内にリーダーが最大でも1つであることを保証する必要があります。

クラスタの始めに、すべてのノードはフォロワーです。リーダーまたは候補者から有効なメッセージを受け取らない場合、選挙が開始されます。この指定された時間を選挙タイムアウトと呼びます。選挙タイムアウトはランダムな値（例えば、デフォルトは10秒）です。

リーダーの有効なメッセージはハートビートメッセージであり、候補者の有効なメッセージは投票メッセージです。ここでは2つの状態変数が導入されます。選挙タイムアウトとハートビートタイムインターバルです。ハートビートタイムインターバルは、不要な投票を開始しないように、選挙タイムアウトよりも小さいです。

node 2が最初に選挙タイムアウトを破ると仮定すると、それは自身のterm identifierをインクリメントし、候補者ロールになり、自分自身に投票します。同時に、クラスタ内の他のマシンに投票要求を送信し、それには新しくインクリメントされたterm identifierが含まれます。現在のterm identifier以上のterm identifierを持つ投票要求を受け取った他のフォロワーは同意し、自身のterm identifierを更新し、候補者ロールを持つノードに同意メッセージを送信します。

この時点で、候補役のTiKVノードがクラスタ内のTiKVノードのうち半数以上がリーダーであると認めたら、ステータスがリーダーに変わり、すぐに全ノードにハートビートメッセージを送信し、その後はハートビート間隔に従ってハートビートメッセージを送信します。

ここで、最初の選挙が終わりました。

