Ilustrowany dowód twierdzenia CAP
twierdzenie CAP jest podstawowym twierdzeniem w systemach rozproszonych, które stwierdza, że każdy system rozproszony może mieć co najwyżej dwie z następujących trzech właściwości.
- spójność
- dostępność
- tolerancja partycji
ten przewodnik podsumuje specyfikację Gilberta i Lyncha oraz dowód twierdzenia o CAP za pomocą zdjęć!
co to jest twierdzenie CAP?
twierdzenie CAP mówi, że system rozproszony nie może być jednocześnie spójny, dostępny i tolerancyjny dla partycji. Brzmi prosto, ale co to znaczy być konsekwentnym? dostępny? partycja tolerancyjna? Co dokładnie masz na myśli mówiąc o systemie rozproszonym?
w tej sekcji przedstawimy prosty system rozproszony i wyjaśnimy, co oznacza dla niego dostępność, spójność i tolerancja partycji. Formalny opis systemu i trzech właściwości znajduje się w artykule Gilberta i Lyncha.
system rozproszony
rozważmy bardzo prosty system rozproszony. Nasz system składa się z dwóch serwerów, $g_1$ i $g_2$. Oba te serwery śledzą tę samą zmienną, $v$, której wartość początkowo wynosi $v_0$. $G_1$ i $g_2$ mogą komunikować się ze sobą, a także komunikować się z klientami zewnętrznymi. Oto jak wygląda nasz system.
klient może zażądać zapisu i odczytu z dowolnego serwera. Kiedy serwer otrzymuje żądanie, wykonuje dowolne obliczenia, które chce, a następnie odpowiada klientowi. Na przykład, oto jak wygląda zapis.
a oto jak wygląda odczyt.
teraz, gdy mamy już nasz system ustanowiony, przejdźmy nad tym, co to znaczy, aby system był spójny, dostępny i tolerancyjny dla partycji.
konsystencja
Oto jak Gilbert i Lynch opisują konsystencję.
każda operacja odczytu, która rozpoczyna się po zakończeniu operacji zapisu, musi zwrócić tę wartość lub wynik późniejszej operacji zapisu
w spójnym systemie, gdy klient zapisze wartość do dowolnego serwera i otrzyma odpowiedź, spodziewa się odzyskać tę wartość (lub świeższą wartość) z dowolnego serwera, z którego odczytuje.
oto przykład niespójnego systemu.
nasz klient zapisuje $v_1$ do $G_1$ i $g_1$ potwierdza, ale gdy czyta z $G_2$, otrzymuje przestarzałe dane: $v_0$.
z drugiej strony, oto przykład spójnego systemu.
w tym systemie, $G_1$ replikuje swoją wartość do $G_2$ przed wysłaniem potwierdzenia do klienta. Tak więc, gdy klient odczytuje z $G_2$, otrzymuje najbardziej aktualną wartość $v$: $v_1$.
dostępność
Oto jak Gilbert i Lynch opisują dostępność.
każde żądanie otrzymane przez niezaliczony węzeł w systemie musi skutkować odpowiedzią
w dostępnym systemie, jeśli nasz klient wyśle żądanie do serwera, a serwer nie zawiesił się, serwer musi ostatecznie odpowiedzieć na klienta. Serwer nie może ignorować żądań klienta.
tolerancja partycji
Oto jak Gilbert i Lynch opisują partycje.
sieć będzie mogła utracić dowolnie wiele wiadomości wysyłanych z jednego węzła do drugiego
oznacza to, że wszelkie wiadomości $g_1$ i $g_2$ wysyłane do siebie mogą zostać odrzucone. Gdyby wszystkie wiadomości były odrzucane, nasz system wyglądałby tak.
nasz system musi być w stanie działać poprawnie pomimo arbitralnych partycji sieciowych, aby był odporny na partycje.
dowód
teraz, gdy zapoznaliśmy się z pojęciem spójności, dostępności i tolerancji partycji, możemy udowodnić, że system nie może jednocześnie mieć wszystkich trzech.
Przyjmij za sprzeczność, że istnieje system, który jest spójny, dostępny i tolerancyjny dla partycji. Pierwszą rzeczą, którą robimy, jest partycjonowanie naszego systemu. Wygląda tak.
następnie nasz klient prosi o zapisanie $v_1$ do $G_1$. Ponieważ nasz system jest dostępny, $G_1$ musi odpowiedzieć. Ponieważ jednak sieć jest partycjonowana, $g_1$ nie może replikować swoich danych do $G_2$. Gilbert i Lynch nazywają tę fazę egzekucji $ \ alpha_1$.
następnie nasz klient wysyła żądanie odczytu do $G_2$. Ponownie, ponieważ nasz system jest dostępny, $G_2$ musi odpowiedzieć. A ponieważ sieć jest partycjonowana, $g_2$ nie może zaktualizować jej wartości z $g_1$. Zwraca $v_0$. Gilbert i Lynch nazywają tę fazę egzekucji $ \ alpha_2$.
$G_2$ zwraca$ v_0 $ do naszego Klienta po tym, jak klient napisał już $v_1$ do $G_1$. To jest niespójne.
założyliśmy, że istnieje spójny, dostępny, tolerujący partycje system, ale po prostu pokazaliśmy, że istnieje wykonanie dla każdego takiego systemu, w którym system działa niezgodnie. Tak więc taki system nie istnieje.