Zookeeper を簡単に説明する (パート 2) Zookeeper に基づく分散ロックとリーダー選出

Zookeeper を簡単に説明する (パート 2) Zookeeper に基づく分散ロックとリーダー選出

1. Zookeeperの機能

1. Zookeeperノードタイプ

上記の「Zookeeper アーキテクチャと FastLeaderElection メカニズム」で説明したように、Zookeeper は Linux ファイル システムに似たツリー構造を提供します。ツリー構造内の各ノードは znode と呼ばれ、次の 2 つの次元に分類できます。

(1)持続か短命か

  • Persist ノードが作成されると、誤って失われることはなく、すべてのサーバーが再起動されても存在し続けます。各 Persist ノードには、データ ノードと子ノードの両方を含めることができます。
  • エフェメラル ノードは、それを作成したクライアントとサーバー間のセッションが終了すると自動的に削除されます。サーバーの再起動によりセッションが終了するため、Ephemeralタイプのznodeもこの時点で自動的に削除されます。

(2)シーケンスと非シーケンス

  • 非シーケンス ノード: 複数のクライアントが同時に同じ非シーケンス ノードを作成すると、正常に作成できるのは 1 つだけであり、その他は失敗します。作成されたノードの名前は、作成時に指定されたノード名とまったく同じです。
  • シーケンス ノード: 作成されたノード名には、指定された名前の後に 10 桁の 10 進シーケンス番号が付きます。複数のクライアントが同じ名前のノードを作成する場合、それらはすべて正常に作成されますが、シーケンス番号は異なります。

2. Zookeeper のセマンティック保証

Zookeeper はシンプルで効率的であり、次のセマンティック保証を提供するため、これらの機能を使用して複雑なサービスを提供することができます。

  • 順次クライアントによって開始された更新は、送信された順序で Zookeeper に適用されます。
  • アトミック更新操作は、中間状態なしで成功するか失敗するかのいずれかになります。
  • 単一のシステム イメージ クライアントは、どのサーバーに接続しても、まったく同じシステム イメージ (つまり、まったく同じツリー構造) を表示できます。注: 上記の「Zookeeper アーキテクチャと FastLeaderElection メカニズム」で紹介されている ZAB プロトコルによれば、書き込み操作では、更新がすべてのフォロワーによって即座に確認されることは保証されません。したがって、一部のフォロワーを通じてデータを読み取っても、最新のデータを読み取ることができるとは限らず、一部のフォロワーとリーダーは最新のデータを読み取ることができます。単一のシステム イメージを確保する必要がある場合は、読み取り操作の前に同期メソッドを使用します。
  • 信頼性: 更新が受け入れられると、他の更新によって上書きされない限り、誤って失われることはありません。
  • 最終的に一貫性のある書き込みは、最終的に(すぐにではなく)クライアントに表示されます。

3. 動物園の飼育係の監視機構

Zookeeper のすべての読み取り操作にはウォッチを併用できます。対応するデータが変更されると、ウォッチがトリガーされます。時計には以下の機能があります

  • アクティブ プッシュ ウォッチがトリガーされると、Zookeeper サーバーはクライアントのポーリングを必要とせずに更新をクライアントにアクティブにプッシュします。
  • ワンタイムデータが変更された場合、ウォッチは 1 回だけトリガーされます。クライアントが後続の更新について通知を受け取りたい場合は、ウォッチがトリガーされた後にウォッチを再登録する必要があります。
  • 可視性 クライアントが読み取り要求に Watch を添付し、Watch がトリガーされている間にデータを再度読み取ると、クライアントは Watch メッセージを受信する前に更新されたデータを確実に確認できなくなります。つまり、更新通知は更新結果に先行します。
  • 順序性 複数の更新によって複数のウォッチがトリガーされる場合、ウォッチがトリガーされる順序は更新の順序と一致します。

2. 分散ロックとリーダー選出のポイント

1. 最大で1人がロックを獲得/リーダーになる

