Jawne DAG zamiast Vector Clocks do synchronizacji

13

Zacząłem przyglądać się podejściom do synchronizacji danych między zestawami peerów. Uczestnicy muszą być w stanie pracować w sposób odłączony, a następnie synchronizować się ze sobą, aby scalić swoje lokalne zmiany.

Uczestnicy powinni mieć możliwość scalania lokalnych aktualizacji za pomocą „scalania trójstronnego” . Tak więc podczas synchronizacji rówieśnicy powinni wiedzieć, które fakty są nowsze, ale tam, gdzie nie ma ścisłego uporządkowania, powinni być w stanie połączyć fakty w oparciu o wspólny rdzeń.

Gdy niezależni partnerzy dokonują zmian, mogą „oznaczyć je czasem” za pomocą „zegara”. Używam terminów „zegar” i „znacznik czasu”, ale nie mam na myśli zegara ściennego. Mam na myśli pewnego rodzaju częściowe uporządkowanie wydarzeń, które wyjaśnia przyczynowość. Jest to „zdarzyło” relacji między wydarzeniami, które tworzy skierowany graf acykliczny (DAG).

Wydaje się, że „zwykłym” sposobem na zbudowanie tego częściowego uporządkowania jest użycie zegara wektorowego . Mogą one jednak stać się bardzo duże. Nowsze osiągnięcia, takie jak zegary drzewa interwałowego, zapewniają bardziej kompaktowe przechowywanie znaczników czasu.

Nie jestem wcale pewien, dlaczego protokoły synchronizacji najwyraźniej nie „po prostu” przechowują DAG jawnie. (A może oni?)

Uczestnicy mogą niezależnie tworzyć znacznik czasu, losowo generując UUID (lub innymi środkami, takimi jak <peer-name> + <local-monotonically-increasing-counter>). Kolejność tego znacznika czasu jest całkowicie jasna dla tego elementu.

Gdy 2 osoby synchronizują się ze sobą, mogą uzgodnić nowy znacznik czasu. Ponownie, porządek tego znacznika czasu jest jasny dla obu partnerów.

Istnieje teraz wymóg, aby zdarzenie miało miejsce przed DAG między równorzędnymi urządzeniami, ale wymagania dotyczące pamięci i przepustowości są niewielkie. Punkty czasowe są wierzchołkami wykresu. Jako takie mają 1 lub 2 przychodzące krawędzie (1 dla zdarzenia na kliencie i 2 dla synchronizacji między klientami). Jest to ograniczone i niezależne od liczby peerów w sieci.

Aby użyć indywidualnego punktu czasowego, potrzebujesz wykresu punktów czasowych, które do tego prowadzą. Jednakże, o ile widzę, każdy sieci peer, że jest w stanie wiedzieć o punkcie czasowym (nie przyniosła ona sama lub generowane go innym peer lub zostało mu go przez innego uczestnika podczas synchronizacji z nim) ma również miał okazja do poznania historii prowadzącej do tego momentu. Myślę, że jest na to prawdopodobnie indukcyjny dowód.

Biorąc pod uwagę, że przechowywanie i synchronizowanie DAG wyraźnie wydaje się proste: czy jest to stosowane w praktyce? Jeśli nie, dlaczego preferowane są zegary wektorowe?


Notatki

Peer to peer

Wolałbym rozwiązanie peer to peer zamiast rozwiązania typu klient-serwer.

Prawdopodobnie końcową topologią będzie wielu klientów łączących się ze znacznie mniejszą grupą serwerów, które replikują się między sobą. Byłoby jednak miło mieć ogólne rozwiązanie, które obsługuje tę konkretną topologię, niż rozwiązanie wymagające tej konkretnej topologii.

