{"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\/it\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","title":{"rendered":"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Immaginiamo. In una stanza ci sono 5 gatti, e per andare a svegliare il padrone devono accordarsi tutti insieme, dato che possono aprire la porta solo tutti insieme. Se uno dei gatti \u00e8 il gatto di Schr\u00f6dinger, mentre gli altri gatti non conoscono la sua decisione, sorge la domanda: \u00abCome possono farlo?\u00bb <\/p>\n<p>In questo articolo vi spiegher\u00f2 in modo semplice la teoria dietro il mondo dei sistemi distribuiti e i principi del loro funzionamento. Inoltre, esaminer\u00f2 brevemente l'idea principale alla base di Paxos. <\/p>\n<p><img decoding=\"async\" alt=\"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti\" 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 \/>\nQuando gli sviluppatori utilizzano infrastrutture cloud, diversi database e lavorano in cluster di nodi, sono certi che i dati saranno integri, sicuri e sempre accessibili. Ma da dove vengono queste garanzie?<\/p>\n<p>Fondamentalmente, le garanzie che abbiamo sono quelle del fornitore. Sono descritte nella documentazione pi\u00f9 o meno in questo modo: \u00abQuesto servizio \u00e8 abbastanza affidabile, ha un SLA definito, non preoccuparti, tutto funzioner\u00e0 in distribuzione come ti aspetti\u00bb. <\/p>\n<p>Tendiamo a credere nel meglio, poich\u00e9 signori intelligenti di grandi aziende ci hanno assicurato che andr\u00e0 tutto bene. Non ci poniamo la domanda: perch\u00e9, in realt\u00e0, tutto ci\u00f2 potrebbe funzionare? Esiste una qualche giustificazione formale per la correttezza di tali sistemi?<\/p>\n<p>Recentemente sono andato a <noindex><a rel=\"nofollow\" href=\"https:\/\/sptdc.ru\">una scuola di calcolo distribuito<\/a><\/noindex> e sono rimasto molto ispirato da questo tema. Le lezioni della scuola somigliavano pi\u00f9 a corsi di analisi matematica che a qualcosa legato ai sistemi informatici. Ma \u00e8 proprio cos\u00ec che un tempo venivano dimostrati gli algoritmi pi\u00f9 importanti che utilizziamo ogni giorno senza neanche accorgercene. <\/p>\n<p>Nella maggior parte dei moderni sistemi distribuiti si utilizza l'algoritmo di consenso Paxos e le sue varie modifiche. La cosa pi\u00f9 interessante \u00e8 che la validit\u00e0 e, in generale, la stessa possibile esistenza di questo algoritmo possono essere dimostrate semplicemente con carta e penna. Nel frattempo, nella pratica, l'algoritmo viene applicato in grandi sistemi operanti su un numero enorme di nodi nelle nuvole. <\/p>\n<p><b class=\"spoiler_title\">Un'illustrazione leggera di ci\u00f2 di cui si parler\u00e0 dopo: il problema dei due generali<\/b>Per riscaldarci, analizziamo <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\">il problema dei due generali<\/a><\/noindex>. <\/p>\n<p>Abbiamo due eserciti: uno rosso e uno bianco. Le forze bianche si trovano nella citt\u00e0 assediata. Le forze rosse, guidate dai generali A1 e A2, si sono dislocate ai due lati della citt\u00e0. Il compito dei rossi \u00e8 attaccare la citt\u00e0 bianca e vincere. Tuttavia, l'esercito di ciascun generale rosso \u00e8 pi\u00f9 piccolo di quello dei bianchi.<\/p>\n<p><img decoding=\"async\" alt=\"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti\" src=\"\/wp-content\/uploads\/2019\/08\/2a684a484d4f6cb3d4e33f2367206d9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe condizioni per la vittoria dei rossi: entrambi i generali devono attaccare simultaneamente per avere un vantaggio numerico sui bianchi. Per farlo, i generali A1 e A2 devono accordarsi tra loro. Se ciascuno attacca separatamente, i rossi perderanno. <\/p>\n<p>Per accordarsi, i generali A1 e A2 possono inviare messaggeri l'uno all'altro attraverso il territorio della citt\u00e0 bianca. Un messaggero pu\u00f2 raggiungere con successo il generale alleato o pu\u00f2 essere intercettato dal nemico. Il problema \u00e8: esiste una sequenza di comunicazioni tra i generali rossi (sequenza di invio di messaggeri da A1 a A2 e viceversa da A2 a A1) che garantisca che si accordino per attaccare all'ora X? Qui, per garanzie, si intende che entrambi i generali riceveranno una conferma inequivocabile che l'alleato (l'altro generale) attaccher\u00e0 esattamente all'orario stabilito X.<\/p>\n<p>Supponiamo che A1 invii un messaggero a A2 con il seguente messaggio: \u00abAttacchiamo oggi a mezzanotte!\u00bb. Il generale A1 non pu\u00f2 attaccare senza la conferma del generale A2. Se il messaggero di A1 \u00e8 arrivato, il generale A2 invia una conferma con il messaggio: \u00abS\u00ec, attacchiamo oggi a fracassare i bianchi\u00bb. Ma ora il generale A2 non sa se il suo messaggero \u00e8 arrivato o no, non ha garanzie che l'attacco sar\u00e0 simultaneo. Ora, il generale A2 ha di nuovo bisogno di una conferma.<\/p>\n<p>Se si approfondisce ulteriormente la loro comunicazione, si scoprir\u00e0 quanto segue: non importa quante volte si scambino messaggi, non esiste un modo per garantire che entrambi i generali siano informati che i loro messaggi sono stati ricevuti (dato che qualunque messaggero pu\u00f2 essere intercettato).<\/p>\n<p>Il problema dei due generali \u00e8 un'eccellente illustrazione di un sistema distribuito molto semplice, dove ci sono due nodi con una comunicazione inaffidabile. Questo significa che non abbiamo la garanzia al 100% che si sincronizzeranno. Di problemi simili, ma su una scala pi\u00f9 ampia, si parler\u00e0 pi\u00f9 avanti nell'articolo.<\/p>\n<h2>Introduciamo il concetto di sistemi distribuiti.<\/h2>\n<p>\nUn sistema distribuito \u00e8 un gruppo di computer (che chiameremo nodi) in grado di scambiarsi messaggi. Ogni singolo nodo \u00e8 un'entit\u00e0 autonoma. Un nodo pu\u00f2 elaborare compiti in modo indipendente, ma per interagire con altri nodi deve inviare e ricevere messaggi. <\/p>\n<p>Come vengono implementati i messaggi, quali protocolli vengono utilizzati, non ci interessa in questo contesto. \u00c8 importante che i nodi del sistema distribuito possano scambiarsi dati inviando messaggi tra loro.<\/p>\n<p>La definizione stessa non \u00e8 molto complessa, ma \u00e8 necessario considerare che un sistema distribuito ha una serie di attributi che saranno importanti per noi.<\/p>\n<h4>Attributi dei sistemi distribuiti<\/h4>\n<p><\/p>\n<ol>\n<li><b>Concorrenza<\/b> \u2013 \u00e8 la possibilit\u00e0 che si verifichino eventi simultanei o concorrenti nel sistema. Inoltre, considereremo che gli eventi che si verificano su due nodi diversi sono potenzialmente concorrenti finch\u00e9 non abbiamo un ordine chiaro nella loro apparizione. E, di solito, non lo abbiamo.<\/li>\n<li><b>Assenza di orologi globali<\/b>. Non abbiamo un ordine chiaro degli eventi a causa dell'assenza di orologi globali. Nel mondo degli esseri umani siamo abituati ad avere orologi e tempo assoluto. Tutto cambia quando si parla di sistemi distribuiti. Anche gli orologi atomici super precisi hanno un drift, e ci possono essere situazioni in cui non possiamo dire quale dei due eventi si sia verificato per primo. Pertanto, non possiamo nemmeno fare affidamento sul tempo.<\/li>\n<li><b>Guasto indipendente dei nodi del sistema<\/b>. C'\u00e8 un'altra problematica: qualcosa pu\u00f2 andare storto semplicemente perch\u00e9 i nostri nodi non sono eterni. Un disco rigido pu\u00f2 guastarsi, una macchina virtuale nel cloud pu\u00f2 riavviarsi, la rete pu\u00f2 avere dei problemi e i messaggi possono andare persi. Inoltre, ci possono essere situazioni in cui i nodi funzionano, ma agiscono contro il sistema. Quest'ultima classe di problemi ha persino ricevuto un nome specifico: il problema <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\">dei generali bizantini<\/a><\/noindex>. L'esempio pi\u00f9 popolare di sistema distribuito con questo problema \u00e8 il Blockchain. Ma oggi non parleremo di questa specifica classe di problemi. Ci interesseremo a situazioni in cui uno o pi\u00f9 nodi possono andarsene in tilt.<\/li>\n<li><b>Modelli di comunicazione (modelli di scambio di messaggi) tra nodi<\/b>Abbiamo gi\u00e0 stabilito che i nodi comunicano attraverso lo scambio di messaggi. Ci sono due modelli di scambio di messaggi noti: sincrono e asincrono.<\/li>\n<\/ol>\n<p><\/p>\n<h4>Modelli di comunicazione tra nodi nei sistemi distribuiti<\/h4>\n<p>\n<b>Modello sincrono<\/b> \u2013 sappiamo esattamente che c'\u00e8 una delta di tempo finita nota, entro la quale il messaggio arriva garantito da un nodo all'altro. Se questo tempo scade e il messaggio non \u00e8 arrivato, possiamo dire con certezza che il nodo \u00e8 guasto. In questo modello abbiamo un tempo di attesa prevedibile. <\/p>\n<p><b>Modello asincrono<\/b> \u2013 nei modelli asincroni, consideriamo che il tempo di attesa sia finito, ma non esiste una delta di tempo dopo la quale possiamo garantire che il nodo \u00e8 guasto. Cio\u00e8, il tempo di attesa per un messaggio da un nodo pu\u00f2 essere arbitrariamente lungo. Questa \u00e8 una definizione importante, e ne parleremo ulteriormente. <\/p>\n<h2>Il concetto di consenso nei sistemi distribuiti<\/h2>\n<p>\nPrima di definire formalmente il concetto di consenso, consideriamo un esempio di situazione in cui ci serve, ovvero \u2013 <b>Replica della macchina di stato<\/b>. <\/p>\n<p>Abbiamo un certo log distribuito. Vorremmo che fosse coerente e contenesse dati identici su tutti i nodi del sistema distribuito. Quando uno dei nodi apprende un nuovo valore che intende registrare nel log, il suo compito \u00e8 proporre questo valore a tutti gli altri nodi, affinch\u00e9 il log si aggiorni su tutti i nodi e il sistema passi a un nuovo stato coerente. \u00c8 importante che i nodi si mettano d'accordo tra di loro: tutti i nodi concordano che il nuovo valore proposto sia corretto, tutti i nodi accettano questo valore, e solo in questo caso possono tutti registrare il nuovo valore nel log. <\/p>\n<p>In altre parole: nessuno dei nodi ha obiettato di avere informazioni pi\u00f9 aggiornate, e che il valore proposto \u00e8 errato. L'accordo tra i nodi e il consenso su un unico valore accettato corretto \u00e8 il consenso in un sistema distribuito. Successivamente parleremo degli algoritmi che permettono a un sistema distribuito di raggiungere garantito il consenso.<br \/>\n<img decoding=\"async\" alt=\"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti\" src=\"\/wp-content\/uploads\/2019\/08\/300b0834985d5d29286a83b00e6775a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIn modo pi\u00f9 formale, possiamo definire l'algoritmo di consenso (o semplicemente algoritmo di consenso) come una funzione che trasforma un sistema distribuito da uno stato A a uno stato B. Questo stato \u00e8 accettato da tutti i nodi, e tutti i nodi possono confermarlo. Si scopre che questa operazione non \u00e8 cos\u00ec banale come sembra a prima vista.<\/p>\n<h4>Propriet\u00e0 dell'algoritmo di consenso<\/h4>\n<p>\nL'algoritmo di consenso deve avere tre propriet\u00e0 affinch\u00e9 il sistema possa continuare ad esistere e avere qualche progresso nel passaggio da uno stato all'altro:<\/p>\n<ol>\n<li><b>Accordo <\/b> \u2013 tutti i nodi funzionanti devono accettare lo stesso valore (in articoli questa propriet\u00e0 \u00e8 talvolta indicata come propriet\u00e0 di sicurezza). Tutti i nodi attualmente operativi (che non sono offline e non hanno perso il contatto con gli altri) devono arrivare a un accordo e accettare un certo valore finale comune.\n<p>\u00c8 importante capire che i nodi nel sistema distribuito che stiamo considerando vogliono mettersi d'accordo. Vale a dire, stiamo parlando di sistemi in cui qualcosa potrebbe semplicemente guastarsi (ad esempio, un nodo potrebbe guastarsi), ma in questo sistema non ci sono nodi che lavorano intenzionalmente contro gli altri (il problema dei generali bizantini). Grazie a questa propriet\u00e0, il sistema rimane consistente.<\/li>\n<li><b>Integrit\u00e0 <\/b> \u2013 se tutti i nodi funzionanti offrono lo stesso valore <b>v<\/b>, allora ogni nodo funzionante deve accettare questo valore <b>v<\/b>. <\/li>\n<li><b>Terminazione <\/b>\u2013 tutti i nodi funzionanti alla fine accetteranno un certo valore (propriet\u00e0 di vivacit\u00e0), il che consente all'algoritmo di progredire nel sistema. Ogni singolo nodo funzionante deve, prima o poi, accettare un valore finale e confermarlo: \"Per me, questo valore \u00e8 vero, sono d'accordo con l'intero sistema\".<\/li>\n<\/ol>\n<p><\/p>\n<h4>Esempio di funzionamento dell'algoritmo di consenso<\/h4>\n<p>\nFinch\u00e9 le propriet\u00e0 dell'algoritmo potrebbero non essere del tutto chiare. Illustriamo quindi, con un esempio, quali fasi attraversa il pi\u00f9 semplice algoritmo di consenso in un sistema con un modello di scambio messaggi sincrono, in cui tutti i nodi funzionano come previsto, i messaggi non vengono persi e niente si rompe (\u00e8 davvero possibile che accada?).<\/p>\n<ol>\n<li>Tutto inizia con la proposta di matrimonio (Propose). Supponiamo che un cliente si sia connesso al nodo chiamato \"Nodo 1\" e abbia avviato una transazione, inviando al nodo un nuovo valore \u2013 O. Da questo momento in poi, chiameremo \"Nodo 1\" <b>proposer<\/b>. Come proposer, \"Nodo 1\" deve ora notificare l'intero sistema che ha nuovi dati e invia a tutti gli altri nodi messaggi: \"Guardate! Ho ricevuto il valore 'O' e voglio scriverlo! Vi chiedo di confermare che lo scriverete anch'esso nel vostro registro.\"\n<p><img decoding=\"async\" alt=\"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti\" src=\"\/wp-content\/uploads\/2019\/08\/bd6a9394229b8a2a5b0bf987ba53500b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> La fase successiva \u00e8 il voto sul valore proposto (Voting). A cosa serve? Pu\u00f2 accadere che ad altri nodi siano arrivati dati pi\u00f9 aggiornati, e che abbiano informazioni relative alla stessa transazione.\n<p><img decoding=\"async\" alt=\"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti\" src=\"\/wp-content\/uploads\/2019\/08\/7080d6222971c6bab012410ef9e074e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuando il nodo \"Nodo 1\" invia la sua proposta, gli altri nodi controllano nei loro registri i dati relativi a questo evento. Se non ci sono contraddizioni, i nodi dichiarano: \"S\u00ec, non ho altri dati relativi a questo evento. Il valore 'O' \u00e8 l'informazione pi\u00f9 recente che abbiamo ricevuto.\" <\/p>\n<p>In ogni altro caso, i nodi possono rispondere a \"Nodo 1\": \"Ascolta! Ho dati pi\u00f9 aggiornati su questa transazione. Non 'O', ma qualcosa di migliore.\"<\/p>\n<p>Nella fase di voto, i nodi giungono a una decisione: o tutti accettano un valore, oppure qualcuno di essi vota contro, indicando di avere dati pi\u00f9 recenti. <\/li>\n<li> Se il round di voto ha avuto successo e tutti sono stati favorevoli, il sistema passa a una nuova fase: l'accettazione del valore (Accept). \"Nodo 1\" raccoglie tutte le risposte degli altri nodi e comunica: \"Tutti hanno concordato sul valore 'O'! Ora dichiaro ufficialmente che 'O' \u00e8 il nostro nuovo valore, unico per tutti! Annotatevi questo, non dimenticatelo. Scrivetelo nel vostro registro!\"\n<p><img decoding=\"async\" alt=\"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti\" src=\"\/wp-content\/uploads\/2019\/08\/c4bc2af053a27d7030824d45c3ad6def.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Gli altri nodi inviano conferma (Accepted) che hanno annotato il valore 'O', che nel frattempo non \u00e8 arrivato nulla di nuovo (una sorta di commit in due fasi). Dopo questo evento significativo, consideriamo che la transazione distribuita sia stata completata.<br \/>\n <img decoding=\"async\" alt=\"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti\" src=\"\/wp-content\/uploads\/2019\/08\/2a9c49729f2607099385fee29f45d1f3.jpg\" style=\"display:block;margin: 0 auto;\" \/> <\/li>\n<\/ol>\n<p>\nPertanto, l'algoritmo di consenso in un caso semplice consiste in quattro passaggi: propose, voto (voting), accettazione (accept), conferma dell'accettazione (accepted).<\/p>\n<p>Se in qualche fase non riusciamo a raggiungere un consenso, l'algoritmo viene riavviato, tenendo conto delle informazioni fornite dai nodi che hanno rifiutato di confermare il valore proposto.<\/p>\n<h2>L'algoritmo di consenso in un sistema asincrono<\/h2>\n<p>\nFino a questo momento tutto andava bene, poich\u00e9 stavamo trattando un modello di scambio di messaggi sincrono. Ma sappiamo che nel mondo moderno siamo abituati a fare tutto in modo asincrono. Come funziona quindi un algoritmo simile in un sistema con un modello di scambio di messaggi asincrono, dove consideriamo che il tempo di attesa per una risposta da un nodo possa essere arbitrariamente lungo (per inciso, l'uscita di un nodo fuori gioco pu\u00f2 anche essere vista come un esempio in cui un nodo potrebbe rispondere con arbitraria lentezza). <\/p>\n<blockquote><p>Ora, quando sappiamo come funziona in linea di principio l'algoritmo di consenso, la domanda per i lettori curiosi che sono arrivati a questo punto \u00e8: quanti nodi in un sistema di N nodi con un modello di messaggi asincroni possono uscire fuori gioco affinch\u00e9 il sistema possa comunque raggiungere il consenso?<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">La risposta corretta e la motivazione sono nel spoiler.<\/b>Risposta corretta: <b>0<\/b>. Se almeno un nodo in un sistema asincrono esce fuori gioco, il sistema non potr\u00e0 raggiungere il consenso. Questa affermazione \u00e8 dimostrata nel noto teorema FLP (1985, Fischer, Lynch, Paterson, link all'originale alla fine dell'articolo): \"L'impossibilit\u00e0 di raggiungere un consenso distribuito in caso di guasto di almeno un nodo\".<br \/>\n<img decoding=\"async\" alt=\"Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti\" src=\"\/wp-content\/uploads\/2019\/08\/92417aafe00841aaa41cbefe0386e21a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRagazzi, allora abbiamo un problema, siamo abituati a fare tutto in modo asincrono. E ora ci troviamo in questa situazione. Come andiamo avanti? <\/p>\n<p>Abbiamo parlato della teoria, della matematica. Cosa significa \"il consenso non pu\u00f2 essere raggiunto\", traducendo dal linguaggio matematico al nostro \u2013 ingegneristico? Significa che \"non sempre pu\u00f2 essere raggiunto\", cio\u00e8 esiste un caso in cui il consenso non \u00e8 raggiungibile. Ma quale \u00e8 questo caso? <\/p>\n<p>\u00c8 proprio la violazione della propriet\u00e0 di vivacit\u00e0, descritta sopra. Non abbiamo consenso comune e il sistema non pu\u00f2 avere progresso (non pu\u00f2 completarsi in un tempo finito) nel caso in cui non riceviamo risposta da tutti i nodi. Perch\u00e9 in un sistema asincrono non abbiamo un tempo di risposta prevedibile e non possiamo sapere se un nodo \u00e8 fuori gioco o semplicemente sta rispondendo lentamente.<\/p>\n<p>Ma in pratica possiamo trovare una soluzione. Supponiamo che il nostro algoritmo possa funzionare a lungo in caso di guasti (potenzialmente pu\u00f2 funzionare indefinitamente). Ma nella maggior parte delle situazioni, quando la maggior parte dei nodi funziona correttamente, avremo progresso nel sistema. <\/p>\n<p>Nella pratica, abbiamo a che fare con modelli di comunicazione parzialmente sincroni. La parziale sincronicit\u00e0 \u00e8 intesa come segue: generalmente abbiamo un modello asincrono, ma si introduce formalmente il concetto di \"tempo di stabilizzazione globale\" in un certo momento. <\/p>\n<p>Questo momento potrebbe non verificarsi per un tempo indefinito, ma un giorno deve arrivare. Suoner\u00e0 la sveglia virtuale e da quel momento possiamo prevedere la delta temporale per cui i messaggi arriveranno. Da quel momento, il sistema passa da asincrono a sincrono. Nella pratica, trattiamo proprio con sistemi di questo tipo. <\/p>\n<h2>L'algoritmo Paxos risolve problemi di consenso<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Paxos_(computer_science)\">Paxos <\/a><\/noindex> \u00e8 una famiglia di algoritmi che risolve il problema del consenso per sistemi parzialmente sincroni, a condizione che alcuni nodi possano guastarsi. L'autore di Paxos \u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Leslie_Lamport\">Leslie Lamport<\/a><\/noindex>. Ha proposto una dimostrazione formale dell'esistenza e correttezza dell'algoritmo nel 1989. <\/p>\n<p>Ma la dimostrazione si \u00e8 rivelata tutt'altro che banale. La prima pubblicazione \u00e8 stata rilasciata solo nel 1998 (33 pagine) con la descrizione dell'algoritmo. Si \u00e8 rivelata estremamente difficile da comprendere, e nel 2001 \u00e8 stata pubblicata una spiegazione dell'articolo che ha occupato 14 pagine. Le dimensioni delle pubblicazioni sono indicate per dimostrare che in realt\u00e0 il problema del consenso \u00e8 piuttosto complesso e dietro a tali algoritmi c'\u00e8 un enorme lavoro delle menti pi\u00f9 brillanti.<\/p>\n<blockquote><p>\u00c8 interessante notare che lo stesso Leslie Lamport nella sua lezione ha osservato che nella seconda articolo di spiegazione c'\u00e8 un'affermazione, una riga (non ha specificato quale), che pu\u00f2 essere interpretata in modi diversi. E per questo motivo, un gran numero di implementazioni moderne di Paxos non funzionano del tutto correttamente. <\/p><\/blockquote>\n<p>\nUn'analisi dettagliata del funzionamento di Paxos richiederebbe pi\u00f9 di un articolo, quindi cercher\u00f2 di trasmettere molto brevemente l'idea principale dell'algoritmo. Nei link alla fine del mio articolo troverete materiali per un approfondimento su questo argomento.<\/p>\n<h4>Ruoli in Paxos<\/h4>\n<p>\nNell'algoritmo Paxos c'\u00e8 il concetto di ruoli. Consideriamo i tre principali (ci sono modifiche con ruoli aggiuntivi):<\/p>\n<ol>\n<li><b>Proposers (possono anche essere utilizzati i termini: leader o coordinatori)<\/b>Questi sono i ragazzi che apprendono un nuovo valore dall'utente e svolgono il ruolo di leader. Il loro compito \u00e8 avviare un round per proporre un nuovo valore e coordinare le ulteriori azioni dei nodi. Inoltre, Paxos consente la presenza di pi\u00f9 leader in determinate situazioni.<\/li>\n<li><b>Accettatori (Votanti)<\/b>Questi sono i nodi che votano per l'accettazione o il rifiuto di un certo valore. Il loro ruolo \u00e8 molto importante, poich\u00e9 dipende da loro la decisione su quale stato passer\u00e0 (o non passer\u00e0) il sistema dopo la fase successiva dell'algoritmo di consenso.<\/li>\n<li><b>Apprendisti<\/b>I nodi che semplicemente accettano e registrano il nuovo valore accettato quando lo stato del sistema \u00e8 cambiato. Non prendono decisioni, ma ricevono dati e possono fornirli all'utente finale. <\/li>\n<\/ol>\n<p>\nUn nodo pu\u00f2 ricoprire pi\u00f9 ruoli in diverse situazioni. <\/p>\n<h4>Il concetto di quorum<\/h4>\n<p>\nPresupponiamo di avere un sistema costituito da <b>N<\/b> nodi. E di questi, al massimo <b>F<\/b> nodi possono guastarsi. Se F nodi si guastano, allora nel nostro cluster devono esserci almeno <b>2F + 1<\/b> nodi acceptor. <\/p>\n<p>Questo \u00e8 necessario affinch\u00e9 abbiamo sempre, anche nella situazione peggiore, un numero maggiore di nodi \"buoni\", funzionanti correttamente. Cio\u00e8, abbiamo bisogno di <b>F + 1<\/b> nodi \"buoni\" che abbiano concordato, e il valore finale sar\u00e0 accettato. Altrimenti, potrebbe verificarsi una situazione in cui diversi gruppi locali accettano valori diversi e non possono accordarsi tra loro. Pertanto, abbiamo bisogno di una maggioranza assoluta per vincere nella votazione.<\/p>\n<h4>L'idea generale del funzionamento dell'algoritmo di consenso Paxos<\/h4>\n<p>\nL'algoritmo Paxos prevede due grandi fasi, ciascuna delle quali \u00e8 suddivisa in due passaggi:<\/p>\n<ol>\n<li><b>Fase 1a: Preparare<\/b>. Durante la fase di preparazione, il leader (proposer) informa tutti i nodi: \u00abIniziamo una nuova fase di voto. Abbiamo un nuovo turno. Il numero di questo turno \u00e8 n. Adesso iniziamo a votare\u00bb. Finora ha solo comunicato l'inizio di un nuovo ciclo, senza fornire un nuovo valore. L'obiettivo di questa fase \u00e8 avviare un nuovo turno e comunicare a tutti il suo numero unico. Il numero del turno \u00e8 importante, deve essere un valore maggiore rispetto a tutti i numeri di voto precedenti da tutti i leader precedenti. Infatti, \u00e8 grazie al numero del turno che gli altri nodi nel sistema capiranno quanto siano aggiornati i dati del leader. Probabilmente, altri nodi hanno gi\u00e0 risultati di voti provenienti da turni molto pi\u00f9 recenti e semplicemente informeranno il leader che \u00e8 rimasto indietro.<\/li>\n<li><b>Fase 1b: Promessa<\/b>. Quando i nodi acceptor ricevono il numero di una nuova fase di voto, ci sono due possibili esiti: \n<ul>\n<li>Il numero n del nuovo voto \u00e8 maggiore di qualsiasi numero di voti precedenti a cui l'acceptor ha partecipato. In questo caso, l'acceptor invia al leader una promessa di non partecipare a ulteriori votazioni con un numero inferiore a n. Se l'acceptor ha gi\u00e0 votato per qualcosa (cio\u00e8 \u00e8 gi\u00e0 nella seconda fase ha accettato un valore), allora allega alla sua promessa il valore accettato e il numero di voto a cui ha partecipato.<\/li>\n<li>Altrimenti, se l'acceptor \u00e8 gi\u00e0 a conoscenza di una votazione con un numero maggiore, pu\u00f2 semplicemente ignorare la fase di preparazione e non rispondere al leader.<\/li>\n<\/ul>\n<\/li>\n<li><b>Fase 2a: Accettazione<\/b>. Il leader deve attendere la risposta dal quorum (maggioranza dei nodi nel sistema) e, se riceve il numero necessario di risposte, ha due possibili sviluppi: \n<ul>\n<li>Alcuni degli acceptor hanno inviato valori per cui hanno gi\u00e0 votato. In questo caso, il leader sceglie il valore dal voto con il numero massimo. Chiamiamo questo valore x e invia a tutti i nodi un messaggio del tipo: \u00abAccept (n, x)\u00bb, dove il primo valore \u00e8 il numero di voto del proprio passo Propose e il secondo valore \u00e8 quello per cui ci si riunisce, cio\u00e8 il valore per cui stiamo votando.<\/li>\n<li>Se nessuno degli acceptor ha inviato alcun valore, ma semplicemente ha promesso di votare in questo turno, il leader pu\u00f2 proporre loro di votare per il proprio valore, il valore per cui \u00e8 diventato leader. Chiamiamolo y. Invia a tutti i nodi un messaggio del tipo: \u00abAccept (n, y)\u00bb, in analogia con il precedente esito.<\/li>\n<\/ul>\n<\/li>\n<li><b>Fase 2b: Accettato<\/b>. Dopodich\u00e9, i nodi acceptor, al ricevimento del messaggio \u00abAccept(&hellip;)\u00bb dal leader, concordano con lui (inviando a tutti i nodi una conferma di essere d'accordo con il nuovo valore) solo se non hanno promesso a qualche (altro) leader di partecipare ai voti con numero di turno <b>n' &gt; n<\/b>, altrimenti ignorano la richiesta di conferma.\n<p>Se il leader ha ricevuto la risposta della maggioranza dei nodi, e tutti hanno confermato il nuovo valore, allora il nuovo valore viene considerato accettato. Evviva! Se invece non viene raggiunta la maggioranza o ci sono nodi che si rifiutano di accettare il nuovo valore, tutto ricomincia da capo.<\/li>\n<\/ol>\n<p>\nEcco come funziona l'algoritmo Paxos. Ogni fase di questi ha molte sfumature, non abbiamo praticamente esaminato i vari tipi di guasti, i problemi dei molteplici leader e molto altro, ma lo scopo di questo articolo \u00e8 semplicemente introdurre il lettore al mondo dei calcoli distribuiti a un livello elevato.<\/p>\n<p>Vale anche la pena notare che Paxos non \u00e8 l'unico nel suo genere, ci sono altri algoritmi, ad esempio <noindex><a rel=\"nofollow\" href=\"https:\/\/raft.github.io\/\">Raft<\/a><\/noindex>, ma questo \u00e8 un tema per un altro articolo.<\/p>\n<h2>Link a materiali per ulteriori studi<\/h2>\n<p>\nLivello \u00abprincipiante\u00bb:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/s\/story\/lets-take-a-crack-at-understanding-distributed-consensus-dad23d0dc95\">Come funziona il consenso distribuito?<\/a><\/noindex>, Preethi Kasireddy, articolo di blog su Medium<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@nevverlander\/paxos-made-simple-for-real-aa221be7d91b\">Paxos reso semplice. Per davvero<\/a><\/noindex>, Adi Kancherla, articolo di blog su Medium<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ittaiab.github.io\/\">Pensieri decentralizzati<\/a><\/noindex>, Ittai Abraham, blog<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ittaiab.github.io\/2019-06-01-2019-5-31-models\/\">Sincronizzazione, Asincronizzazione e Sincronizzazione parziale<\/a><\/noindex>, Ittai Abraham, articolo di blog<\/li>\n<\/ul>\n<p>\nLivello \u00abLeslie Lamport\u00bb:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/groups.csail.mit.edu\/tds\/papers\/Lynch\/jacm85.pdf\">Impossibilit\u00e0 di consenso distribuito con un processo guasto (impossibilit\u00e0 di FLP)<\/a><\/noindex>, Fischer, Lynch e Paterson, articolo di ricerca, 1985<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lamport.azurewebsites.net\/pubs\/lamport-paxos.pdf\">Il Parlamento a tempo parziale<\/a><\/noindex>, Leslie Lamport, articolo di ricerca, 1998<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lamport.azurewebsites.net\/pubs\/paxos-simple.pdf\">Paxos reso semplice<\/a><\/noindex>, Leslie Lamport, articolo di ricerca, 2001<\/li>\n<\/ul>\n<p>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47Il gatto di Schr\u00f6dinger senza scatola: il problema del consenso nei sistemi distribuiti | ProHoster","description":"Immaginiamo. In una stanza ci sono 5 gatti chiusi, e per andare a svegliare il padrone devono tutti insieme concordare su questo, poich\u00e9 la porta possono aprirla solo in cinque spingendo tutti insieme.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/37335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=37335"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/37335\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/28009"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=37335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=37335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=37335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}