分散ロック (ここでは特に排他ロック) の場合、いつでも最大 1 つのプロセス (単一プロセス内のロックの場合は 1 つのスレッド) がロックを取得できます。

リーダー選挙では、いつでも最大 1 人がリーダーとして選出されます。そうしないと、スプリットブレインが発生します。

2. 再入場をロックする/自分がリーダーであることを確認する

分散ロックの場合、ロックを取得したプロセスがロックを解放する前に再度ロックを取得できること、つまりロックの再入可能性を保証する必要があります。

リーダー選出のためには、リーダーはリーダーシップを獲得したこと、つまりリーダーであることの確認ができる必要があります。

3. ロックを解除する/リーダーシップを放棄する

ロック取得者は取得したロックを正しく解放でき、ロックを取得したプロセスがクラッシュした場合は、他の競合プロセスがロックを取得できるようにロックが自動的に解放され、デッドロック状態が回避される必要があります。

リーダーは自発的にリーダーシップを放棄でき、リーダーがいるプロセスがクラッシュした場合は、リーダーシップが自動的に解放され、他の参加者が再びリーダーシップを競い合い、リーダーがいない状態にならないようにする必要があります。

4. 認識ロックの解除/リーダーシップの放棄

ロックを取得したパーティがロックを解除すると、そのロックを競合する他のパーティはロックの解除を感知し、再度ロックの取得を試みる必要があります。

元のリーダーがリーダーシップを放棄すると、他の参加者はその出来事を感知し、選挙プロセスを再開できるはずです。

5. 不公平な党首選挙

上記の側面から、分散ロックとリーダー選挙の技術的なポイントは非常に似ており、実際にそれらの実装メカニズムも似ていることがわかります。この章では、リーダー選挙を例に挙げて、2 つの実装原則を説明します。分散ロックの実装原理はほぼ同じです。

6. マスター選択プロセス

次の図に示すように、3 つの Zookeeper クライアントが同時にリーダーの座を競っていると仮定します。これら 3 つのクライアントは、Ephemeral ノードと Non-sequence ノードを Zookeeper クラスターに同時に登録し、パスはすべて /zkroot/leader になります (エンジニアリングの実践では、パス名はカスタマイズできます)。

上図に示すように、非シーケンス ノードであるため、3 つのクライアントのうち 1 つだけが正常に作成され、他のノードの作成は失敗します。この時点で、正常に作成されたクライアント (上図のクライアント 1) がリーダーとして正常に実行されます。他のクライアント (上図のクライアント 2 とクライアント 3) はフォロワーになります。

7. リーダーシップを放棄する

リーダーがリーダーシップを放棄するつもりなら、/zkroot/leader ノードを削除するだけです。

リーダー プロセスが予期せずクラッシュした場合、リーダー プロセスと Zookeeper 間のセッションが終了し、ノードは一時ノードであるため自動的に削除されます。

この時点で、/zkroot/leader ノードは存在しなくなります。選挙に参加している他のクライアントにとっては、前リーダーがリーダーシップを放棄したことになります。

8. リーダーシップの放棄の認識

上図からわかるように、ノードの作成に失敗したノードは Follower になるだけでなく、/zkroot/leader に Watch も登録されます。リーダーがリーダーシップを放棄すると、つまりノードが削除されると、すべてのフォロワーに通知が届きます。

9. 再選

古いリーダーがリーダーシップを放棄したことを感知すると、すべてのフォロワーは、次の図に示すように、新しいラウンドのリーダーシップ選挙を開始できます。

上の図からわかるように

  • 新しいリーダー選挙の方法は、最初のリーダー選挙の方法とまったく同じです。どちらもノード作成要求を開始します。作成が成功すると、リーダーになります。それ以外の場合は、フォロワーになり、フォロワーがノードを監視します。
  • 新たな選挙の結果は予測できず、第 1 回選挙の順位とは何の関係もありません。このため、この制度は不公平なモデルと呼ばれています。

