0

x 台のマシンがあり、特定のジョブ (プライマリ マシン) を実行するために 1 台を選択したいと考えています。これらのマシンが持つ唯一の共有リソースであるデータベースがあり、マシン間通信メカニズムはありません。

マシンを選択するために、データベースに値を書き込むことを考えています。最初に成功した方が選択されます (M1 など)。M1 は、定期的にデータベースを更新して、稼働していることを示します。M1 が停止すると、M1 が最近 DB を更新していないことを確認した他のマシンは、プライマリ マシンの役割を引き受けるために db に書き込もうとします。

任意の時点でマシンが db に書き込むことができる値は何ですか? そのため、すべてのマシンは同じ値を書き込もうとしますか? すべてのマシンでクロックが同期されている場合、YYMMDDHHMM を使用できる可能性があります。しかし、そうではないかもしれません。

ポインタ/アイデアはありますか?

4

2 に答える 2

1

DBMSの機能を使用して、サーバー自体の時刻を照会し、ここで概説しているアプローチに従うことができます。

これを水密にするために、あなたが注意しなければならないいくつかの問題があります:

  • 現在のワーカーノードの活性度をテストする場合、ワーカーの活性度のテストとジョブの要求が1つのアトミックアクションとして実行されることを確認するために、テーブルで書き込みロックを取得する必要があります。これにより、複数のワーカーによる同時請求を回避できます。
  • 現在のワーカーがテーブルを更新してその活気を主張するときはいつでも、他のワーカーがジョブを引き継いだケースを検出するために、同じロックメカニズムに従う必要があります。
  • 他の労働者が仕事を引き継いだことを知るためにも、現在仕事をしている人が見えるように、ある種の身分証明書を含める必要があります

あなたの説明から、アルゴリズムをどのように詳細に実装したいかが正確に明確ではないため、これらは単なる一般的な意見です。

于 2012-08-03T17:57:23.133 に答える
1

データベースが提供するロック セマンティクスと、失敗したクライアントの検出能力に応じて、各マシンが共通の排他ロックの取得を試みるだけで十分な場合があります。排他ロックを取得したマシンがリーダーです。

于 2012-08-03T18:41:02.977 に答える