Operation-based and state-based CRDTs#

オペレーションベースのCRDTタイプCmCRDT#

操作は明示的に転送されないが、リモートノードから受け取った古い行と新しい行から計算されるため、操作ベースの型の実装は簡単です。

現在、次のオペレーションベースのCRDTが実装されています。

  • デルタカウンター `crdt_delta_counter <デルタカウンター crdt_delta_counter>` - bigint カウンターインクリメント/デクリメント

  • デルタサム `crdt_delta_sum <デルタサム crdt_delta_sum>` - numeric sumインクリメント/デクリメント

これらの型は、デルタを計算する少しのコードで既存のデータ型を活用します。たとえば、 crdt_delta_counter はbigint 上のドメインです。

このアプローチは、デルタを計算する方法が知られている型でのみ可能ですが、結果はシンプルで安価、スペースとCPUの両方の点で、いくつかの追加の利点があります。たとえば、基になるデータ型の演算子/構文を活用できます。

主な欠点は、非同期コンカレント環境ではこの値を確実にリセットできないことです。

注釈

カスタムデータタイプを作成し、状態と最後のオペレーションを保存することにより、より複雑なオペレーションベースのタイプを実装できます。すべての変更はデコードされて転送されるため、複数の操作は必要ありません。しかし、その時点で、主な利点単純さ、既存のデータ型の再利用などは、領域要件を除き、状態ベースの型たとえば、まだリセット機能と比較して利点を得ることなく失われます。ノードごとの状態は必要ありません。

状態ベースのCRDTタイプCvCRDT#

状態ベースの型は、より複雑な内部状態を必要とするため、操作ベースの型のように通常のデータ型を直接使用できません。

現在、4つの状態ベースのCRDTが実装されています。

  • Grow専用カウンター `crdt_gcounter <Grow専用カウンター crdt_gcounter>` - bigint カウンターインクリメント専用

  • Grow-only sum `crdt_gsum <Grow-only sum crdt_gsum>` - numeric sum/counter インクリメントのみ

  • ポジティブネガカウンター `crdt_pncounter <ポジティブネガカウンター crdt_pncounter>` - bigint カウンターインクリメント/デクリメント

  • 正負の合計`crdt_pnsum <正負の合計`crdt_pnsum`>` - numeric sum/counter インクリメント/デクリメント

内部状態には通常、ノードごとの情報が含まれるため、ディスク上のサイズは増加しますが、追加の利点が得られます。カスタムデータ型を実装する必要があるということは、より多くのコードin/outファンクションと演算子を意味します。

利点は、値を確実にリセットする機能、変更が失われた場合のある程度の自己修復性正常に動作するクラスターでは発生しません、およびソースノード以外のノードから変更を受信できる機能です。

たとえば、ノードAで値が変更され、変更はBにレプリケートされますが、AとC間のネットワークの問題によりCにレプリケートされません。 Bが値を変更し、この変更がCにレプリケートされる場合、それにはAからの元の変更。オペレーションベースのCRDTを使用すると、A-Cネットワーク接続が再び動作し始めるまで、ノードCは変更を受信しません。

CvCRDTの主な欠点は、 状態ベースのCRDTディスク領域要求 の点でコストが高いことです。クラスターから既に削除されたノードを含む、ノードごとに少しの情報が必要です。状態varlenaタイプにシリアル化の複雑な性質は、CPU使用量の増加を意味します。