同期用のベクタークロックではなく明示的なDAG


13

私は、一連のピア間でのデータ同期へのアプローチを検討し始めました。ピアは切断された方法で動作し、ローカルの変更をマージするために相互に同期できる必要があります。

ピアは、ローカルアップデートを「3方向マージ」とマージできるはずです。そのため、同期ピアでは、どのファクトがより新しいかを知る必要がありますが、厳密な順序付けがない場合は、共通ルートに基づいてファクトをマージできる必要があります。

独立したピアが変更を行う場合、「クロック」を使用して「タイムスタンプ」を付けることができます。「時計」と「タイムスタンプ」という用語を使用しますが、ウォールタイムクロックを意味しません。私は、因果関係を明確にするイベントのある種の部分的な順序付けを意味します。それはだ「の前に起こった」非循環有向グラフ(DAG)を形成するイベント間の関係。

この部分的な順序付けを行う「通常の」方法は、ベクトルクロックを使用することです。ただし、これらは非常に大きくなる可能性があります。間隔ツリークロックなどの最近の開発では、タイムスタンプのよりコンパクトなストレージが提供されます

私がまったく明らかにしていないのは、同期プロトコルが明らかにDAGを「単純に」明示的に保存しない理由です。(それともそうですか?)

ピアは、UUIDをランダムに生成することにより(またはなどの他の手段により<peer-name> + <local-monotonically-increasing-counter>)、独立してタイムスタンプを作成できます。このタイムスタンプの順序は、そのピアにとって完全に明確です。

2つのピアが互いに同期すると、新しいタイムスタンプに同意できます。繰り返しますが、このタイムスタンプの順序は、両方のピアにとって明確です。

現在、ピア間でDAGの前に発生したイベントを渡す必要がありますが、これのストレージおよび帯域幅の要件はわずかです。時点はグラフの頂点です。そのため、1つまたは2つの着信エッジがあります(クライアント上のイベント用に1つ、クライアント間の同期用に2つ)。これは制限されており、ネットワーク内のピアの数に依存しません。

個々の時点を使用するには、これにつながる時点のグラフが必要です。しかし、私の知る限り、することができる任意のピアを知っている時点では(それはそれ自体を生成し、または他のピアとそれを生成し、またはそれと同期するときに、別のピアによってそれを言われていた)しているにも持っていましたその時点までの歴史について知る機会。おそらくこれには帰納的証拠があると思います。

DAGの保存と同期は明示的に簡単に思えますが、これは実際に使用されていますか?そうでない場合、ベクタークロックが優先されるのはなぜですか?


ノート

ピアツーピア

クライアントサーバーソリューションよりもピアツーピアソリューションの方が望ましいです。

エンドトポロジとして考えられるのは、多数のクライアントが相互に複製するはるかに小さなサーバーグループに接続することです。ただし、この特定のトポロジを必要とするソリューションではなく、この特定のトポロジをサポートする一般的なソリューションがあると便利です。


私はあなたが言っていることを誤解しているかもしれませんが、状態に至るすべてのイベントのグラフがカウンタのベクトルよりも小さくなり得るかは不明です。非常に多くのノードと非常に少数の変更があるシステムを使用している場合を除きます。
kdgregory

ありがとう@kdgregory –良い点。将来的に3者間マージを計算できるようにするには、過去を知る必要があります(そして過去の時点のDAGを決定できる必要があります)。そのため、過去の時点を保存する場合、DAGを明示的に保存する方が安価です。これらの過去の時点を保存していない場合は、とにかくデータの3方向のマージを計算できません。–この3つの方法の要件が問題になるのではないかと思いますか?3ウェイが必要ない場合、おそらく明示的なDAGよりもベクトルクロックの方が良いでしょうか?
ベンジョン

これは@kdgregoryの重要なポイントになる可能性があるため、質問に少し追加しました。3ウェイマージを実行できると想定していますが、これはすべての履歴が既知であることも意味します。すべての履歴がわかっている場合は(明示的に)、明示的なDAGの方が安価です。履歴が切り捨てられる場合、ベクトルクロックの方がおそらくコストの低いアプローチです。
ベンジョン

1
ええ、ベクトルクロックの私の理解は、単に受け入れ/拒否の決定を目的としているということです。「ノードCはこのデータを更新しようとしていますが、ノードBの更新は認識していません」。
kdgregory

回答:


1

私が知る限り、GitやMercurialなどのバージョン管理システムは、ベクトルクロックではなくDAGアプローチを使用しています。


1
説明がなければ、他の誰かが反対意見を投稿した場合、この答えは役に立たなくなる可能性があります。たとえば、「GitやMercurialなどのPropversion制御システムはDAGアプローチではなくベクトルクロックを使用します」などのクレームを投稿した場合、この回答は読者が2つの反対意見を選ぶのにどのように役立ちますか?回答方法の品質基準を満たすために、より良い形状に編集することを検討してください。
gnat

2
私が質問を理解した方法で、彼らはベクトルクロックではなくDAGが使用されている実世界の例があるかどうか尋ねていました。
bikeman868

1
GitとMecurialはどちらもDAGを使用したピアツーピアの変更の同期の実世界の例です。
bikeman868

こんにちは@ bikeman868ネット0(ごめんなさい)に投票しました。不確実性に悩まされていても、あなたの答え役に立ちます!参照または信頼できる回答は常に素晴らしいですが、スタック交換はそれを強制しません!あなたの提案は、質問に対するコメントのポイントで意味があります。履歴を保存し、履歴をマージできるようにしたい場合は、DAGが適切です。履歴を保存せず、現在の状態の同期とコンセンサスが必要な場合は、ベクタークロックが必要です。
ベンジョン

1

コンセンサス問題を見てください。タスクの要件(データの量、同期ノードの数、頻度など)に応じて、その問題に対する既存のソリューション(「いかだ」など)がケースに適している場合があります。

この問題に対する別の(おそらく接線的)アプローチは、CRDTの設計です


Braid HTTPは、拡張HTTPを介してCRDTベースの状態同期プロトコルを作成しようとしています。Time DAGとSpace DAGの優れた視覚化と、これら2つの概念が相互に関連して最終的な一貫性を実現する方法があります。
デュアンJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.