blog

zookeeper の選出アルゴリズム

PK選挙ラウンド:現在のサーバーの選挙ラウンドが、受け取った投票用紙の選挙ラウンドより低い場合、自分の投票箱を空にし、投票用紙の中で最も高いラウンドを持つものに自分の選挙ラウンドを設定します。 終了条...

Aug 20, 2020 · 3 min. read

前提条件となる概念

  • myid: サーバーの識別子
  • zxid: 更新操作のトランザクションIDで、上位32ビットがリーダーのシリアル番号、32ビット目が現在のリーダー配下の更新のシリアル番号。
  • logicClock: 現在のサーバーがポールを開始したラウンド数
  • サーバーの状況
    • LOOKING:自分のポジションが明確でない
    • following:フォロワーとしてリーダーを明確にしていること
    • leading leader
    • observing: フォロワーとしての投票権や選出権を持たない

選挙アルゴリズムのプロセス

クラスタ起動時の選挙プロセス

  1. 投票箱を空にします。zookeeprでは投票箱はメモリ上の配列として表現され、メモリ上にあることの弊害として、投票箱が無効になる可能性があります。
  2. 最初の投票:各サーバは、リーダーとして自分自身を選出し、他のノードに情報を拡散し、情報の構造は、myidサーバを選出logicClockラウンドの現在のサーバとして表現されるzxidのためのサーバの最大のものidによって選出され、logicClockの値は、それが送信されているかどうかを判断することができますサーバに反映される有効でない場合、サーバは、行の情報から脱落し、zxidの値は、最新の情報が失われないように反映されている場合logicClockの価値は、サーバがオフラインになった場合に、有効な情報を送信しているかどうかを判別できることであり、zxidの価値は、最新の情報を失わせないことです。
  3. 投票PK:
    1. PKの選挙ラウンド:現在のサーバーの選挙ラウンドは、受信した投票の選挙ラウンドよりも低い場合は、独自の投票箱を空にし、同じ選挙ラウンドを持つすべての投票の数で、それが1より大きい場合は、PKの次のラウンドを実施し、投票では最高のラウンドを持つものに独自の選挙ラウンドを設定します。
    2. PKの投票:投票の比較は、主に大きいもののIDを比較することであり、もののIDが同じである場合、次にmyidを比較し、最終的に最終的なPKによって認識されるリーダーを広げます。
  4. 終了条件:ラウンド内の半数以上のサーバーが投票を支持した時点で投票を終了し、各サーバーが受け取った票から、半数以上のサーバーが同じLEADERを支持したかどうかを判断します。

選出時に様々な情報を渡す目的は何かというと、選出されたLEADERが最も多くの情報を知っているサーバーであることを保証するため、情報の損失を防ぐため、クラスタ内で渡される情報が最新であることを保証するため、このアルゴリズムではこの問題も解決することを目指しています。

フォロワーの再出発が選挙に与える影響

  1. 新しいラウンドの投票を開始するために、オンライン上のサーバーがロック状態になります。
  2. 他のサーバーから投票情報を受け取り、リーダーを確認します。

リーダーの再始動が選挙に与える影響

  1. LEADER がオフラインになると、フォロワーサーバーは LOOKING 状態になります。
  2. 新しいリーダーを選出するためにパート2.1の操作を繰り返し、違いは、zxidの役割が反映されていることです、彼らはデータの損失を引き起こす可能性が低いより多くの情報を知っているに代わってリーダーになるもののidが大きいほど、クラスタは、すべてのサーバーがデータを更新することに同意する必要はありませんので、zxidが異なっています。
  3. のリーダーがクラスタに再参加し、パート2.2の操作を行って正規のフォロワーになります。

拡張

選挙権のないサーバーの存在意義とは?

オブザーバ・サーバは、クラスタ数が増加した場合に書き込み効率が低下するという問題を解決するために存在します。書き込み効率の低下は、書き込み操作を許可するかどうかを決定するためにクラスタ内のマシンの投票が必要であるという事実に起因しており、クラスタ数の増加は一般的に読み取り効率の向上と待ち時間の短縮を目的としています。

zkノードごとに異なるサーバーリスト情報が選挙に与える影響

クラスタはマシンを1台ずつ順次追加して構築されるため、クラスタ内の全員が知らない新しいマシンが追加されても、そのマシンは追加されないからです。

Read next

約束

関数の実行中のPromiseは同期ですが、call resolveメソッドの最後の非同期操作や、エラーcall rejectメソッドの途中で遭遇する非同期操作があり、いずれもEventLoopにマイクロタスクとして追加されます。また、なぜマイクロタスクがあるかというと、同期的な方法は、タスクが発生した場合、プログラム全体の実行に影響を与えるため、最初の方法は好ましくありません。

Aug 15, 2020 · 2 min read