10. 不公平モデルの概要

  • 不公平モードは実装が簡単で、各ラウンドの選挙方法はまったく同じです。
  • 競合相手が少ないほど効率が高くなります。各フォロワーは、ノードが削除される時刻がまったく同じではないことを Watch を通じて感知します。 1 人のフォロワーが通知を受け、選挙を開始する限り、その時点で新しいリーダーが選出されることが保証されます。
  • Zookeeper クラスターの負荷が大きいため、スケーラビリティが低くなります。数万のクライアントが選挙に参加すると、数万の書き込み要求が同時に Zookeper に送信されることになります。 「Zookeeper Architecture」の記事で説明されているように、Zookeeper にはシングルポイント書き込みの問題があり、書き込みパフォーマンスは高くありません。同時に、リーダーがリーダーシップを放棄すると、Zookeeper は数万のフォロワーに同時に通知する必要があり、システムに大きな負荷がかかります。

3. 公正なリーダー選挙

1. マスター選択プロセス

下の図に示すように、公平なリーダーシップ選出では、各クライアントが /zkroot/leader ノードを作成し、そのタイプは Ephemeral および Sequence になります。

シーケンス型ノードなので、上図の 3 つのクライアントはすべて正常に作成されていますが、シーケンス番号が異なります。この時点で、各クライアントは、正常に作成したノードのシリアル番号が現時点で最小であるかどうかを判断します。はいの場合、クライアントはリーダーであり、そうでない場合はフォロワーです。

上図では、クライアント 1 が作成したノード番号は 1、クライアント 2 が作成したノード番号は 2、クライアント 3 が作成したノード番号は 3 です。最小シーケンス番号は 1 であり、ノードはクライアント 1 によって作成されたため、クライアント 1 がリーダーです。

2. リーダーシップを放棄する

リーダーが自発的にリーダーシップを放棄する場合は、リーダーが作成したノードを削除するだけです。

リーダーが配置されているプロセスが予期せずクラッシュした場合、リーダーと Zookeeper 間のセッションは終了します。作成されたノードは Ephemeral タイプであるため、ノードは自動的に削除されます。

3. リーダーシップの放棄の認識

不公平モードとは異なり、各フォロワーはリーダーによって作成されたノードを監視するのではなく、自分のシーケンス番号よりもわずかに小さいシーケンス番号を持つノードを監視します。

上図では、ノードは合計 1、2、3 の 3 つあり、クライアント 2 は /zkroot/leader1 を監視し、クライアント 3 は /zkroot/leader2 を監視します。 (注: シリアル番号は 1 桁ではなく 10 桁である必要があります。便宜上、ここでは 1 桁の数字を使用しています)

リーダーがダウンすると、/zkroot/leader1 が削除され、クライアント 2 に通知されます。この時点では、クライアント 3 は /zkroot/leader2 を監視しているため通知されません。

4. 再選

クライアント 2 は、/zkroot/leader1 が削除されたという通知を受信した後、すぐに新しいリーダーにはなりません。代わりに、まずシーケンス番号 2 が現在の最小のシーケンス番号であるかどうかを判断します。このシナリオでは、そのシーケンス番号は確かに最小です。したがって、クライアント 2 が新しいリーダーになります。

クライアント 1 がリーダーシップを放棄する前にクライアント 2 がクラッシュした場合、クライアント 3 に通知されることに注意することが重要です。この時点では、クライアント 3 はすぐにリーダーにはなりませんが、まずそのシーケンス番号 3 が現在の最小シーケンス番号であるかどうかを判断する必要があります。当然、クライアント 1 によって作成された /zkroot/leader1 がまだ存在するため、クライアント 3 は新しいリーダーにはならず、クライアント 2 のシーケンス番号 2 の前のシーケンス番号 (1) のウォッチを作成します。このプロセスを下の図に示します。

