0

私は簡単にLWWルールを介してデータを破棄することができるように唯一の最近のデータを追跡しても問題の解決にベクトルクロックの助けを採用したいと思います(最後の書き込みが勝つ) は言う、我々は3つのノードがあります。どのようにして決定する同時ベクトルクロックで最後に書き込み勝つ?

- Node1 
- Node2 
- Node3 

次に、ベクトルクロックを使用して、各イベント/変更の因果関係と並行性を追跡します。私たちは、たとえば、ノード1は、それは我々がこれは通常、大丈夫、右だろう

{Node1: 5, Node2:0, Node3:0}. 

につながるという5ずつそのクロックをインクリメント意味するであろう5つのローカルの変更を取得し

{Node1:0, Node2:0, Node3:0}. 

で最初にベクトルクロックを表しますか?同時に、ノード2はまた、そのローカルを更新した場合、ノード1は、ノード3へのイベントの更新を渡し、そのvectorclockを便乗を送信し、いくつかの点で

{Node1:0, Node2:1, Node3:0}. 

に結果としてそのクロックをインクリメントするもの次に

。したがって、VCがのノード3は、まだ変更がないので、データとクロックを簡単にマージするだけです。

私が対処する方法について考えている問題は、ノード2が自身のVCとアップデートを渡してノード3にアップデートするイベントを送信するとどうなるかということです。 データとクロックには何が起こりますか? Node1からのNode3に書き込まれた最初の書き込みが、それ自身のクロックでより大きいVC値を持つため、基本的に後で書き込みとして表示されたときに、Last Writeの勝利を適用するにはどうすればよいですか。ノード3が受信した{Node1: 5, Node2: 0 , Node3: 1} ノード2のmessagevcを:マージする前に ノード3の時計{Node1:0, Node2:1, Node3:0}

はどのようにして、同時のVC上のデータを解決するハンドルのですか?

答えて

1

これは良い質問です。ベクトルクロックでカウンタを使用しており、ノード間でカウンタを同期していないため、この問題が発生しています。いくつかのオプションがあります:

  1. すべての書き込みを1つのプライマリサーバーで送信します。プライマリサーバは、すべての書き込みに合計注文を適用し、個々のノードに送信して保存することができます。あなたのシステムにいくつかのバックグラウンドを持たせることは役に立ちます。たとえば、3つの独立したノードがあるのはなぜですか?レプリケーションと可用性を提供するために存在しますか?もしそうなら、このプライマリサーバのアプローチはうまくいくでしょう。
  2. GoogleのSpanner用紙に記載されているように、サーバーの時刻を同期させてください。次に、ベクトルクロックの各ノードに対して単調に増加するカウンタを使用する代わりに、サーバの時間に基づいてタイムスタンプを使用することができます。繰り返しますが、あなたのシステムにバックグラウンドを持たせることは役に立ちます。あなたのシステムが書き込みを提出する人間のユーザだけで構成されているなら、LWWの不変量に​​違反することなく、NTPを使ってサーバの時間をゆるやかに同期させることができます。
関連する問題