Benjohn
źródło
Być może nie rozumiem tego, co mówisz, ale nie jest jasne, w jaki sposób wykres wszystkich zdarzeń prowadzących do stanu może być mniejszy niż wektor liczników. Chyba że jesteś w systemie, który ma bardzo dużą liczbę węzłów i bardzo małą liczbę zmian.
kdgregory
Dzięki @kdgregory - dobry punkt. Aby móc w przyszłości obliczyć łączenie trójstronne, musisz znać przeszłość (i być w stanie określić DAG poprzednich punktów czasowych). Tak więc, jeśli przechowujesz te punkty czasu w przeszłości, jawne przechowywanie DAG jest tańsze. Jeśli nie przechowujesz tych przeszłych punktów czasowych, i tak nie możesz obliczyć trójstronnego scalenia danych. - Zastanawiam się, czy to może być ten wymóg trójstronny? Jeśli nie chcesz trójdrożny, być może zegary wektorowe lepiej niż wyraźny DAG?
Benjohn,
Myślę, że to może być kluczowy punkt @kdgregory, więc dodałem nieco więcej do tego pytania. Zakładam, że możliwe jest przeprowadzenie łączenia w 3 kierunkach, co oznacza również, że cała historia jest znana. Jeśli cała historia jest znana, to (jak sądzę) wyraźne DAG jest tańsze. Jeśli historia zostanie obcięta, zegary wektorowe są prawdopodobnie tańszym podejściem.
Benjohn,
1
Tak, rozumiem zegary wektorowe, ponieważ są one przeznaczone wyłącznie do podjęcia decyzji o zaakceptowaniu / odrzuceniu: „węzeł C próbuje zaktualizować ten kawałek danych, ale nie jest świadomy aktualizacji węzła B”.
kdgregory

Odpowiedzi:

1

O ile wiem, systemy kontroli wersji, takie jak Git i Mercurial, wykorzystują podejście DAG, a nie zegary wektorowe.

bikeman868
źródło
1
Bez wyjaśnienia odpowiedź ta może stać się bezużyteczna w przypadku, gdy ktoś inny wyrazi przeciwną opinię. Na przykład, jeśli ktoś opublikuje takie stwierdzenie, jak: „Systemy kontroli propozycji, takie jak Git i Mercurial, wykorzystują zegary wektorowe zamiast podejścia DAG” , to jak ta odpowiedź pomogłaby czytelnikowi wybrać dwie przeciwstawne opinie? Rozważmy zmienił ing go w lepszej formie, aby sprostać Jak Odpowiedź standardy jakości.
komar
2
W sposób, w jaki zrozumiałem pytanie, pytali, czy istnieją jakieś przykłady użycia DAG w świecie rzeczywistym, a nie zegary wektorowe.
bikeman868,
1
Zarówno Git, jak i Mecurial są przykładami rzeczywistej synchronizacji zmian peer-to-peer za pomocą DAG i mam nadzieję, że Benjohn uzna moją odpowiedź za pomocną, mimo że ją głosowałeś.
bikeman868,
Cześć @ bikeman868 Głosowałem za 0 netto (przepraszam). Twoja odpowiedź jest pomocna, nawet jeśli jest niepewna! Podczas gdy referencje lub autorytatywne odpowiedzi są zawsze miłe, wymiany stosów tego nie nakazują! Twoja sugestia ma sens z punktami w komentarzach do pytania. Wydaje się, że jeśli chcesz przechowywać historię i móc łączyć historie, wtedy odpowiedni jest DAG. Jeśli nie przechowujesz historii i chcesz synchronizacji i konsensusu w sprawie bieżącego stanu, to zegary wektorowe są tym, czego potrzebujesz.
Benjohn,
1

Spójrz na problem konsensusu . W zależności od wymagań zadania (liczby posiadanych danych, liczby węzłów synchronizujących, częstotliwości itp.) Istniejące rozwiązania tego problemu (takie jak „Raft”) mogą być odpowiednie dla danego przypadku.

Innym (być może stycznym) podejściem do tego problemu jest zaprojektowanie CRDT .

battlmonstr
źródło
Braid HTTP próbuje utworzyć oparty na CRDT protokół synchronizacji stanu za pomocą rozszerzonego protokołu HTTP. Mają świetną wizualizację Time DAG i Space DAG oraz sposób, w jaki te dwie koncepcje są ze sobą powiązane, aby osiągnąć ostateczną spójność.
Duane J,
-1

Protokół Aleph to bezcelowy protokół p2p, który buduje rozproszone DAG zestawów transakcji (lub zdarzeń) w drodze konsensusu

https://arxiv.org/pdf/1908.05156

ferranpujolcamins
źródło
Powinieneś rozwinąć swoją odpowiedź, aby pokazać, w jaki sposób przywoływany protokół rozwiązuje problemy poruszone w pierwotnym pytaniu. Ważne jest, aby odpowiedzi były samowystarczalne, ponieważ przynosi to korzyści wszystkim, którzy napotkają to pytanie.
BobDalgleish