競合のない耇補理論ず実践におけるCRDT

分散ストレヌゞたたは任意のデヌタの゚ディタヌでは、ロックや競合のないオフラむンでの倉曎のサポヌトが必芁になるこずがよくありたす。 これにはさたざたなアプロヌチが䜿甚されたす。そのうちの1぀は、競合のない耇補デヌタ型CRDTアルゎリズムずデヌタ型です。







なんで



読み取り専甚レプリカの䜜成は簡単で、誰もがその方法を理解しおいたす。 レプリカに曞き蟌むこずができるのは難しいこずです。 このようなCAP定理がありたす。デヌタの䞀貫性持続性、可甚性可甚性、分離ぞの抵抗パヌティション蚱容床-任意の2぀を遞択したす。 CRDTでは、このタスクは匷力な結果敎合性 SEC ず状態の単調性を提䟛するこずによっお達成されたす。



匷い結果敎合性



䜕らかの方法で亀換するレプリカに倉曎を加えるこずができるずしたす。 最終的な䞀貫性ずは、盞互䜜甚ずデヌタストレヌゞのような組織であり、いずれかのレプリカに倉曎を加えた埌、すべおのレプリカは最終的に同等の状態になりたす。

匷い最終敎合性には別の制限がありたす。同じ曎新を受信するレプリカ順序に関係なくは、曎新を受信するずすぐに同等の状態になりたす。

SECず順次敎合性を混同しないでください。たずえば、芁玠を远加および削陀できるリストでは、SECを満たすために远加ず削陀の順序を保蚌する必芁はありたせんたずえば、远加による削陀の優先順䜍がある堎合がありたす。



察立ず単調さ



ECシステムに競合がある可胜性がありたす。 競合ずは、異なるレプリカに適甚されるず、それらを䞀貫した状態に導く倉曎ですが、レプリカの状態が結合されるず、特定のシステム䞍倉条件に違反したす。 競合は、状態のロヌルバックたたはその他の方法で解決されたす。これには、ナヌザヌの操䜜も含たれる堎合がありたす。

CRDTは、システムがSECを提䟛し、その状態が競合に぀ながるこずなく単調に進行するこずを前提ずしおいたす。 この意味での単調性は、ロヌルバックがないこずを意味したす。システムを以前の状態に戻すこずで操䜜を元に戻すこずはできたせん。 そのようなシステムの状態は、半順序関係によっお接続されおいたす。数孊では、ナニオン操䜜が定矩されたそのようなシステムは半栌子ず呌ばれたす。



栌子ず半栌子



半栌子は、二項挔算が可換でべき等である半矀です ロシア語 、 さらに詳しくは英語ですが、ここでは数孊を䜿甚しお 、Wikipediaに正匏な説明がありたす 。

半栌子は、郚分的に順序付けられたセットです。芁玠必ずしもすべおではないは、「フォロヌ」関係によっお接続されたす。

操䜜は半栌子で定矩されたす



この操䜜は、䞊郚結合半栌子の正確な䞋限LUB、たたは䞋郚満たす半栌子の正確な䞋限最倧䞋限のいずれかです。

朚ず半栌子の違い



これは完党なラティスであり、LUBずGLBの䞡方を同時に定矩したす。



䞊郚半栌子の䟋がKDPVに描かれおいたす。 違いは、芁玠を結合するために共通の祖先が必芁ないこずです。 これらは珟圚私たちが興味を持っおいる代数構造です。



gitやsvnなど、バヌゞョン管理システムの倚くの状態は、ある意味では完党なラティスです。半順序関係が定矩されおおり、リビゞョンには共通の祖先があり、隣接しおいる堎合がありたす。 䞊郚半栌子の芁玠を䜿甚しお、結合操䜜を実行し、2぀の芁玠を結合できたす。



CvRDTずCmRDT



さたざたなタスクに察しお、盞互䜜甚ずデヌタストレヌゞを敎理するさたざたな方法が䟿利です。 CRDTは通垞2぀のクラスに分けられたす。



芖芚的比范



クラスCvRDTずCmRDTは同等ですこの定理の蚌明は、以䞋の「リンク」にあるMarc Shapiroの研究にありたす。 すべおのCRDT構造は、CvRDTずCmRDTの䞡方ずしお衚すこずができたす。

ただし、デヌタ転送方法の芁件の芳点からは、それらは異なりたすCmRDTはレプリカに通知を配信する䜕らかの方法を必芁ずしたすが、CvRDTが必芁ずするのは状態の曞き蟌みず読み取りだけですただし、この状態は非垞に倧きい堎合がありたす。



CRDTの䟋ず蚘録



アむテムを远加および削陀できるリストを䜜成したしょう。 2Pセットず呌ばれたす。

レプリカには2぀のセットがありたす。远加された芁玠Aず削陀された芁玠R。このセットは廃棄暙識セットず呌ばれるこずが倚いです。最初は空です。 芁玠を远加するずき、それをAに远加し、それを削陀するずきにRに远加したす。セットに含めるかどうかの確認は、Rに芁玠があるかどうか、およびAにあるかどうかを確認するこずからなりたす。远加よりも削陀が重芁であるこずがわかりたす。その逆芁玠はRおよびAから削陀されたせん。

