2

私はCvRDTを読んでいて、Riak がすでにRiak 2にいくつか追加していることを知っています。

私の質問は:すべてのオブジェクトに関連付けられてgcounterいる基盤が同じ情報を記録しているように聞こえるのに、なぜ Riak は を実装するのでしょうか? 結果は、それぞれが同じ重要な情報を含む で保存されvclockませんか?gcountervclock

vclocks現時点での唯一の推測は、Riak がの目的で実際に重要なトリミング情報gcounter(つまり、インクリメントの数) をガベージ コレクションする可能性があるということです。

私は Erlang を特によく読めないので、Riakvclocksがこれらの特殊なケースのデータ型を格納していると誤って想定していたのかもしれません。ただし、問題は、標準の Riak の上に記述された自家製のソリューションvclocksにも当てはまります (したがって、永続化された各オブジェクトを継承します)。

編集:

それ以来、CvRDT をより実用的な方法で説明するために、次の記事を書きました。この記事では、上記で強調した冗長性についても触れています。

Conflict-free Replicated Data Types (CRDT) - 数学の少ないわかりやすい説明。

4

2 に答える 2

4
  1. Riak はバージョン ベクトルを刈り込みます。因果関係 (誤った並行性、兄弟の増加、安全) については大した問題ではありませんが、カウンターにとっては災難です。

  2. Riak の CRDT サポートは一般的です。通常の riak オブジェクト内に CRDT を「隠します」。

  3. Riak の CRDT サポートは最初の段階にあり、今後のリリースに合わせてさらに最適化していきます。

ところで、このような質問のための素晴らしいメーリング リストがあります。Stack Overflow には用途がありますが、オープン ソース DB の作成者と話をしたい場合は、彼らのリストを使用してみませんか? Riak はオープン ソースなので、プル リクエストを送信できます。あなたのアイデアをコード ベースに取り入れたいと思っています。

于 2014-02-11T07:54:10.227 に答える
2

簡単な回答: Riak のカウンターは実際には PN-Counter です。つまり、インクリメントとデクリメントの両方を許可するため、vclock のように実装することはできません。インクリメントとデクリメントを別々に追跡する必要があるからです。

長い答え:

この質問は、g-counter とベクトル クロック (またはバージョン ベクトル) の違いを完全に誤解していることを示唆しています。

ベクトル クロック (vclock) は、データの同時更新の因果関係を追跡するためのシステムです。{アクター => 論理クロック} のマップです。アクターは、関連付けられているデータが変更された場合にのみ論理クロックをインクリメントし、インクリメントをできるだけ少なくしようとします (つまり、更新ごとに最大 1 回)。2 つの vclock を同時に使用することも、一方が他方を支配することもできます。

g-counter は、vclock と同じ構造に見える CvRDT ですが、重要な違いがあります。それらは {actor => counter} のマップとして実装されます。アクターは自分のカウンターを好きなだけインクリメントできます。g-counter には「カウンター値」の概念と「マージ」の概念があるため、異なるアクターによって同時操作が実行されたときに、実際の「カウンター値」がどうあるべきかを判断できます。

重要なことに、g カウンターは因果関係を追跡できず、vclock は「カウンター値」が何であるかを認識できません。

コードベースで 2 つを混同すると、混乱するだけでなく、エラーが発生する可能性もあります。

riak が実際に pn-counters を実装しているという事実にこれを追加してください。違いは、g カウンターはインクリメントのみが可能ですが、pn カウンターはインクリメントとデクリメントの両方が可能であることです。Pn カウンターは、{actor => (インクリメント カウント、デクリメント カウント)} のマップとして機能します。これは明らかに vclock とは異なる構造を持っています。これらのカウントを両方ともインクリメントすることしかできないため、1 つだけでなく 2 つあるのはなぜですか。

于 2014-02-11T02:14:15.403 に答える