web-dev-qa-db-ja.com

分散システムのCRDTとは何ですか?

私は分散システムの初心者であり、CRDTの概念についての洞察を得ようとしています。私はそれが3つの表記法を持っていることを理解しています:

Conflict-free Replicated Data Type
Convergent Replicated Data Type
Commutative Replicated Data Type

分散システムでCRDTを使用する例を誰かに教えてもらえますか?よろしくお願いします。

17
fnaticRC ggwp

CRDTは、マーク・シャピロの作品に触発されています。分散コンピューティングでは、競合のないレプリケートされたデータ型(略してCRDT)は、強力な結果整合性(SEC)と単調性(ロールバックがない)を実現するために使用される特別に設計されたデータ構造の一種です。 SECを確保するには、運用ベースのCRDTと状態ベースのCRDTの2つの代替ルートがあります。

異なるレプリカのCRDTは互いに分岐する可能性がありますが、最終的には安全にマージして結果整合性のある値を提供できます。言い換えると、CRDTには、べき等で可換で連想的なマージ方法があります。

一方が他方をエミュレートできるため、2つの選択肢は同等ですが、操作ベースのCRDTには、通信ミドルウェアからの追加の保証が必要です。 CRDTは、ネットワーク内の複数のコンピューター間でデータを複製するために使用され、リモート同期を必要とせずに更新を実行します。これにより、従来の結果整合性テクノロジを使用するシステムでマージの競合が発生しますが、CRDTは、競合が数学的に不可能になるように設計されています。 CAP定理の制約の下で、それらは利用可能な/パーティショントレラント(AP)設定に対して最も強力な一貫性の保証を提供します。

それらが使用されるいくつかの例

RiakはCRDTの最も人気のあるオープンソースライブラリであり、Bet365とLeague ofLegendsで使用されています。以下は、Riakをサポートするいくつかの便利なリンクです。

1- Bet365(ErlangとRiakを使用) http://www.erlang-factory.com/static/upload/media/1434558446558020erlanguserconference2015bet365michaelowen.pdf

2-League of Legendsは、ゲーム内チャットシステムにRiak CRDT実装を使用しています(750万人の同時ユーザーと1秒あたり11,000件のメッセージを処理します)

3-LWWタイムスタンプセットをサポートするSoundCloudによって実装されたRoshi:-ブログ投稿: https://developers.soundcloud.com/blog/roshi-a-crdt-system-for-timestamped-events ==

24
Metin Dagcilar

CRDTは、Mathを使用して、コンセンサスおよび関連するレイテンシー/可用性を心配することなく、分散クラスター全体で一貫性を確保します。

CRDTがいつでも取ることができる値のセットは、半束(具体的には結合半束)のカテゴリに分類されます。これは、最小上限関数(LUB)を持つPOSET(半順序集合)です。

簡単に言うと、POSETは、すべてが比較できるわけではないアイテムのコレクションです。例えば。ペアの配列:{(2,4), (4, 5), (2, 1), (6, 3)}(2,4)は<(4,5)ですが、(6,3)と比較することはできません(一方の要素が大きく、もう一方の要素が小さいため) 。さて、半束は2つのペアが与えられたPOSETであり、2つを比較できなくても、両方よりも大きい要素(LUB)を見つけることができます。

もう1つの条件は、このデータ型の更新を増やす必要があることです。CRDTの状態は単調に増加し、クライアントは状態のロールバックを監視しません。

この 優れた記事 例として上記で使用した配列を使用します。これらの値を維持するCRDTの場合、2つのレプリカが(4,5)(6,3)の間でコンセンサスを達成しようとすると、LUB = (6,5)をコンセンサスとして選択し、両方のレプリカを割り当てることができます。値が増加しているので、これは落ち着くのに良い値です。

CRDTがレプリカ間で相互に同期を維持するには、2つの方法があります。定期的に状態を転送する方法(収束複製データ型)、または更新(デルタ)を取得するときに転送する方法(可換複製データ型)です。前者はより多くの帯域幅を必要とします。

SoundCloudの Roshi は良い例です(開発中はもうないようですが)、タイムスタンプに関連付けられたデータを格納します。タイムスタンプは明らかに増加しています。タイムスタンプが保存されているタイムスタンプ以下の更新は破棄されます。これにより、べき等性(繰り返しの書き込みはOK)と可換性(順不同の書き込みはOK)が保証されます。可換性はa=b means b=aで、この場合はupdate1を意味します。続いてupdate2は、update2の後にupdate1が続くのと同じです)

書き込みはすべてのクラスターに送信され、速度の低下やパーティションなどの問題が原因で特定のノードが応答しない場合、後でread-repairを介して追いつくことが期待されます。これにより、値が確実に収束します。コンバージェンスは、前述のように、状態または更新を他のレプリカに伝播する2つのプロトコルを介して実現できます。老師が前者をやっていると思います。レプリカはread-repairの一部として状態を交換し、データは半束プロパティに準拠しているため、収束します。

PS。 CRDTを使用するシステムは、結果整合性があります。つまり、 CAP定理 でAP(高可用性およびパーティショントレラント)を採用します。

この主題に関するもう1つの優れた読み物。

10
Siddhartha

頭字語のこれらの3つの拡張はすべて、基本的に同じことを意味します。

異なるシーケンスで適用された同じ操作が同じ結果を生成(収束)する場合、CRDTは収束します。つまり、操作は可換である可能性があります-それは可換RDTです。操作を別の順序で適用しても同じ結果が得られる理由は、操作に競合がないためです。

つまり、CRDTは、使用する3つの拡張のどちらでも同じことを意味しますが、個人的には「収束」を好みます。

2
cliffordheath