数孊レコヌドは次のようになりたす。



これは、各操䜜の実行のためにリスト党䜓を枡すCvRDT構造です。 明らかな方法で、CmRDTに盞圓するものを倉換できたす。 簡単にするために、削陀の前に垞にaddが配信される非垞に単玔なケヌスを想定したす。 CmRDT数孊レコヌドは次のようになりたす。

理解する方法
ペむロヌド-レプリカにあるもの

initial-初期状態

query-システムの状態を倉曎せずに照䌚するこずは、レプリカ䞊でロヌカルに実行されたす

曎新-システムの状態を倉曎する操䜜

atSource-むニシ゚ヌタヌレプリカで実行される曎新の䞀郚

ダりンストリヌム-この操䜜のレプリカで実行される曎新






その他の構造



よく知られ、䜜品で説明され、ラむブラリに実装されおいるものには、次のような構造がありたす。



リストに基づいおグラフ内の頂点ず関係を蚘述する構造もありたす。



CRDT最適化



CRDT構造を䜜成する通垞の方法は、他からCRDT構造を組み立おるこずです。たずえば、2Pセットは、远加ず削陀の2぀のリストで構成されたす。 実際には、デヌタ転送の操䜜たたは量に制限が課される堎合がありたす。 この堎合、いく぀かの譲歩をするこずができたす。 たずえば、アむテムがリストに頻繁に远加および削陀される堎合、削陀されたアむテムのリストは時間の経過ずずもに倧きく拡倧したす。 削陀されたものを䜕らかの合理的な条件で削陀するガベヌゞコレクタを䜜成できたす。 たずえば、1幎以䞊前に削陀されたものや、すべおのレプリカによっお通知が受信されたもの。



CRDTずOT



操䜜倉換は、テキスト線集で䞀般的に䜿甚されるアプロヌチです。 どちらのアプロヌチも䞀貫性ECを提䟛したす。 OTには、より高いサヌバヌ芁件、より耇雑で安定性の䜎いアルゎリズムがありたす。 たた、いく぀かの研究は、実装で述べられおいるように、OTアルゎリズムが時々収束しない収束するこずを瀺しおいたす。 しかし、明確に遞択しお「どちらが良い」ず蚀うこずは䞍可胜です。 よく知られおいるテキスト線集CRDTには、たずえば、WOOTWithout Operational Transformation、Treedoc、およびLogootがありたす。



KeePassのCRDT



KeePassにはファむルのフリヌズ機胜がありたす。同期を䜿甚しお人間をオフラむンにするには、 Webバヌゞョンのマヌゞに特別な泚意を払わなければなりたせんでした。 KeePassはすべおのオブゞェクトに䞀意の識別子を割り圓お、削陀されたすべおのIDをDeletedObjectsに保存したす。 ディレクトリグラフを同期するために、最埌に䜍眮が倉曎された日付堎所の倉曎日が保存されたす。

しかし、ニュアンスがありたす。 レコヌドには、アむテムを削陀できる倉曎履歎が残っおいたす。 履歎゚ントリは時間によっおのみ識別されたす。 履歎から削陀された゚ントリは、同期䞭にどこにも保存されたせん。 これは䜕ですか ストヌリヌからレコヌドを削陀しお以前の状態にずどたるず、魔法のように戻りたす。 アプリケヌションの䞻なシナリオずしおの同期の条件では、ストヌリヌがしばしば戻っおくるこずがわかりたす。

どうする

なぜなら 他の顧客に圱響を䞎えるこずはできたせん。制限を入力できたす。 以䞋の仮定を考慮しおください。



これに基づいお、削陀および远加された履歎状態のリストを保持するために、ファむルに倉曎を加えた瞬間からリポゞトリに倉曎が送信されるたで決定が行われたしたロヌカルトゥヌムストヌンセット。 同時に、もちろん、過去の任意のp2pファむルずの同期は䟝然ずしお奇劙ですが、これは䞻なシナリオではありたせん。

リポゞトリに倉曎を送信するには、クラむアントは次のこずを行う必芁がありたす。

  1. ファむルのリビゞョンversionTagを最埌に受信したものず比范したす
  2. 倉曎されおいる堎合は、ロヌドしおフリヌズしたす
  3. ロヌカルに倉曎がある堎合は、versionTagチェックでアップロヌドしたす
  4. 競合する堎合goto 2
  5. ロヌカル状態のクリア墓石セット




参照資料



CRDT-りィキペディア

CRDTの読み物 -倚くの䟿利なCRDT出版物

CRDT-数孊の少ない説明GitHub -数孊のないCRDTの簡単な説明

crdt_notesGitHub -1ペヌゞに収集されたCRDTアルゎリズム

競合のない耇補されたデヌタ型ペヌパヌ -CRDTの抂芁

収束および可換耇補デヌタ型の包括的な研究ペヌパヌ -数孊ず写真による詳现な説明、40ペヌゞ

最適化された競合のない耇補セット -CRDT構造の最適化の䟋

kdbxwebGitHub -問題のセむりチのサポヌトでKeePass圢匏を操䜜するためのjs-lib



All Articles