5. 公平性モデルのまとめ

  • 実装が比較的複雑
  • 優れたスケーラビリティ。各クライアントは 1 つのノードのみを監視し、ノードが削除されるたびに 1 つのクライアントのみに通知する必要があります。
  • 古いリーダーがリーダーシップを放棄すると、他のクライアントが選出順序 (つまりノード番号) に従って新しいリーダーになります。これがフェア モードの起源です。
  • 新しいリーダーを選出する前に特定のノードに通知されるのを待つ必要があるため、待ち時間は不公平モードよりも長くなります。

IV.結論

Zookeeper ベースのリーダー選出または分散ロックの実装は、Zookeeper ノードの特性と通知メカニズムに基づいています。これらの機能を最大限に活用することで、他のシナリオに適した分散アプリケーションを開発することもできます。

【この記事は51CTOコラムニスト「Guo Jun」によるオリジナル記事です。転載については原著者にお問い合わせください]

この著者の他の記事を読むにはここをクリックしてください

<<:  Arubaの次世代ネットワークソリューションは従来のネットワーク管理に革命をもたらします

>>:  クラウド コンピューティングとクラウド ストレージの比較: 具体的な関係は何ですか?

推薦する

「巨人の敵」元奇の森

「我々は必ず元斉の森を倒すと決意している。」 「今年は元斉森林炭酸水は市場に出回らなくなります。」元...

SEO におけるリンクの重みに影響を与える上位 10 の要因の簡単な分析

最近、多くの QQ 相談で「高品質のリンクを作成するにはどうすればよいか」という質問が寄せられていま...

オンライン「百度人工」Kステーションに関するいくつかの意見

まず、「百度マニュアル」という名前を紹介しましょう。多くの人が聞いたことがあるでしょう。インターネッ...

混乱があるときのみ発展があります。慎重に考え、ウェブサイト開発のすべてのステップをうまく進めてください。

A5のウェブサイトでは毎日多くの著者がウェブサイト構築の経験を共有していますが、彼らの言葉には自信と...

中国での優れたSEOは井の中の蛙ではない

みなさんこんにちは。私の名前はLiang Lei、オンライン名はStoneです。初心者にとって、SE...

柔軟なサプライチェーンが一般的なトレンドとなり、Oracle Fusion Supply Chain Management Cloud はデジタルプロセス管理を完全に強化します。

感染症の流行や世界市場構造の変化など、さまざまな要因の影響により、予測可能性、持続性、安定性を備えた...

大手検索エンジンによるウェブサイトセキュリティ検証の推進から見るインターネットの発展

現在、さまざまな怪物や悪魔、善人と悪人が入り乱れるインターネットの状況をさらに是正するために、百度、...

「WeChat版JD」における検索ロジックの弱体化カテゴリの解釈。

【Ebrun News】5月28日、噂されていたJD.com WeChatポータルが昨日ついに正式に...

usshosting-月額3.74ドル/KVM/メモリ2g/ハードディスク75g/トラフィック2T/カナダ

usshosting は非常に新しい VPS 販売業者です。公式には 2009 年に設立されました。...

米国、新たなネット中立性規則を可決

2月26日、米国連邦通信委員会(FCC)が提案・策定した「ネット中立性」がワシントンで賛成3対反対2...

Yuehuai SEO: ウェブサイトのランキングに影響を与えるユーザーエクスペリエンス要因の分析

Baidu がアルゴリズムを更新した後、ウェブマスターは「ウェブサイトのコンテンツ構築に最適化の取り...

ufovps:「香港クラウドサーバーCN2」シリーズの簡単なレビューで、その効果をお伝えします

ufovpsの香港vpsはBGP、CN2、CN2 GIAに分かれています。このCN2は伝説のCN2 ...

ショック! JD Cloud と Kingsoft Cloud が統合されましたか? ......

たった今、ネットユーザーがニュースを報じました: JD Cloud と Kingsoft Cloud...

草の根WeChatプラットフォームの成長方法に関する6つの実践的な洞察

WeChatパブリックプラットフォームはどのように運営されるべきでしょうか? 強力な企業背景を持たな...

SEO はどれくらい持続しますか?

GOOGLEが中国市場から撤退して以来、Baiduは国内市場の大部分を占めることに成功している。最近...