1

ノードの 1 つをマスターとして指定する必要があるアプリケーションをクラスター化しました。クラスター ノードは、 nodeID 、 isMaster 、 lastTimestamp 列を含むテーブル追跡ます

クラスター内の各ノードは、 X秒ごとにマスターになろうとします。ノードは、次のいずれかの場合にのみマスターになることができます

  • 他のマスターノードはありません
  • 現在のマスター ノードのlastTimestampが2*Xだけ古い

上記のいずれかの条件を満たしたとき

  • 現在のマスター ノードのisMasterをクリアする必要があります
  • 新しいマスター ノードのisMasterを設定する必要があります
  • 新しいマスター ノードのlastTimestampは「現在」のタイムスタンプに設定する必要があります。

2 つ以上のノードがマスターになる可能性なしに上記を達成するための単一の (移植可能な) SQL ステートメントは何ですか?

4

2 に答える 2

1

Oracle データベースのソリューションを想像することはできますが、それが移植可能かどうかはわかりません。これが単一の移植可能な SQL ステートメントである必要があるのはなぜですか? ほとんどのデータベースでは、テーブルのロックとトランザクションが許可されているため、この種のことを複数のステートメントで実行できます。

于 2008-11-28T00:09:33.667 に答える
1

この種の調整は、通常、DBMS 上で実行されるアプリケーションではなく、DBMS 自体によって処理されるのではないでしょうか? 私も使い慣れた DBMS でそれを行う方法を想像できますが、システムについて詳しく知る必要はありません (おそらく共有ディスクを使用しているため、すべてのノードが同じデータを参照します。同時アクセスを防止するロック プロトコルがあると思われます)。データに; lastTimestamp を定期的に更新するのはマスター ノード上のユーザー プロセスですか)、あまり役に立たないでしょう。また、Jamie Love が指摘したように、DBMS では、複数のプロセスが関連レコードへのアクセスを調整できるようにする必要があります。主な関連レコードは、現在のマスター レコードです。

[編集済み: 読みすぎたのかもしれません。

単一の UPDATE ステートメントは、テーブルの 2 つの行に対して差分更新を実行する必要があり、2 つの更新のうち 1 つしか実行できない場合は失敗する必要があります。つまり、現在のマスターを非マスターに変更し、自身のレコードを変更してマスターにする必要があります。1 つの問題は、DBMS が「1 行のみがマスターになる可能性がある」という制約をどのように実施するかということです。それが機能し、問題がある場合、ステートメント全体が失敗すると仮定しましょう-そうあるべきです。列名を提供している場合でも、テーブル名を省略することがよくあるのはなぜですか? まあ、テーブル名は以降ClusterControlです。各ノードは、何らかの形で独自の NodeID を認識している必要があります。{MyNodeID} を使用して、それが SQL のどこに表示されるかを示しました。

別のハートビート更新が必要です。

 UPDATE ClusterControl
     SET lastTimestamp = CURRENT_TIMESTAMP
     WHERE NodeID = {MyNodeID};

「押収マスターステータス」の更新は次のようになります。

UPDATE ClusterControl
    SET lastTimestamp = (CASE
                         WHEN NodeID = {MyNodeID} THEN CURRENT_TIMESTAMP
                         ELSE lastTimestamp END),
        isMaster      = (CASE
                         WHEN NodeID = {MyNodeId} THEN 'Y'
                         ELSE 'N' END)
    WHERE (NodeID  = {MyNodeID} AND isMaster = 'N') OR
          (NodeID != {MyNodeID} AND
           lastTimestamp < CURRENT_TIMESTAMP - INTERVAL '120' SECOND AND
           isMaster = 'Y'
          );

'seize master status' 更新の背後にある理論は (SET 句) です。

  • 新しいマスターの lastTimestamp フィールドは現在のタイムスタンプに設定されますが、古いマスターは変更されません。
  • isMaster フィールドは、新しいマスターでは「Y」に、古いマスターでは「N」に変更されます。

WHERE 句の背後にある理論は次のとおりです。

  • 現在のノードが現在のマスターでない場合のみ、現在のノードのレコードを変更するか、このノードが現在のノードではなく、タイムスタンプが 120 秒を超えている場合 (質問の「2 * X」) 古いマスター ノードのレコードを変更します。 .

'Y' フラグを持つ行が 1 つだけであることを保証する (おそらく神話上の) 制約があるため、マスターが最新の場合、これは必要に応じて失敗するはずです。

テストされていない SQL!

]

于 2008-12-01T05:53:55.563 に答える