{"id":37335,"date":"2019-10-31T22:17:01","date_gmt":"2019-10-31T19:17:01","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah\/"},"modified":"2019-10-31T22:17:01","modified_gmt":"2019-10-31T19:17:01","slug":"kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","title":{"rendered":"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wyobra\u017amy sobie. W pokoju jest 5 kot\u00f3w zamkni\u0119tych, i aby obudzi\u0107 swojego w\u0142a\u015bciciela, musz\u0105 si\u0119 wszyscy razem porozumie\u0107, poniewa\u017c drzwi mog\u0105 otworzy\u0107 tylko pi\u0119cioro z nich opieraj\u0105c si\u0119 na nich. Je\u015bli jeden z kot\u00f3w to kot Schrodingera, a pozosta\u0142e koty nie wiedz\u0105 o jego decyzji, pojawia si\u0119 pytanie: \u201eJak mog\u0105 to zrobi\u0107?\u201d <\/p>\n<p>W tym artykule w przyst\u0119pny spos\u00f3b om\u00f3wi\u0119 teoretyczne podstawy \u015bwiata system\u00f3w rozproszonych oraz zasady ich dzia\u0142ania. Zajm\u0119 si\u0119 tak\u017ce powierzchownie g\u0142\u00f3wn\u0105 ide\u0105 le\u017c\u0105c\u0105 u podstaw Paxosa. <\/p>\n<p><img decoding=\"async\" alt=\"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach\" src=\"\/wp-content\/uploads\/2019\/08\/17c1edb1fca739d29dc4922bbbe820ce.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKiedy programi\u015bci korzystaj\u0105 z chmur obliczeniowych, r\u00f3\u017cnych baz danych i pracuj\u0105 w klastrach z du\u017c\u0105 liczb\u0105 w\u0119z\u0142\u00f3w, s\u0105 pewni, \u017ce dane b\u0119d\u0105 integralne, bezpieczne i zawsze dost\u0119pne. Ale sk\u0105d te gwarancje?<\/p>\n<p>W zasadzie gwarancje, kt\u00f3re mamy, to gwarancje dostawcy. S\u0105 one opisane w dokumentacji mniej wi\u0119cej w ten spos\u00f3b: \u201eTa us\u0142uga jest wystarczaj\u0105co niezawodna, ma okre\u015blony SLA, nie martw si\u0119, wszystko b\u0119dzie dzia\u0142a\u0107 rozproszono tak, jak oczekujesz.\u201d <\/p>\n<p>Mamy tendencj\u0119 do wiary w to, co najlepsze, poniewa\u017c m\u0105drzy panowie z du\u017cych firm zapewniali nas, \u017ce wszystko b\u0119dzie w porz\u0105dku. Nie zadajemy sobie pytania: a dlaczego w\u0142a\u015bciwie to mo\u017ce dzia\u0142a\u0107? Czy istnieje jakie\u015b formalne uzasadnienie poprawno\u015bci dzia\u0142ania takich system\u00f3w?<\/p>\n<p>Niedawno by\u0142em na <noindex><a rel=\"nofollow\" href=\"https:\/\/sptdc.ru\">szkole dotycz\u0105cej oblicze\u0144 rozproszonych<\/a><\/noindex> i bardzo mnie zainspirowa\u0142a ta tematyka. Wyk\u0142ady w szkole przypomina\u0142y bardziej zaj\u0119cia z analizy matematycznej ni\u017c co\u015b zwi\u0105zanego z systemami komputerowymi. Jednak w\u0142a\u015bnie w ten spos\u00f3b udowadniano najwa\u017cniejsze algorytmy, z kt\u00f3rych korzystamy na co dzie\u0144, nawet o tym nie wiedz\u0105c. <\/p>\n<p>W wi\u0119kszo\u015bci nowoczesnych system\u00f3w rozproszonych stosuje si\u0119 algorytm konsensusu Paxos i jego r\u00f3\u017cne modyfikacje. Najlepsze jest to, \u017ce zasady oraz sama mo\u017cliwo\u015b\u0107 istnienia tego algorytmu mog\u0105 by\u0107 udowodnione po prostu za pomoc\u0105 d\u0142ugopisu i kartki. Jednocze\u015bnie w praktyce algorytm ten stosuje si\u0119 w du\u017cych systemach dzia\u0142aj\u0105cych na ogromnej liczbie w\u0119z\u0142\u00f3w w chmurach. <\/p>\n<p><b class=\"spoiler_title\">Lekkie zobrazowanie tego, o czym b\u0119dzie mowa dalej: problem dw\u00f3ch genera\u0142\u00f3w<\/b>Rozpocznijmy rozgrzewk\u0119 od analizy <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B4%D0%B2%D1%83%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2\">problemu dw\u00f3ch genera\u0142\u00f3w<\/a><\/noindex>. <\/p>\n<p>Mamy dwie armie - rud\u0105 i bia\u0142\u0105. Bia\u0142e wojska stacjonuj\u0105 w obl\u0119\u017conym mie\u015bcie. Rud\u0105 armi\u0105 dowodz\u0105 genera\u0142owie A1 i A2, kt\u00f3rzy znajduj\u0105 si\u0119 po dw\u00f3ch stronach miasta. Zadaniem rudych jest zaatakowa\u0107 bia\u0142e miasto i zwyci\u0119\u017cy\u0107. Jednak\u017ce armia ka\u017cdego rudego genera\u0142a jest mniejsza od bia\u0142ych.<\/p>\n<p><img decoding=\"async\" alt=\"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach\" src=\"\/wp-content\/uploads\/2019\/08\/2a684a484d4f6cb3d4e33f2367206d9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWarunki zwyci\u0119stwa dla rudych: obaj genera\u0142owie musz\u0105 zaatakowa\u0107 jednocze\u015bnie, aby mie\u0107 przewag\u0119 liczebn\u0105 nad bia\u0142ymi. W tym celu genera\u0142owie A1 i A2 musz\u0105 si\u0119 ze sob\u0105 porozumie\u0107. Je\u015bli ka\u017cdy zaatakuje osobno, rudzi przegraj\u0105. <\/p>\n<p>Aby si\u0119 porozumie\u0107, genera\u0142owie A1 i A2 mog\u0105 wysy\u0142a\u0107 do siebie pos\u0142a\u0144c\u00f3w przez terytorium bia\u0142ego miasta. Pos\u0142aniec mo\u017ce dotrze\u0107 z powodzeniem do sojuszniczego genera\u0142a lub mo\u017ce zosta\u0107 przechwycony przez przeciwnika. Pytanie: czy istnieje taka sekwencja komunikacji mi\u0119dzy rudymi genera\u0142ami (sekwencja wysy\u0142ania pos\u0142a\u0144c\u00f3w od A1 do A2 i z powrotem od A2 do A1), w kt\u00f3rej oni gwarantuj\u0105 sobie porozumienie o ataku o godzinie X? Tutaj przez gwarancje rozumiemy, \u017ce obaj genera\u0142owie b\u0119d\u0105 mieli jednoznaczne potwierdzenie, \u017ce sojusznik (drugi genera\u0142) na pewno zaatakuje o ustalonej godzinie X.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce A1 wysy\u0142a pos\u0142a\u0144ca do A2 z wiadomo\u015bci\u0105: 'Zaatakujmy dzisiaj o p\u00f3\u0142nocy!'. Genera\u0142 A1 nie mo\u017ce zaatakowa\u0107 bez potwierdzenia od genera\u0142a A2. Je\u015bli pos\u0142aniec od A1 dotar\u0142, genera\u0142 A2 wysy\u0142a potwierdzenie z wiadomo\u015bci\u0105: 'Tak, zaatakujmy dzi\u015b bia\u0142ych'. Ale teraz genera\u0142 A2 nie wie, czy jego pos\u0142aniec dotar\u0142, nie ma gwarancji, czy atak b\u0119dzie jednoczesny. Teraz genera\u0142 A2 znowu potrzebuje potwierdzenia.<\/p>\n<p>Je\u015bli dalej rozpisywa\u0107 ich komunikacj\u0119, oka\u017ce si\u0119, \u017ce niezale\u017cnie od liczby cykli wymiany wiadomo\u015bci, nie ma sposobu, aby gwarantowa\u0107 obojgu genera\u0142om, \u017ce ich wiadomo\u015bci zosta\u0142y odebrane (zak\u0142adaj\u0105c, \u017ce jakikolwiek z pos\u0142a\u0144c\u00f3w mo\u017ce by\u0107 przechwycony).<\/p>\n<p>Zadanie dw\u00f3ch genera\u0142\u00f3w jest doskona\u0142\u0105 ilustracj\u0105 bardzo prostej rozproszonej systemu, gdzie s\u0105 dwa w\u0119z\u0142y z niezawodn\u0105 komunikacj\u0105. Oznacza to, \u017ce nie mamy 100% gwarancji, \u017ce si\u0119 zsynchronizuj\u0105. O podobnych problemach, ale w szerszej skali, mowa dalej w artykule.<\/p>\n<h2>Wprowadzamy poj\u0119cie system\u00f3w rozproszonych<\/h2>\n<p>\nRozproszony system to grupa komputer\u00f3w (w dalszej cz\u0119\u015bci b\u0119dziemy nazywa\u0107 je w\u0119z\u0142ami), kt\u00f3re mog\u0105 wymienia\u0107 si\u0119 wiadomo\u015bciami. Ka\u017cdy pojedynczy w\u0119ze\u0142 to autonomiczna jednostka. W\u0119ze\u0142 mo\u017ce samodzielnie przetwarza\u0107 zadania, ale aby wsp\u00f3\u0142pracowa\u0107 z innymi w\u0119z\u0142ami, musi wysy\u0142a\u0107 i odbiera\u0107 wiadomo\u015bci. <\/p>\n<p>Jak dok\u0142adnie s\u0105 realizowane wiadomo\u015bci, jakie protoko\u0142y s\u0105 u\u017cywane \u2013 to nie interesuje nas w tym kontek\u015bcie. Wa\u017cne jest to, \u017ce w\u0119z\u0142y rozproszonego systemu mog\u0105 wymienia\u0107 si\u0119 danymi, wysy\u0142aj\u0105c wiadomo\u015bci mi\u0119dzy sob\u0105.<\/p>\n<p>Samo okre\u015blenie wydaje si\u0119 do\u015b\u0107 proste, ale nale\u017cy uwzgl\u0119dni\u0107, \u017ce rozproszony system ma szereg atrybut\u00f3w, kt\u00f3re b\u0119d\u0105 dla nas istotne.<\/p>\n<h4>Atrybuty system\u00f3w rozproszonych<\/h4>\n<p><\/p>\n<ol>\n<li><b>Zdarzenia wsp\u00f3\u0142bie\u017cne<\/b> \u2013 mo\u017cliwo\u015b\u0107 wyst\u0105pienia jednoczesnych lub konkurencyjnych zdarze\u0144 w systemie. Co wi\u0119cej, b\u0119dziemy uwa\u017ca\u0107, \u017ce zdarzenia, kt\u00f3re mia\u0142y miejsce na dw\u00f3ch r\u00f3\u017cnych w\u0119z\u0142ach, s\u0105 potencjalnie konkurencyjne, dop\u00f3ki nie mamy jasnej kolejno\u015bci wyst\u0119powania tych zdarze\u0144. A zazwyczaj takiej kolejno\u015bci nie mamy.<\/li>\n<li><b>Brak globalnego zegara<\/b>. Nie mamy jasnej kolejno\u015bci zdarze\u0144 z powodu braku globalnego zegara. W zwyk\u0142ym \u015bwiecie ludzkim jeste\u015bmy przyzwyczajeni do posiadania zegar\u00f3w i absolutnego czasu. Wszystko zmienia si\u0119, gdy m\u00f3wimy o systemach rozproszonych. Nawet najbardziej precyzyjne zegary atomowe maj\u0105 dryft i mog\u0105 wyst\u0105pi\u0107 sytuacje, w kt\u00f3rych nie mo\u017cemy stwierdzi\u0107, kt\u00f3re z dw\u00f3ch zdarze\u0144 mia\u0142o miejsce wcze\u015bniej. Dlatego te\u017c nie mo\u017cemy polega\u0107 na czasie.<\/li>\n<li><b>Niezale\u017cna awaria w\u0119z\u0142\u00f3w systemu<\/b>. Jest jeszcze jeden problem: co\u015b mo\u017ce p\u00f3j\u015b\u0107 nie tak po prostu dlatego, \u017ce nasze w\u0119z\u0142y nie s\u0105 wieczne. Dysk twardy mo\u017ce ulec awarii, wirtualna maszyna w chmurze mo\u017ce si\u0119 zrestartowa\u0107, sie\u0107 mo\u017ce na chwil\u0119 znikn\u0105\u0107 i wiadomo\u015bci mog\u0105 zosta\u0107 utracone. Co wi\u0119cej, mog\u0105 wyst\u0105pi\u0107 sytuacje, w kt\u00f3rych w\u0119z\u0142y dzia\u0142aj\u0105, ale dzia\u0142aj\u0105 przeciwko systemowi. Ostatnia klasa problem\u00f3w zyska\u0142a nawet osobn\u0105 nazw\u0119: problem <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B2%D0%B8%D0%B7%D0%B0%D0%BD%D1%82%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2\">bizantyjskich genera\u0142\u00f3w<\/a><\/noindex>. Najbardziej znanym przyk\u0142adem systemu rozproszonego z takim problemem jest Blockchain. Jednak dzi\u015b nie b\u0119dziemy rozpatrywa\u0107 tej szczeg\u00f3lnej klasy problem\u00f3w. Nas b\u0119d\u0105 interesowa\u0107 sytuacje, w kt\u00f3rych po prostu jeden lub kilka w\u0119z\u0142\u00f3w mog\u0105 ulega\u0107 awarii.<\/li>\n<li><b>Modele komunikacji (modele wymiany wiadomo\u015bci) mi\u0119dzy w\u0119z\u0142ami<\/b>. Ju\u017c ustalili\u015bmy, \u017ce w\u0119z\u0142y komunikuj\u0105 si\u0119 poprzez wymian\u0119 wiadomo\u015bci. Istniej\u0105 dwa znane modele wymiany wiadomo\u015bci: synchroniczny i asynchroniczny.<\/li>\n<\/ol>\n<p><\/p>\n<h4>Modele komunikacji mi\u0119dzy w\u0119z\u0142ami w systemach rozproszonych<\/h4>\n<p>\n<b>Model synchroniczny<\/b> \u2013 dok\u0142adnie wiemy, \u017ce istnieje pewna znana delta czasu, w ci\u0105gu kt\u00f3rej wiadomo\u015b\u0107 gwarantowanie dociera od jednego w\u0119z\u0142a do drugiego. Je\u015bli ten czas minie, a wiadomo\u015b\u0107 nie dotrze, mo\u017cemy \u015bmia\u0142o powiedzie\u0107, \u017ce w\u0119ze\u0142 jest uszkodzony. W takim modelu mamy przewidywalny czas oczekiwania. <\/p>\n<p><b>Model asynchroniczny<\/b> \u2013 w modelach asynchronicznych zak\u0142adamy, \u017ce czas oczekiwania jest ograniczony, ale nie istnieje taka delta czasu, po kt\u00f3rej mo\u017cna gwarantowa\u0107, \u017ce w\u0119ze\u0142 jest uszkodzony. Tzn. czas oczekiwania na wiadomo\u015b\u0107 od w\u0119z\u0142a mo\u017ce by\u0107 dowolnie d\u0142ugi. To wa\u017cna definicja, o kt\u00f3rej b\u0119dziemy rozmawia\u0107 dalej. <\/p>\n<h2>Poj\u0119cie konsensusu w systemach rozproszonych<\/h2>\n<p>\nZanim formalnie zdefiniujemy poj\u0119cie konsensusu, rozwa\u017cmy przyk\u0142ad sytuacji, w kt\u00f3rej jest on nam potrzebny, a mianowicie \u2013 <b>Replikacja maszyny stanowej<\/b>. <\/p>\n<p>Mamy pewien rozproszony dziennik. Chcieliby\u015bmy, aby by\u0142 on sp\u00f3jny i zawiera\u0142 identyczne dane na wszystkich w\u0119z\u0142ach systemu rozproszonego. Kiedy kt\u00f3ry\u015b z w\u0119z\u0142\u00f3w dowiaduje si\u0119 o nowej warto\u015bci, kt\u00f3r\u0105 zamierza zapisa\u0107 w dzienniku, jego zadaniem staje si\u0119 zaproponowanie tej warto\u015bci wszystkim pozosta\u0142ym w\u0119z\u0142om, aby dziennik zosta\u0142 zaktualizowany na wszystkich w\u0119z\u0142ach, a system przeszed\u0142 w nowe sp\u00f3jne estado. Przy tym wa\u017cne jest, aby w\u0119z\u0142y uzgodni\u0142y ze sob\u0105: wszystkie w\u0119z\u0142y zgodzi\u0142y si\u0119, \u017ce zaproponowana nowa warto\u015b\u0107 jest poprawna, wszystkie w\u0119z\u0142y t\u0119 warto\u015b\u0107 przyj\u0119\u0142y, i tylko w takim przypadku wszystkie mog\u0105 zapisa\u0107 now\u0105 warto\u015b\u0107 w dzienniku. <\/p>\n<p>Innymi s\u0142owy: \u017caden z w\u0119z\u0142\u00f3w nie zaprotestowa\u0142, \u017ce ma bardziej aktualne informacje, a proponowana warto\u015b\u0107 jest b\u0142\u0119dna. Uzgodnienie mi\u0119dzy w\u0119z\u0142ami i zgoda co do jednej poprawnie przyj\u0119tej warto\u015bci to konsensus w systemie rozproszonym. Nast\u0119pnie b\u0119dziemy m\u00f3wi\u0107 o algorytmach, kt\u00f3re pozwalaj\u0105 systemowi rozproszonemu na gwarantowane osi\u0105gni\u0119cie konsensusu.<br \/>\n<img decoding=\"async\" alt=\"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach\" src=\"\/wp-content\/uploads\/2019\/08\/300b0834985d5d29286a83b00e6775a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBardziej formalnie mo\u017cemy okre\u015bli\u0107 algorytm osi\u0105gania konsensusu (lub po prostu algorytm konsensusu) jako funkcj\u0119, kt\u00f3ra przekszta\u0142ca rozproszony system ze stanu A w stan B. Przy czym ten stan jest akceptowany przez wszystkie w\u0119z\u0142y, a wszystkie w\u0119z\u0142y mog\u0105 go potwierdzi\u0107. Jak si\u0119 okazuje, zadanie to wcale nie jest tak trywialne, jak mog\u0142oby si\u0119 wydawa\u0107 na pierwszy rzut oka.<\/p>\n<h4>W\u0142a\u015bciwo\u015bci algorytmu konsensusu<\/h4>\n<p>\nAlgorytm konsensusu musi mie\u0107 trzy w\u0142a\u015bciwo\u015bci, aby system m\u00f3g\u0142 istnie\u0107 i odnosi\u0107 jaki\u015b post\u0119p w przechodzeniu z jednego stanu do drugiego:<\/p>\n<ol>\n<li><b>Zgoda <\/b> \u2013 wszystkie poprawnie dzia\u0142aj\u0105ce w\u0119z\u0142y musz\u0105 przyj\u0105\u0107 t\u0119 sam\u0105 warto\u015b\u0107 (w artyku\u0142ach to w\u0142a\u015bciwo\u015b\u0107 r\u00f3wnie\u017c wyst\u0119puje jako w\u0142a\u015bciwo\u015b\u0107 bezpiecze\u0144stwa). Wszystkie w\u0119z\u0142y, kt\u00f3re obecnie dzia\u0142aj\u0105 (nie uleg\u0142y awarii i nie straci\u0142y po\u0142\u0105czenia z innymi) musz\u0105 doj\u015b\u0107 do porozumienia i przyj\u0105\u0107 pewn\u0105 wsp\u00f3ln\u0105 warto\u015b\u0107 ko\u0144cow\u0105.\n<p>Tutaj wa\u017cne jest zrozumienie, \u017ce w\u0119z\u0142y w rozwa\u017canym przez nas rozproszonym systemie chc\u0105 doj\u015b\u0107 do porozumienia. M\u00f3wi\u0105c pro\u015bciej, mamy na my\u015bli systemy, w kt\u00f3rych co\u015b mo\u017ce zawie\u015b\u0107 (na przyk\u0142ad mo\u017ce zadzia\u0142a\u0107 jaki\u015b w\u0119ze\u0142), ale w tym systemie z pewno\u015bci\u0105 nie ma w\u0119z\u0142\u00f3w, kt\u00f3re dzia\u0142a\u0142yby przeciwko innym (problem genera\u0142\u00f3w bizantyjskich). Dzi\u0119ki tej w\u0142a\u015bciwo\u015bci system pozostaje sp\u00f3jny.<\/li>\n<li><b>Integralno\u015b\u0107 <\/b> \u2014 je\u015bli wszystkie poprawnie dzia\u0142aj\u0105ce w\u0119z\u0142y proponuj\u0105 t\u0119 sam\u0105 warto\u015b\u0107 <b>v<\/b>, to znaczy ka\u017cdy poprawnie dzia\u0142aj\u0105cy w\u0119ze\u0142 musi przyj\u0105\u0107 t\u0119 warto\u015b\u0107 <b>v<\/b>. <\/li>\n<li><b>Zako\u0144czenie <\/b>\u2013 wszystkie poprawnie dzia\u0142aj\u0105ce w\u0119z\u0142y w ko\u0144cu przyjm\u0105 pewn\u0105 warto\u015b\u0107 (w\u0142a\u015bciwo\u015b\u0107 \u017cywotno\u015bci), co pozwala algorytmowi na post\u0119p w systemie. Ka\u017cdy pojedynczy poprawnie dzia\u0142aj\u0105cy w\u0119ze\u0142 powinien pr\u0119dzej czy p\u00f3\u017aniej przyj\u0105\u0107 warto\u015b\u0107 ko\u0144cow\u0105 i potwierdzi\u0107 to: \u201eDla mnie \u2013 ta warto\u015b\u0107 jest prawdziwa, zgadzam si\u0119 z ca\u0142ym systemem\u201d.<\/li>\n<\/ol>\n<p><\/p>\n<h4>Przyk\u0142ad dzia\u0142ania algorytmu konsensusu<\/h4>\n<p>\nDop\u00f3ki w\u0142a\u015bciwo\u015bci algorytmu mog\u0105 by\u0107 nieco niezrozumia\u0142e. Dlatego zilustrujemy na przyk\u0142adzie, jakie etapy przechodzi najprostszy algorytm konsensusu w systemie z synchronizowanym modelem wymiany wiadomo\u015bci, w kt\u00f3rym wszystkie w\u0119z\u0142y dzia\u0142aj\u0105 poprawnie, wiadomo\u015bci nie gin\u0105, a nic si\u0119 nie psuje (czy rzeczywi\u015bcie co\u015b takiego zdarza si\u0119?).<\/p>\n<ol>\n<li>Wszystko zaczyna si\u0119 od propozycji r\u0119ki i serca (Propose). Za\u0142\u00f3\u017cmy, \u017ce do w\u0119z\u0142a o nazwie \u201eW\u0119ze\u0142 1\u201d pod\u0142\u0105czy\u0142 si\u0119 klient i rozpocz\u0105\u0142 transakcj\u0119, przesy\u0142aj\u0105c w\u0119z\u0142owi now\u0105 warto\u015b\u0107 \u2013 O. Od tego momentu b\u0119dziemy nazywa\u0107 \u201eW\u0119ze\u0142 1\u201d <b>proposer<\/b>. Jako proposer \u201eW\u0119ze\u0142 1\u201d musi teraz poinformowa\u0107 ca\u0142y system, \u017ce ma \u015bwie\u017ce dane, i rozsy\u0142a wszystkim innym w\u0119z\u0142om wiadomo\u015b\u0107: \u201eZobaczcie! Otrzyma\u0142em warto\u015b\u0107 \u201eO\u201d i chc\u0119 j\u0105 zapisa\u0107! Prosz\u0119 o potwierdzenie, \u017ce r\u00f3wnie\u017c zapiszecie \u201eO\u201d w swoim logu.\u201d\n<p><img decoding=\"async\" alt=\"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach\" src=\"\/wp-content\/uploads\/2019\/08\/bd6a9394229b8a2a5b0bf987ba53500b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Nast\u0119pny etap to g\u0142osowanie nad proponowan\u0105 warto\u015bci\u0105 (Voting). Po co to jest? Mo\u017ce zdarzy\u0107 si\u0119, \u017ce inne w\u0119z\u0142y otrzyma\u0142y bardziej aktualne informacje i maj\u0105 dane dotycz\u0105ce tej samej transakcji.\n<p><img decoding=\"async\" alt=\"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach\" src=\"\/wp-content\/uploads\/2019\/08\/7080d6222971c6bab012410ef9e074e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKiedy w\u0119ze\u0142 \u201eW\u0119ze\u0142 1\u201d wysy\u0142a swoj\u0105 propozycj\u0119, pozosta\u0142e w\u0119z\u0142y sprawdzaj\u0105 w swoich logach dane dotycz\u0105ce tego wydarzenia. Je\u015bli nie ma \u017cadnych sprzeczno\u015bci, w\u0119z\u0142y og\u0142aszaj\u0105: \u201eTak, nie mam innych danych dotycz\u0105cych tego zdarzenia. Warto\u015b\u0107 \u201eO\u201d to najnowsza informacja, jak\u0105 zdobyli\u015bmy\u201d. <\/p>\n<p>W przeciwnym razie w\u0119z\u0142y mog\u0105 odpowiedzie\u0107 \u201eW\u0119z\u0142owi 1\u201d: \u201eS\u0142uchaj! Mam bardziej aktualne dane dotycz\u0105ce tej transakcji. Nie \u201eO\u201d, a co\u015b lepszego.\u201d<\/p>\n<p>Na etapie g\u0142osowania w\u0119z\u0142y podejmuj\u0105 decyzj\u0119: albo wszyscy akceptuj\u0105 jedn\u0105 warto\u015b\u0107, albo kto\u015b z nich g\u0142osuje przeciw, sygnalizuj\u0105c, \u017ce ma bardziej aktualne dane. <\/li>\n<li> Je\u015bli runda g\u0142osowania zako\u0144czy\u0142a si\u0119 sukcesem, a wszyscy byli \u201eza\u201d, system przechodzi do nowego etapu \u2013 akceptacji warto\u015bci (Accept). \u201eW\u0119ze\u0142 1\u201d zbiera wszystkie odpowiedzi od innych w\u0119z\u0142\u00f3w i og\u0142asza: \u201eWszyscy zgodzili si\u0119 na warto\u015b\u0107 \u201eO\u201d! Teraz oficjalnie og\u0142aszam, \u017ce \u201eO\u201d to nasza nowa warto\u015b\u0107, wsp\u00f3lna dla wszystkich! Zapiszcie j\u0105 sobie, nie zapomnijcie. Zapiszcie w swoim logu!\u201d\n<p><img decoding=\"async\" alt=\"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach\" src=\"\/wp-content\/uploads\/2019\/08\/c4bc2af053a27d7030824d45c3ad6def.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Pozosta\u0142e w\u0119z\u0142y przesy\u0142aj\u0105 potwierdzenie (Accepted), \u017ce zapisa\u0142y warto\u015b\u0107 \u201eO\u201d, nic nowego w tym czasie nie wp\u0142yn\u0119\u0142o (swojego rodzaju dwuetapowe potwierdzenie). Po tym znacz\u0105cym wydarzeniu uwa\u017camy, \u017ce rozproszona transakcja zosta\u0142a zrealizowana.<br \/>\n <img decoding=\"async\" alt=\"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach\" src=\"\/wp-content\/uploads\/2019\/08\/2a9c49729f2607099385fee29f45d1f3.jpg\" style=\"display:block;margin: 0 auto;\" \/> <\/li>\n<\/ol>\n<p>\nW ten spos\u00f3b algorytm konsensusu w prostym przypadku sk\u0142ada si\u0119 z czterech krok\u00f3w: propose, g\u0142osowanie (voting), akceptacja (accept), potwierdzenie akceptacji (accepted).<\/p>\n<p>Je\u015bli na kt\u00f3rym\u015b etapie nie uda\u0142o nam si\u0119 osi\u0105gn\u0105\u0107 porozumienia, algorytm uruchamia si\u0119 ponownie, uwzgl\u0119dniaj\u0105c te informacje, kt\u00f3re przeka\u017c\u0105 w\u0119z\u0142y, kt\u00f3re odm\u00f3wi\u0142y potwierdzenia proponowanej warto\u015bci.<\/p>\n<h2>Algorytm konsensusu w asynchronicznym systemie<\/h2>\n<p>\nDo tej pory wszystko by\u0142o p\u0142ynne, poniewa\u017c m\u00f3wili\u015bmy o synchronicznym modelu wymiany wiadomo\u015bci. Ale wszyscy wiemy, \u017ce w dzisiejszym \u015bwiecie przyzwyczaili\u015bmy si\u0119 do dzia\u0142ania asynchronicznie. Jak wi\u0119c podobny algorytm dzia\u0142a w systemie z asynchronicznym modelem wymiany wiadomo\u015bci, gdzie zak\u0142adamy, \u017ce czas oczekiwania na odpowied\u017a od w\u0119z\u0142a mo\u017ce by\u0107 dowolnie d\u0142ugi (swoj\u0105 drog\u0105, awaria w\u0119z\u0142a r\u00f3wnie\u017c mo\u017cna uwa\u017ca\u0107 za przyk\u0142ad, kiedy w\u0119ze\u0142 mo\u017ce odpowiada\u0107 dowolnie d\u0142ugo). <\/p>\n<blockquote><p>Teraz, kiedy wiemy, jak zasadniczo dzia\u0142a algorytm konsensusu, zadanie dla dociekliwych czytelnik\u00f3w, kt\u00f3rzy dotarli do tego miejsca: ile w\u0119z\u0142\u00f3w w systemie z N w\u0119z\u0142ami i asynchronicznym modelem wiadomo\u015bci mo\u017ce ulec awarii, aby system wci\u0105\u017c m\u00f3g\u0142 osi\u0105gn\u0105\u0107 konsensus?<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">Poprawna odpowied\u017a i uzasadnienie s\u0105 w spoilerze.<\/b>Poprawna odpowied\u017a: <b>0<\/b>. Je\u015bli przynajmniej jeden w\u0119ze\u0142 w asynchronicznym systemie ulega awarii, system nie b\u0119dzie w stanie osi\u0105gn\u0105\u0107 konsensusu. To stwierdzenie zosta\u0142o udowodnione w znanej w pewnych kr\u0119gach twierdzeniu FLP (1985, Fischer, Lynch, Paterson, link do orygina\u0142u na ko\u0144cu artyku\u0142u): \u201eNiemo\u017cno\u015b\u0107 osi\u0105gni\u0119cia rozproszonego konsensusu przy awarii przynajmniej jednego w\u0119z\u0142a\u201d.<br \/>\n<img decoding=\"async\" alt=\"Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w rozproszonych systemach\" src=\"\/wp-content\/uploads\/2019\/08\/92417aafe00841aaa41cbefe0386e21a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCh\u0142opaki, mamy problem, przyzwyczaili\u015bmy si\u0119, \u017ce wszystko mamy asynchronicznie. A teraz takie co\u015b. Jak \u017cy\u0107 dalej? <\/p>\n<p>Teraz m\u00f3wili\u015bmy o teorii, o matematyce. Co to znaczy \u201ekonsensus nie mo\u017ce by\u0107 osi\u0105gni\u0119ty\u201d, t\u0142umacz\u0105c z j\u0119zyka matematycznego na nasz \u2013 in\u017cynieryjny? Oznacza to, \u017ce \u201enie zawsze mo\u017cna osi\u0105gn\u0105\u0107\u201d, tzn. istnieje taki przypadek, w kt\u00f3rym konsensus nie jest osi\u0105galny. A co to za przypadek? <\/p>\n<p>To w\u0142a\u015bnie naruszenie w\u0142a\u015bciwo\u015bci liveness, opisanej powy\u017cej. Nie mamy og\u00f3lnego porozumienia, a system nie mo\u017ce mie\u0107 post\u0119pu (nie mo\u017ce zako\u0144czy\u0107 si\u0119 w ograniczonym czasie), gdy nie mamy odpowiedzi od wszystkich w\u0119z\u0142\u00f3w. Poniewa\u017c w asynchronicznym systemie nie mamy przewidywalnego czasu odpowiedzi i nie mo\u017cemy wiedzie\u0107, czy w\u0119ze\u0142 uleg\u0142 awarii, czy po prostu d\u0142ugo odpowiada.<\/p>\n<p>Ale w praktyce mo\u017cemy znale\u017a\u0107 rozwi\u0105zanie. Niech nasz algorytm mo\u017ce dzia\u0142a\u0107 d\u0142ugo w przypadku awarii (potencjalnie mo\u017ce dzia\u0142a\u0107 w niesko\u0144czono\u015b\u0107). Jednak w wi\u0119kszo\u015bci sytuacji, gdy wi\u0119kszo\u015b\u0107 w\u0119z\u0142\u00f3w dzia\u0142a poprawnie, b\u0119dziemy mieli post\u0119p w systemie. <\/p>\n<p>W praktyce mamy do czynienia z cz\u0119\u015bciowo synchronicznymi modelami komunikacji. Cz\u0119\u015bciowa synchronizacja rozumiana jest tak: w og\u00f3lnym przypadku mamy model asynchroniczny, ale formalnie wprowadza si\u0119 pewne poj\u0119cie 'global stabilization time' pewnego momentu czasu. <\/p>\n<p>Ten moment czasu mo\u017ce nie nadej\u015b\u0107 przez dowolnie d\u0142ugi czas, ale pewnego dnia musi nast\u0105pi\u0107. Rozlegnie si\u0119 wirtualny budzik i od tego momentu mo\u017cemy przewidzie\u0107 r\u00f3\u017cnic\u0119 czasu, w jakiej wiadomo\u015bci dotr\u0105. Od tego momentu system przekszta\u0142ca si\u0119 z asynchronicznego w synchroniczny. W praktyce mamy do czynienia w\u0142a\u015bnie z takimi systemami. <\/p>\n<h2>Algorytm Paxos rozwi\u0105zuje problemy konsensusu<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Paxos_(computer_science)\">Paxos <\/a><\/noindex> \u2013 to rodzina algorytm\u00f3w, kt\u00f3re rozwi\u0105zuj\u0105 problem konsensusu dla cz\u0119\u015bciowo synchronizowanych system\u00f3w, przy za\u0142o\u017ceniu, \u017ce niekt\u00f3re w\u0119z\u0142y mog\u0105 ulega\u0107 awarii. Autorem Paxosa jest <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Leslie_Lamport\">Leslie Lamport<\/a><\/noindex>. Zaproponowa\u0142 on formalny dow\u00f3d istnienia i poprawno\u015bci algorytmu w 1989 roku. <\/p>\n<p>Jednak dow\u00f3d okaza\u0142 si\u0119 wcale nietrywialny. Pierwsza publikacja zosta\u0142a wydana dopiero w 1998 roku (33 strony) z opisem algorytmu. Okaza\u0142o si\u0119, \u017ce by\u0142a ona skrajnie trudna do zrozumienia, a w 2001 roku opublikowano wyja\u015bnienie do artyku\u0142u, kt\u00f3re zajmowa\u0142o 14 stron. Obj\u0119to\u015bci publikacji s\u0105 podane, aby pokaza\u0107, \u017ce problem konsensusu jest naprawd\u0119 skomplikowany, a za takimi algorytmami stoi ogromna praca najinteligentniejszych ludzi.<\/p>\n<blockquote><p>Ciekawe, \u017ce sam Leslie Lamport w swoim wyk\u0142adzie zauwa\u017cy\u0142, \u017ce w drugiej publikacji-wyja\u015bnieniu znajduje si\u0119 jedno stwierdzenie, jedna linijka (nie sprecyzowa\u0142 jaka), kt\u00f3ra mo\u017ce by\u0107 r\u00f3\u017cnie interpretowana. I z tego powodu wiele wsp\u00f3\u0142czesnych realizacji Paxosa nie dzia\u0142a ca\u0142kowicie poprawnie. <\/p><\/blockquote>\n<p>\nSzczeg\u00f3\u0142owe om\u00f3wienie dzia\u0142ania Paxosa zajmie niejedn\u0105 artyku\u0142, dlatego postaram si\u0119 bardzo kr\u00f3tko przedstawi\u0107 g\u0142\u00f3wn\u0105 ide\u0119 algorytmu. W linkach na ko\u0144cu mojego artyku\u0142u znajdziesz materia\u0142y do dalszego zg\u0142\u0119biania tego tematu.<\/p>\n<h4>Role w Paxos<\/h4>\n<p>\nW algorytmie Paxos istnieje poj\u0119cie r\u00f3l. Rozwa\u017cmy trzy podstawowe (s\u0105 warianty z dodatkowymi rolami):<\/p>\n<ol>\n<li><b>Propozycje (mo\u017cna spotka\u0107 r\u00f3wnie\u017c terminy: liderzy lub koordynatorzy)<\/b>. To s\u0105 ludzie, kt\u00f3rzy poznaj\u0105 nowe znaczenie od u\u017cytkownika i przyjmuj\u0105 rol\u0119 lidera. Ich zadaniem jest zainicjowanie rundy przedstawiania nowego znaczenia i koordynacja dalszych dzia\u0142a\u0144 w\u0119z\u0142\u00f3w. Co ciekawe, Paxos dopuszcza istnienie kilku lider\u00f3w w okre\u015blonych sytuacjach.<\/li>\n<li><b>Akceptory (G\u0142osuj\u0105cy)<\/b>. To w\u0119z\u0142y, kt\u00f3re g\u0142osuj\u0105 za przyj\u0119ciem lub odrzuceniem danego znaczenia. Ich rola jest niezwykle istotna, poniewa\u017c to od nich zale\u017cy decyzja: w jakie w stanie przechodzi (lub nie przechodzi) system po danym etapie algorytmu konsensusu.<\/li>\n<li><b>Ucz\u0105cy si\u0119<\/b>. W\u0119z\u0142y, kt\u00f3re po prostu przyjmuj\u0105 i zapisuj\u0105 nowe uzgodnione znaczenie, gdy stan systemu si\u0119 zmienia. Nie podejmuj\u0105 decyzji, po prostu otrzymuj\u0105 dane i mog\u0105 je przekaza\u0107 ko\u0144cowemu u\u017cytkownikowi. <\/li>\n<\/ol>\n<p>\nJeden w\u0119ze\u0142 mo\u017ce pe\u0142ni\u0107 kilka r\u00f3l w r\u00f3\u017cnych sytuacjach. <\/p>\n<h4>Poj\u0119cie kworum<\/h4>\n<p>\nZak\u0142adamy, \u017ce mamy system z <b>N<\/b> w\u0119z\u0142ami. I z nich maksymalnie <b>F<\/b> w\u0119z\u0142\u00f3w mo\u017ce ulec awarii. Je\u015bli F w\u0119z\u0142\u00f3w ulega awarii, to w naszym klastrze powinno by\u0107 co najmniej <b>2F + 1<\/b> w\u0119z\u0142\u00f3w acceptor\u00f3w. <\/p>\n<p>Jest to konieczne, aby\u015bmy zawsze, nawet w najgorszym przypadku, mieli wi\u0119kszo\u015b\u0107 \u201edobrych\u201d, prawid\u0142owo dzia\u0142aj\u0105cych w\u0119z\u0142\u00f3w. To znaczy, \u017ce <b>F + 1<\/b> \u201edobrych\u201d w\u0119z\u0142\u00f3w, kt\u00f3re si\u0119 zgodzi\u0142y, i ko\u0144cowe znaczenie zostaje zaakceptowane. W przeciwnym razie mo\u017ce wyst\u0105pi\u0107 sytuacja, w kt\u00f3rej r\u00f3\u017cne lokalne grupy przyjm\u0105 r\u00f3\u017cne znaczenia i nie b\u0119d\u0105 mog\u0142y si\u0119 ze sob\u0105 porozumie\u0107. Dlatego potrzebujemy absolutnej wi\u0119kszo\u015bci, aby wygra\u0107 w g\u0142osowaniu.<\/p>\n<h4>Og\u00f3lna idea dzia\u0142ania algorytmu konsensusu Paxos<\/h4>\n<p>\nAlgorytm Paxos zak\u0142ada dwie g\u0142\u00f3wne fazy, kt\u00f3re z kolei dziel\u0105 si\u0119 na dwa kroki ka\u017cda:<\/p>\n<ol>\n<li><b>Faza 1a: Przygotowanie<\/b>. Na etapie przygotowania lider (proposer) informuje wszystkie w\u0119z\u0142y: \u201eZaczynamy nowy etap g\u0142osowania. Mamy now\u0105 rund\u0119. Numer tej rundy to n. Teraz zaczniemy g\u0142osowa\u0107\u201d. Na razie po prostu og\u0142asza rozpocz\u0119cie nowego cyklu, ale nie podaje nowej warto\u015bci. Celem tego etapu jest zainicjowanie nowej rundy i poinformowanie wszystkich o jej unikalnym numerze. Numer rundy jest wa\u017cny, musi by\u0107 wi\u0119kszy ni\u017c wszystkie poprzednie numery g\u0142osowa\u0144 od wszystkich poprzednich lider\u00f3w. To w\u0142a\u015bnie dzi\u0119ki numerowi rundy inne w\u0119z\u0142y w systemie b\u0119d\u0105 rozumie\u0107, jak \u015bwie\u017ce s\u0105 dane u lidera. Prawdopodobnie inne w\u0119z\u0142y ju\u017c maj\u0105 wyniki g\u0142osowania z du\u017co p\u00f3\u017aniejszych rund i po prostu poinformuj\u0105 lidera, \u017ce pozostaje w tyle.<\/li>\n<li><b>Faza 1b: Obietnica<\/b>. Kiedy w\u0119z\u0142y-acceptory otrzymaj\u0105 numer nowego etapu g\u0142osowania, mo\u017cliwe s\u0105 dwa scenariusze: \n<ul>\n<li>Numer n nowego g\u0142osowania jest wi\u0119kszy ni\u017c numer jakiegokolwiek z wcze\u015bniejszych g\u0142osowa\u0144, w kt\u00f3rym uczestniczy\u0142 akceptor. Wtedy akceptor wysy\u0142a liderowi obietnic\u0119, \u017ce nie we\u017amie udzia\u0142u w \u017cadnym g\u0142osowaniu z numerem mniejszym ni\u017c n. Je\u015bli akceptor zd\u0105\u017cy\u0142 ju\u017c za co\u015b zag\u0142osowa\u0107 (tzn. ju\u017c w drugiej fazie przyj\u0105\u0142 jak\u0105\u015b warto\u015b\u0107), to do swojej obietnicy do\u0142\u0105cza przyj\u0119t\u0105 warto\u015b\u0107 i numer g\u0142osowania, w kt\u00f3rym uczestniczy\u0142.<\/li>\n<li>W przeciwnym razie, je\u015bli akceptor ju\u017c zna g\u0142osowanie z wi\u0119kszym numerem, mo\u017ce po prostu zignorowa\u0107 etap przygotowania i nie odpowiada\u0107 liderowi.<\/li>\n<\/ul>\n<\/li>\n<li><b>Faza 2a: Akceptacja<\/b>. Lider musi poczeka\u0107 na odpowied\u017a od kworum (wi\u0119kszo\u015bci w\u0119z\u0142\u00f3w w systemie) i je\u015bli uzyska wymagan\u0105 liczb\u0119 odpowiedzi, to ma dwa mo\u017cliwe scenariusze: \n<ul>\n<li>Niekt\u00f3rzy z acceptor\u00f3w przes\u0142ali warto\u015bci, za kt\u00f3re ju\u017c g\u0142osowali. W tym przypadku lider wybiera warto\u015b\u0107 z g\u0142osowania o maksymalnym numerze. Nazwijmy t\u0119 warto\u015b\u0107 x i rozsy\u0142a wszystkim w\u0119z\u0142om wiadomo\u015b\u0107 o tre\u015bci: \u201eAkceptuj (n, x)\u201d, gdzie pierwsza warto\u015b\u0107 to numer g\u0142osowania z jego w\u0142asnego kroku Propose, a druga warto\u015b\u0107 to to, dla czego wszyscy si\u0119 zbierali, czyli warto\u015b\u0107, za kt\u00f3r\u0105 tak naprawd\u0119 g\u0142osujemy.<\/li>\n<li>Je\u015bli \u017caden z acceptor\u00f3w nie przes\u0142a\u0142 \u017cadnych warto\u015bci, a jedynie obieca\u0142 g\u0142osowa\u0107 w tej rundzie, lider mo\u017ce zaproponowa\u0107 im g\u0142osowanie za swoj\u0105 warto\u015b\u0107, czyli warto\u015b\u0107, dla kt\u00f3rej w og\u00f3le zosta\u0142 liderem. Nazwijmy j\u0105 y. Rozsy\u0142a wszystkim w\u0119z\u0142om wiadomo\u015b\u0107 o tre\u015bci: \u201eAkceptuj (n, y)\u201d, analogicznie do poprzedniego przypadku.<\/li>\n<\/ul>\n<\/li>\n<li><b>Faza 2b: zaakceptowane<\/b>. Nast\u0119pnie w\u0119z\u0142y-acceptory, po otrzymaniu wiadomo\u015bci \u201eAkceptuj(&#8230;)\u201d od lidera, zgadzaj\u0105 si\u0119 z nim (rozsy\u0142aj\u0105 wszystkim w\u0119z\u0142om potwierdzenie, \u017ce zgadzaj\u0105 si\u0119 z now\u0105 warto\u015bci\u0105) tylko w przypadku, gdy nie obieca\u0142y jakiemu\u015b (innemu) liderowi udzia\u0142u w g\u0142osowaniach o numerze rundy <b>n' &gt; n<\/b>, w przeciwnym razie ignoruj\u0105 pro\u015bb\u0119 o potwierdzenie.\n<p>Je\u015bli lider uzyska\u0142 wi\u0119kszo\u015b\u0107 odpowiedzi od w\u0119z\u0142\u00f3w, a wszystkie one potwierdzi\u0142y now\u0105 warto\u015b\u0107, to nowa warto\u015b\u0107 jest uznawana za zaakceptowan\u0105. Hurra! Je\u015bli jednak nie osi\u0105gni\u0119to wi\u0119kszo\u015bci lub s\u0105 w\u0119z\u0142y, kt\u00f3re odm\u00f3wi\u0142y zaakceptowania nowej warto\u015bci, wszystko zaczyna si\u0119 od nowa.<\/li>\n<\/ol>\n<p>\nTak dzia\u0142a algorytm Paxos. Ka\u017cdy z tych etap\u00f3w ma wiele niuans\u00f3w, praktycznie nie om\u00f3wili\u015bmy r\u00f3\u017cnych rodzaj\u00f3w awarii, problemy z wieloma liderami i inne kwestie, ale celem tego artyku\u0142u jest jedynie na wy\u017cszym poziomie zapozna\u0107 czytelnika z \u015bwiatem oblicze\u0144 rozproszonych.<\/p>\n<p>Warto r\u00f3wnie\u017c zauwa\u017cy\u0107, \u017ce Paxos nie jest jedynym tego typu algorytmem, s\u0105 te\u017c inne algorytmy, na przyk\u0142ad <noindex><a rel=\"nofollow\" href=\"https:\/\/raft.github.io\/\">Raft<\/a><\/noindex>, ale to ju\u017c temat na inny artyku\u0142.<\/p>\n<h2>Linki do materia\u0142\u00f3w do dalszego studiowania<\/h2>\n<p>\nPoziom \u201enowicjusz\u201d:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/s\/story\/lets-take-a-crack-at-understanding-distributed-consensus-dad23d0dc95\">Jak dzia\u0142a konsensus rozproszony?<\/a><\/noindex>, Preethi Kasireddy, artyku\u0142 na blogu Medium<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@nevverlander\/paxos-made-simple-for-real-aa221be7d91b\">Paxos w prosty spos\u00f3b. Na serio<\/a><\/noindex>, Adi Kancherla, artyku\u0142 na blogu Medium<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ittaiab.github.io\/\">My\u015bli zdecentralizowane<\/a><\/noindex>, Ittai Abraham, blog<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ittaiab.github.io\/2019-06-01-2019-5-31-models\/\">Synchronizacja, asynchronizacja i cz\u0119\u015bciowa synchronizacja<\/a><\/noindex>, Ittai Abraham, artyku\u0142 na blogu<\/li>\n<\/ul>\n<p>\nPoziom \u201eLeslie Lamport\u201d:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/groups.csail.mit.edu\/tds\/papers\/Lynch\/jacm85.pdf\">Niemo\u017cliwo\u015b\u0107 rozproszonego konsensusu z jedn\u0105 wadliw\u0105 operacj\u0105 (niemo\u017cliwo\u015b\u0107 FLP)<\/a><\/noindex>, Fischer, Lynch i Paterson, artyku\u0142 naukowy, 1985<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lamport.azurewebsites.net\/pubs\/lamport-paxos.pdf\">Parlament cz\u0119\u015bciowy<\/a><\/noindex>, Leslie Lamport, artyku\u0142 naukowy, 1998<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lamport.azurewebsites.net\/pubs\/paxos-simple.pdf\">Paxos w prosty spos\u00f3b<\/a><\/noindex>, Leslie Lamport, artyku\u0142 naukowy, 2001<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzaio\/blog\/463469\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c. \u0412 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0437\u0430\u043f\u0435\u0440\u0442\u044b 5 \u043a\u043e\u0442\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u044c \u0434\u0432\u0435\u0440\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u044f\u0442\u0435\u0440\u043e\u043c \u043d\u0430\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u0451. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0432 \u2013 \u043a\u043e\u0442 \u0428\u0440\u0451\u0434\u0438\u043d\u0433\u0435\u0440\u0430, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0442\u044b \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u043e \u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u041a\u0430\u043a \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c?\u00bb \u0412 \u044d\u0442\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28009,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37335","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c. \u0412 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0437\u0430\u043f\u0435\u0440\u0442\u044b 5 \u043a\u043e\u0442\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u044c \u0434\u0432\u0435\u0440\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u044f\u0442\u0435\u0440\u043e\u043c \u043d\u0430\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u0451.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u043e\u0442 \u0428\u0440\u0451\u0434\u0438\u043d\u0433\u0435\u0440\u0430 \u0431\u0435\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c. \u0412 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0437\u0430\u043f\u0435\u0440\u0442\u044b 5 \u043a\u043e\u0442\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u044c \u0434\u0432\u0435\u0440\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u044f\u0442\u0435\u0440\u043e\u043c \u043d\u0430\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u0451.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:17:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kot Schr\u00f6dingera bez pude\u0142ka: problem konsensusu w systemach rozproszonych | ProHoster","description":"Wyobra\u017amy sobie. W pokoju jest 5 kot\u00f3w, i \u017ceby obudzi\u0107 w\u0142a\u015bciciela, musz\u0105 si\u0119 wszyscy razem zgodzi\u0107 w tej sprawie, bo drzwi mog\u0105 otworzy\u0107 tylko wraz z pomoc\u0105 pi\u0105tki z nich.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u043e\u0442 \u0428\u0440\u0451\u0434\u0438\u043d\u0433\u0435\u0440\u0430 \u0431\u0435\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 | ProHoster","og:description":"\u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c. \u0412 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0437\u0430\u043f\u0435\u0440\u0442\u044b 5 \u043a\u043e\u0442\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u044c \u0434\u0432\u0435\u0440\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u044f\u0442\u0435\u0440\u043e\u043c \u043d\u0430\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u0451.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:17:01+00:00","article:modified_time":"2019-10-31T19:17:01+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37335","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 17:20:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:28:27","updated":"2026-01-23 17:20:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=37335"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37335\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/28009"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=37335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=37335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=37335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}