問題タブ [leader-election]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
187 参照

kubernetes - オペレーターフレームワークでリーダー付きリースを使用してポッドがリーダーに選出されたら、関数を実行する方法は?

コンテナーの 3 つのポッド/レプリカを実行しようとしています。そのうちの 1 つをリーダーとして実行したいのですが、その特定のポッドが停止または失敗した場合、すぐに他の非リーダー実行ポッドがリーダーシップを取り、実行を継続する必要があります。これはリーダー ポッドから必要です。明確にするために、他のポッドは実行されますが、リーダー ポッドはリーダーシップを獲得すると、他のポッドが実行しない追加のコードを実行します。これは、私がフォローしたドキュメントへのリンクです。

これは、コンテナが実行するはずの実際のコードの実行に問題がある、私が実行したテスト例です。

リーダー ポッドのログは次のとおりです。

「私はリーダーです」という印刷ステートメントまでポッドを実行し、リーダーポッドに実行させたいタスクを実行できるようにしたいと考えています。リーダーシップを獲得したら実行できるようにする関数をどこかに渡すことができたとしても、私には問題ありません。現在、私はどこかでミスを犯しており、3 つのポッドのうちの 1 つが主導権を握った後、何もできません。

0 投票する
1 に答える
359 参照

c# - 一度に 1 台のマシンで同期タスクを実行するために Consul を使用する方法は?

10 台のマシンを備えたシステムがあり、各マシンで特定のタスクを 1 つずつ同期順に実行する必要があります。基本的に、特定の時間にそのタスクを実行できるマシンは 1 台だけです。すでにConsul別の目的で使用していますが、これを使用できるConsulかどうかを考えていました。

詳細を読むと、各マシンがロックを取得し、作業を行ってからロックを解放しようとする領事でリーダー選挙を使用できるようです。作業が完了すると、ロックが解放され、他のマシンが再度ロックを取得して同じ作業を実行しようとします。このようにして、すべてが一度に 1 台のマシンで同期されます。

C# PlayFab ConsulDotNet この機能が既に組み込まれているこのライブラリを使用することにしましたが、より良いオプションが利用可能な場合は、それも受け入れます。私のコードベースの下Actionのメソッドは、ほぼウォッチャーメカニズムを介して同時に各マシンで呼び出されます。

上記のメソッド内で、以下のことを行う必要があります-

  • ロックの取得を試みます。ロックを取得できない場合は、他のマシンがロックを取得している可能性があるため、それを待ちます。
  • ロックが取得された場合、DoTheWork()。
  • 作業が完了したら、ロックを解放して、他のマシンがロックを取得して同じ作業を行えるようにします。

アイデアは、10台のマシンすべてがDoTheWork()一度に1つずつ同期する必要があるということです。このブログと このブログに基づいて、ニーズに合わせて例を変更することにしました-

以下は私のLeaderElectionServiceクラスです:

以下は私のLeaderChangedEventArgsクラスです:

上記のコードには、私のユースケースには必要ないかもしれない多くの部分がありますが、考え方は同じです。

問題文

今私のActionメソッドでは、上記のクラスを使用して、ロックが取得されるとすぐにタスクを実行したいと思います。それ以外の場合は、ロックを待ち続けます。作業が完了したら、セッションを解放して破棄し、他のマシンがセッションを取得して作業できるようにします。以下のメソッドで上記のクラスを適切に使用する方法について、私はちょっと混乱しています。

私は最近作業を始めたので、このライブラリC#を使用して本番環境でこれを効率的に機能させる方法についてちょっと混乱しています。Consul

アップデート

あなたの提案に従って以下のコードを試してみましたが、これも以前に試したと思いますが、何らかの理由でこの行 await distributedLock.Acquire(cancellationToken);に移動するとすぐに、自動的にメインメソッドに戻ります。Doing Some Work!プリントアウトに進むことはありません。CreateLock実際に動作しますか?私はそれがdata/lockconsulで作成され(そこにないため)、そのロックを取得しようとし、取得された場合は作業を行ってから他のマシンに解放することを期待していますか?

0 投票する
1 に答える
131 参照

algorithm - リンク障害を許容する 2 ノード システムのこのリーダー選出アルゴリズムは、主要なイノベーションと見なすことができますか?

私のチームと私は、エンジニアリングにおける 2 ノード システムのスプリットブレイン問題を解決する方法を発明し、論文を発表しました。私たちは有名なチームではありませんが、この方法は非常に新しく実用的であると考えています。そのため、これが大きな革新であると誰もが考えるかどうかを確認するために、全員と議論したいと考えています。

私たちが解決しようとしている問題

まず、解決したい問題について説明します。2 ノード分散システムでは、ノード間のリンクに障害が発生し、3 番目のノードがない場合、これら 2 つのノードで構成されるシステムは、可用性 (ライブ性) と一貫性 (安全性) の両方でリーダーの選出を行うことができません。これにより、2 ノードの分散ストレージまたはデータベース システムを設計することができなくなります。

この問題を解決するために、エンジニアは多くの方法を考えてきました。2 つのノード間でより信頼性の高いハードウェアを使用してリンク障害を回避するものもあれば、調停のために 3 番目のノードまたは共有メディアを使用するものもあります。ただし、これにより、ハードウェアに追加の要件が課せられます。

私たちが提案した解決策

このホワイト ペーパーでは、追加のサード ノードまたは共有メディアにも、信頼できるリンクにも依存しない新しい方法を提案します。この方法は「レベルベースのリーダー選出アルゴリズム」と呼ばれます。しかし、この名前は論文では使用されていません。

これが、S サーバー ノードで構成される、部分的に同期される (または最終的に同期される、または半同期される) 分散ストレージおよびデータベース システムであるとします。それらにアクセスする C クライアント ノードがあります。

  • S>=3 の場合、S サーバー ノードは Paxos、Raft などの任意の統一コンセンサス アルゴリズムを使用してリーダーを選出できます。この場合、可用性 (ライブ性、リーダーは最終的に選出される) と一貫性 (安全性、常に異なるリーダーは存在しない) が保証されます。
  • S<=2 かつ C>=1 の場合、クライアント ノードもリーダー選出プロセスに参加します。クライアントノードの数 C>=1 である限り、ノードの総数は 3 以上であり、部分的な同期システムでリーダーを選出するために均一コンセンサスアルゴリズムを使用できます。ただし、サーバー ノードのみが投票および選出される権利を持ち、クライアント ノードは投票する権利のみを持ち、選出される権利は持ちません。
  • S<=2 かつ C=0 の場合、リーダー選出プロセスに参加するノードの総数は 3 未満であるため、可用性と一貫性の両方を保証できるアルゴリズムはありませんが、クライアント ノードからの要求もまったくありません! 可用性や一貫性は必要ないため、2 つのサーバー ノードのいずれかをリーダーとして選択できます。

リクエスト

この方法が大きなイノベーションと見なせるかどうか、ご意見をお聞かせいただければ幸いです。さらに、レベルベースのリーダー選出プリミティブを現在のストレージとデータベースの要求/応答プロトコルに追加する予定です。興味のある方は、お知らせください。