Często słyszę o ostatecznej spójności w różnych wypowiedziach na temat NoSQL, siatek danych itp. Wydaje się, że definicja ostatecznej spójności różni się w wielu źródłach (a może nawet zależy od konkretnego przechowywania danych).
Czy ktoś może w prosty sposób wyjaśnić, czym jest ostateczna spójność w ujęciu ogólnym, niezwiązanym z żadnym konkretnym przechowywaniem danych?
Odpowiedzi:
Ostateczna spójność:
W końcu wszyscy kelnerzy (ty, ja, twój sąsiad) znają prawdę (że jutro będzie padać), ale w międzyczasie klient (jego żona) wyszedł, myśląc, że będzie słonecznie, mimo że zapytała po tym, jak jeden lub więcej serwerów (ty i ja) miał bardziej aktualną wartość.
W przeciwieństwie do ścisłej spójności / zgodności z ACID:
W żadnym momencie saldo nie może odzwierciedlać niczego innego niż faktyczna suma wszystkich transakcji dokonanych na koncie do tego dokładnego momentu.
Powód, dlaczego tak wiele systemów NoSQL mieć ewentualne spójności jest to, że praktycznie wszystkie z nich są przeznaczone do dystrybucji, a także z systemami w pełni rozproszonych jest na górze super-liniowy do utrzymywania ścisłej spójności (czyli można skalować tylko tak daleko, zanim wszystko zaczyna zwalniać w dół, a kiedy to zrobią, musisz rzucić wykładniczo więcej sprzętu na problem, aby utrzymać skalowanie).
źródło
Ostateczna spójność:
Zasadniczo, ponieważ replikacja danych na wielu serwerach zajmuje trochę czasu, żądania odczytu danych mogą trafiać na serwer z nową kopią, a następnie na serwer ze starą kopią. Termin „ewentualne” oznacza, że ostatecznie dane będą replikowane na wszystkie serwery, a zatem wszystkie będą miały aktualną kopię.
Ostateczna spójność jest koniecznością, jeśli chcesz odczytywać z niewielkimi opóźnieniami, ponieważ serwer odpowiadający musi zwrócić własną kopię danych i nie ma czasu na konsultowanie się z innymi serwerami i osiągnięcie wzajemnego porozumienia w sprawie zawartości danych. Napisałem post na blogu, wyjaśniając to bardziej szczegółowo.
źródło
Myślisz, że masz aplikację i jej replikę. Następnie musisz dodać nową pozycję danych do aplikacji.
Następnie aplikacja synchronizuje dane z inną repliką pokazaną poniżej
W międzyczasie nowy klient otrzyma dane z jednej repliki, która nie jest jeszcze aktualizowana. W takim przypadku nie może uzyskać poprawnych aktualnych danych. Ponieważ synchronizacja zajmuje trochę czasu. W takim przypadku ostatecznie nie jest to spójne
Problem w tym, jak możemy ostatecznie osiągnąć spójność ?
W tym celu używamy aplikacji mediatora do aktualizacji / tworzenia / usuwania danych i używamy bezpośredniego zapytania do odczytu danych. które pomagają ostatecznie uzyskać spójność
źródło
Kiedy aplikacja dokonuje zmiany w elemencie danych na jednym komputerze, zmiana ta musi zostać propagowana do innych replik. Ponieważ propagacja zmiany nie jest natychmiastowa, istnieje przedział czasu, w którym niektóre kopie będą miały ostatnią zmianę, a inne nie. Innymi słowy, kopie będą wzajemnie niespójne. Jednak ostatecznie zmiana zostanie rozpowszechniona we wszystkich kopiach, stąd termin „ostateczna spójność”. Termin ostateczna spójność jest po prostu potwierdzeniem, że istnieje nieograniczone opóźnienie w propagowaniu zmiany dokonanej na jednym komputerze do wszystkich pozostałych kopii. Ostateczna spójność nie jest znacząca ani istotna w systemach scentralizowanych (pojedyncza kopia), ponieważ nie ma potrzeby propagowania.
źródło: http://www.oracle.com/technetwork/products/nosqldb/documentation/consistency-explained-1659908.pdf
źródło
Prostym językiem angielskim możemy powiedzieć: Chociaż twój system może znajdować się w niespójnych stanach, celem jest zawsze osiągnięcie spójności w pewnym momencie dla każdego elementu danych.
źródło
Ostatecznie spójność oznacza, że propagacja zmian wymaga czasu, a dane mogą nie być w tym samym stanie po każdym działaniu, nawet w przypadku identycznych działań lub transformacji danych. Może to spowodować bardzo złe rzeczy, gdy ludzie nie wiedzą, co robią podczas interakcji z takim systemem.
Nie wdrażaj magazynów danych dokumentów o znaczeniu krytycznym, dopóki dobrze nie zrozumiesz tej koncepcji. Zepsucie implementacji magazynu danych dokumentu jest znacznie trudniejsze do naprawienia niż model relacyjny, ponieważ podstawowych rzeczy, które mają zostać schrzanione, po prostu nie można naprawić, ponieważ rzeczy, które są wymagane, aby to naprawić, po prostu nie występują w ekosystemie. Refaktoryzacja danych magazynu pokładowego jest również znacznie trudniejsza niż proste przekształcenia ETL w RDBMS.
Nie wszystkie magazyny dokumentów są takie same. Niektóre obecnie (MongoDB) obsługują pewnego rodzaju transakcje, ale migracja magazynów danych jest prawdopodobnie porównywalna z kosztem ponownej implementacji.
OSTRZEŻENIE: Programiści, a nawet architekci, którzy nie znają lub nie rozumieją technologii przechowywania danych dokumentów i boją się przyznać, że z obawy przed utratą pracy, ale zostali klasycznie przeszkoleni w zakresie RDBMS i znają tylko systemy ACID (jak bardzo może to być ?), a kto nie zna technologii lub nie ma czasu, aby się jej nauczyć, będzie tęsknił za zaprojektowaniem magazynu danych dokumentów. Mogą również spróbować użyć go jako RDBMS lub do rzeczy takich jak buforowanie. Rozbiją to, co powinno być atomowymi transakcjami, które powinny operować na całym dokumencie, na „relacyjne” części, zapominając, że replikacja i opóźnienie to rzeczy, lub, co gorsza, wciągając systemy stron trzecich w „transakcję”. Zrobią to, aby ich RDBMS mógł odzwierciedlać ich jezioro danych, bez względu na to, czy zadziała, czy nie, i bez testowania, ponieważ wiedzą, co robią. Wtedy będą zaskoczeni, gdy złożone obiekty przechowywane w oddzielnych dokumentach, takich jak „zamówienia”, będą miały mniej „pozycji zamówienia” niż oczekiwano, a może wcale. Ale nie będzie się to zdarzać często lub na tyle często, że po prostu maszerują naprzód. Mogą nawet nie napotkać problemu w rozwoju. Następnie, zamiast przeprojektowywać, będą rzucać „opóźnienia”, „ponowienia” i „sprawdzenia”, aby sfałszować relacyjny model danych, który nie zadziała, ale zwiększy złożoność bez żadnych korzyści. Ale teraz jest już za późno - rzecz została wdrożona i teraz firma na niej działa. Ostatecznie cały system zostanie wyrzucony, a dział zostanie zlecony na zewnątrz, a ktoś inny będzie go utrzymywał. Nadal nie będzie działać poprawnie, ale mogą zawieść mniej kosztownie niż obecna awaria.
źródło
Ostateczna spójność przypomina bardziej widmo. Z jednej strony masz silną konsekwencję, az drugiej ostateczną konsekwencję. Pomiędzy są poziomy, takie jak Migawka, przeczytaj moje pisma, ograniczona nieaktualność. Doug Terry ma piękne wyjaśnienie w swoim artykule na temat ostatecznej konsekwencji w baseballu .
Według mnie ostateczna spójność to po prostu tolerancja na losowe dane w losowej kolejności za każdym razem, gdy czytasz z magazynu danych. Wszystko lepsze niż to jest silniejszym modelem spójności. Na przykład migawka zawiera nieaktualne dane, ale zwróci te same dane, jeśli zostanie ponownie odczytana, więc jest przewidywalna. Czasami aplikacja może tolerować dane, które są nieaktualne przez określony czas, po przekroczeniu którego wymaga spójnych danych.
Jeśli spojrzysz na znaczenie spójności, odnosi się ona bardziej do jednolitości lub braku odchyleń. Zatem w kategoriach niezwiązanych z systemem komputerowym może to oznaczać tolerancję na nieoczekiwane zmiany. Można to bardzo dobrze wyjaśnić za pomocą bankomatu. Bankomat może być w trybie offline, co może odbiegać od salda konta w systemach podstawowych. Istnieje jednak tolerancja dla pokazywania różnych sald w określonym przedziale czasu. Gdy bankomat przejdzie do trybu online, może zsynchronizować się z podstawowymi systemami i zachować tę samą równowagę. Można więc powiedzieć, że bankomat jest ostatecznie spójny.
źródło