{"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\/es\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","title":{"rendered":"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Imaginemos. En una habitaci\u00f3n hay 5 gatos encerrados, y para ir a despertar a su due\u00f1o, necesitan ponerse de acuerdo entre ellos, ya que solo pueden abrir la puerta si empujan todos juntos. Si uno de los gatos es el gato de Schr\u00f6dinger, y los dem\u00e1s no saben sobre su decisi\u00f3n, surge la pregunta: \"\u00bfC\u00f3mo pueden lograrlo?\" <\/p>\n<p>En este art\u00edculo, explicar\u00e9 en un lenguaje sencillo la parte te\u00f3rica del mundo de los sistemas distribuidos y los principios de su funcionamiento. Tambi\u00e9n examinar\u00e9 superficialmente la idea principal que subyace en Paxos. <\/p>\n<p><img decoding=\"async\" alt=\"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos\" 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 \/>\nCuando los desarrolladores utilizan infraestructuras en la nube, diversas bases de datos y trabajan en cl\u00fasteres de muchos nodos, est\u00e1n seguros de que los datos ser\u00e1n \u00edntegros, seguros y siempre accesibles. Pero, \u00bfde d\u00f3nde vienen esas garant\u00edas?<\/p>\n<p>En esencia, las garant\u00edas que tenemos son las garant\u00edas del proveedor. Est\u00e1n descritas en la documentaci\u00f3n de la siguiente manera: \"Este servicio es lo suficientemente confiable, tiene un SLA establecido, no se preocupe, todo funcionar\u00e1 distribuido como usted espera.\" <\/p>\n<p>Tendemos a creer en lo mejor, ya que los directores de grandes empresas nos aseguraron que todo estar\u00e1 bien. No nos hacemos la pregunta: \u00bfpor qu\u00e9, en realidad, esto puede funcionar? \u00bfHay alguna justificaci\u00f3n formal para el correcto funcionamiento de tales sistemas?<\/p>\n<p>Recientemente fui a <noindex><a rel=\"nofollow\" href=\"https:\/\/sptdc.ru\">una escuela sobre computaci\u00f3n distribuida<\/a><\/noindex> y me inspir\u00e9 mucho en esta tem\u00e1tica. Las conferencias en la escuela se parec\u00edan m\u00e1s a clases de an\u00e1lisis matem\u00e1tico que a algo relacionado con sistemas inform\u00e1ticos. Pero as\u00ed es como se demostraron los algoritmos m\u00e1s importantes que usamos todos los d\u00edas, sin que siquiera lo sospechemos. <\/p>\n<p>En la mayor\u00eda de los sistemas distribuidos modernos se usa el algoritmo de consenso Paxos y sus diversas modificaciones. Lo m\u00e1s impresionante es que la fundamentaci\u00f3n y, en principio, la posibilidad misma de la existencia de este algoritmo pueden demostrarse f\u00e1cilmente con solo un bol\u00edgrafo y papel. Al mismo tiempo, el algoritmo se aplica en grandes sistemas que funcionan en un gran n\u00famero de nodos en la nube. <\/p>\n<p><b class=\"spoiler_title\">Una ilustraci\u00f3n ligera de lo que se tratar\u00e1 a continuaci\u00f3n: el problema de los dos generales<\/b>Para calentar, analicemos <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\">el problema de los dos generales<\/a><\/noindex>. <\/p>\n<p>Tenemos dos ej\u00e9rcitos: el rojo y el blanco. Las tropas blancas est\u00e1n acantonadas en la ciudad sitiada. Las tropas rojas, lideradas por los generales A1 y A2, se encuentran a ambos lados de la ciudad. La tarea de los rojos es atacar la ciudad blanca y ganar. Sin embargo, el ej\u00e9rcito de cada general rojo es m\u00e1s peque\u00f1o que el de los blancos.<\/p>\n<p><img decoding=\"async\" alt=\"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos\" src=\"\/wp-content\/uploads\/2019\/08\/2a684a484d4f6cb3d4e33f2367206d9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLas condiciones para que los rojos ganen son: ambos generales deben atacar al mismo tiempo para tener superioridad num\u00e9rica sobre los blancos. Para ello, los generales A1 y A2 necesitan llegar a un acuerdo entre ellos. Si cada uno ataca por separado, los rojos perder\u00e1n. <\/p>\n<p>Para llegar a un acuerdo, los generales A1 y A2 pueden enviar mensajeros a trav\u00e9s del territorio de la ciudad blanca. Un mensajero puede llegar con \u00e9xito al general aliado o puede ser interceptado por el enemigo. La pregunta es: \u00bfexiste una secuencia de comunicaciones entre los generales rojos (una secuencia de env\u00edos de mensajeros de A1 a A2 y viceversa, de A2 a A1) en la que se aseguren de acordar un ataque a la hora X? Aqu\u00ed, por garant\u00edas se entiende que ambos generales tendr\u00e1n una confirmaci\u00f3n inequ\u00edvoca de que su aliado (el otro general) atacar\u00e1 exactamente a la hora acordada X.<\/p>\n<p>Supongamos que A1 env\u00eda un mensajero a A2 con el mensaje: '\u00a1Atacamos hoy a la medianoche!'. El general A1 no puede atacar sin la confirmaci\u00f3n del general A2. Si el mensajero de A1 llega, el general A2 env\u00eda su confirmaci\u00f3n con el mensaje: 'S\u00ed, vamos a derribar a los blancos hoy'. Pero ahora el general A2 no sabe si su mensajero lleg\u00f3 o no, no tiene garant\u00edas de que el ataque sea simult\u00e1neo. Ahora, el general A2 necesita otra vez una confirmaci\u00f3n.<\/p>\n<p>Si se detalla a\u00fan m\u00e1s su comunicaci\u00f3n, se descubrir\u00e1 lo siguiente: por mucho que haya ciclos de intercambio de mensajes, no hay forma de garantizar que ambos generales sean notificados de que sus mensajes han sido recibidos (suponiendo que cualquiera de los mensajeros pueda ser interceptado).<\/p>\n<p>La tarea de los dos generales es una excelente ilustraci\u00f3n de un sistema distribuido muy simple, donde hay dos nodos con comunicaci\u00f3n poco fiable. As\u00ed que no tenemos una garant\u00eda del 100% de que se sincronicen. Sobre problemas similares, pero en una escala mayor, se hablar\u00e1 m\u00e1s adelante en el art\u00edculo.<\/p>\n<h2>Introducimos el concepto de sistemas distribuidos.<\/h2>\n<p>\nUn sistema distribuido es un conjunto de computadoras (a partir de ahora las llamaremos nodos) que pueden intercambiar mensajes. Cada nodo individual es una entidad aut\u00f3noma. Un nodo puede procesar tareas de manera independiente, pero para interactuar con otros nodos, necesita enviar y recibir mensajes. <\/p>\n<p>C\u00f3mo se implementan exactamente los mensajes y qu\u00e9 protocolos se utilizan no nos interesa en este contexto. Lo importante es que los nodos del sistema distribuido pueden intercambiar datos entre s\u00ed enviando mensajes.<\/p>\n<p>La propia definici\u00f3n no parece muy complicada, pero hay que tener en cuenta que un sistema distribuido tiene una serie de atributos que ser\u00e1n importantes para nosotros.<\/p>\n<h4>Atributos de los sistemas distribuidos<\/h4>\n<p><\/p>\n<ol>\n<li><b>Concurrencia<\/b> es la posibilidad de que ocurran eventos simult\u00e1neos o concurrentes en el sistema. M\u00e1s a\u00fan, consideraremos que los eventos que ocurren en dos nodos diferentes son potencialmente concurrentes hasta que tengamos un orden claro en el que esos eventos suceden. Y, por lo general, no lo tenemos.<\/li>\n<li><b>Ausencia de relojes globales<\/b>. No tenemos un orden claro de los eventos debido a la ausencia de relojes globales. En el mundo normal de los humanos, estamos acostumbrados a tener relojes y tiempo absoluto. Todo cambia cuando hablamos de sistemas distribuidos. Incluso los relojes at\u00f3micos m\u00e1s precisos tienen un desv\u00edo, y pueden surgir situaciones en las que no podemos decir cu\u00e1l de los dos eventos ocurri\u00f3 primero. Por lo tanto, tambi\u00e9n no podemos confiar en el tiempo.<\/li>\n<li><b>Fallo independiente de los nodos del sistema<\/b>. Hay otro problema: algo puede salir mal simplemente porque nuestros nodos no son eternos. Un disco duro puede fallar, una m\u00e1quina virtual en la nube puede reiniciarse, puede haber un parpadeo en la red y los mensajes se pierden. Adem\u00e1s, es posible que haya situaciones en las que los nodos funcionen, pero en contra del sistema. Esta \u00faltima clase de problemas incluso tiene un nombre espec\u00edfico: el problema de <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\">los generales bizantinos<\/a><\/noindex>. El ejemplo m\u00e1s popular de un sistema distribuido con este problema es el Blockchain. Pero hoy no vamos a considerar esta clase especial de problemas. Nos interesar\u00e1n las situaciones en las que uno o varios nodos pueden fallar.<\/li>\n<li><b>Modelos de comunicaci\u00f3n (modelos de intercambio de mensajes) entre nodos<\/b>. Ya hemos determinado que los nodos se comunican mediante el intercambio de mensajes. Hay dos modelos de intercambio de mensajes conocidos: s\u00edncrono y as\u00edncrono.<\/li>\n<\/ol>\n<p><\/p>\n<h4>Modelos de comunicaci\u00f3n entre nodos en sistemas distribuidos<\/h4>\n<p>\n<b>Modelo s\u00edncrono<\/b> \u2013 sabemos con certeza que hay una delta de tiempo finita conocida, durante la cual el mensaje llega garantizado de un nodo a otro. Si este tiempo ha pasado y no ha llegado el mensaje, podemos afirmar con confianza que el nodo ha fallado. En este modelo, tenemos un tiempo de espera predecible. <\/p>\n<p><b>Modelo as\u00edncrono<\/b> \u2013 en los modelos as\u00edncronos consideramos que el tiempo de espera es finito, pero no existe tal delta de tiempo despu\u00e9s de la cual se puede garantizar que un nodo ha fallado. Es decir, el tiempo de espera del mensaje de un nodo puede ser arbitrariamente largo. Esta es una definici\u00f3n importante, y hablaremos de ello m\u00e1s adelante. <\/p>\n<h2>El concepto de consenso en sistemas distribuidos<\/h2>\n<p>\nAntes de definir formalmente el concepto de consenso, consideremos un ejemplo de situaci\u00f3n en la que lo necesitamos, a saber \u2013 <b>Replicaci\u00f3n de M\u00e1quina de Estado<\/b>. <\/p>\n<p>Tenemos un registro distribuido. Nos gustar\u00eda que fuera consistente y contuviera datos id\u00e9nticos en todos los nodos del sistema distribuido. Cuando alguno de los nodos conoce un nuevo valor que va a registrar en el log, su tarea es proponer este valor a todos los dem\u00e1s nodos, para que el log se actualice en todos los nodos, y el sistema pase a un nuevo estado consistente. Es importante que los nodos se pongan de acuerdo: todos los nodos deben estar de acuerdo en que el nuevo valor propuesto es correcto, todos los nodos deben aceptar este valor, y solo en este caso todos pueden registrar el nuevo valor en el log. <\/p>\n<p>En otras palabras: ninguno de los nodos objet\u00f3 que tuviera informaci\u00f3n m\u00e1s actualizada, ni que el valor propuesto fuera incorrecto. El acuerdo entre los nodos y el consenso sobre el valor \u00fanico correcto aceptado es el consenso en el sistema distribuido. M\u00e1s adelante hablaremos sobre los algoritmos que permiten al sistema distribuido alcanzar el consenso de manera garantizada.<br \/>\n<img decoding=\"async\" alt=\"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos\" src=\"\/wp-content\/uploads\/2019\/08\/300b0834985d5d29286a83b00e6775a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe manera m\u00e1s formal, podemos definir el algoritmo de consenso (o simplemente el algoritmo de consenso) como una funci\u00f3n que lleva a un sistema distribuido de un estado A a un estado B. Adem\u00e1s, este estado es aceptado por todos los nodos, y todos los nodos pueden confirmarlo. Como se descubre, esta tarea no es tan trivial como parece a primera vista.<\/p>\n<h4>Propiedades del algoritmo de consenso<\/h4>\n<p>\nUn algoritmo de consenso debe poseer tres propiedades para que el sistema contin\u00fae existiendo y tenga alg\u00fan progreso al pasar de un estado a otro:<\/p>\n<ol>\n<li><b>Acuerdo <\/b> \u2013 todos los nodos que funcionan correctamente deben aceptar el mismo valor (en los art\u00edculos, esta propiedad tambi\u00e9n se conoce como propiedad de seguridad). Todos los nodos que est\u00e1n funcionando en este momento (que no han fallado y no han perdido conexi\u00f3n con los dem\u00e1s) deben llegar a un acuerdo y aceptar un valor com\u00fan final.\n<p>Aqu\u00ed es importante entender que los nodos en el sistema distribuido que estamos considerando quieren llegar a un acuerdo. Es decir, estamos hablando de sistemas donde algo puede fallar (por ejemplo, un nodo puede fallar), pero en este sistema no hay nodos que intencionalmente trabajen en contra de otros (la tarea de los generales bizantinos). Por esta propiedad, el sistema se mantiene consistente.<\/li>\n<li><b>Integridad <\/b> \u2014 si todos los nodos que funcionan correctamente proponen el mismo valor <b>v<\/b>, entonces cada nodo que funcione correctamente debe aceptar este valor <b>v<\/b>. <\/li>\n<li><b>Terminaci\u00f3n <\/b>\u2013 todos los nodos que funcionan correctamente eventualmente aceptar\u00e1n alg\u00fan valor (propiedad de vivacidad), lo que permite que el algoritmo tenga progreso en el sistema. Cada nodo que funcione correctamente debe, tarde o temprano, aceptar un valor final y confirmarlo: \"Para m\u00ed, este valor es verdadero, estoy de acuerdo con todo el sistema\".<\/li>\n<\/ol>\n<p><\/p>\n<h4>Ejemplo del funcionamiento del algoritmo de consenso<\/h4>\n<p>\nMientras que las propiedades del algoritmo pueden no ser del todo claras. Por lo tanto, ilustraremos con un ejemplo las etapas que pasa el algoritmo de consenso m\u00e1s simple en un sistema con un modelo de intercambio de mensajes s\u00edncrono, donde todos los nodos funcionan como se espera, los mensajes no se pierden y nada se rompe (\u00bfrealmente sucede eso?).<\/p>\n<ol>\n<li>Todo comienza con una proposici\u00f3n de mano y coraz\u00f3n (Propose). Supongamos que un cliente se ha conectado al nodo llamado \"Nodo 1\" y ha comenzado una transacci\u00f3n, enviando un nuevo valor al nodo: O. A partir de este momento, llamaremos a \"Nodo 1\" <b>proposer<\/b>. Como proposer, \"Nodo 1\" ahora debe notificar a todo el sistema que tiene nuevos datos, y env\u00eda mensajes a todos los dem\u00e1s nodos: \"\u00a1Miren! He recibido el valor \"O\", \u00a1y quiero que lo guarden! Por favor, confirmen que ustedes tambi\u00e9n guardar\u00e1n \"O\" en su registro.\"\n<p><img decoding=\"async\" alt=\"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos\" src=\"\/wp-content\/uploads\/2019\/08\/bd6a9394229b8a2a5b0bf987ba53500b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> La siguiente etapa es la votaci\u00f3n del valor propuesto (Voting). \u00bfPara qu\u00e9 sirve? Puede suceder que otros nodos hayan recibido informaci\u00f3n m\u00e1s reciente y tengan datos sobre esta misma transacci\u00f3n.\n<p><img decoding=\"async\" alt=\"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos\" src=\"\/wp-content\/uploads\/2019\/08\/7080d6222971c6bab012410ef9e074e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCuando el nodo \"Nodo 1\" env\u00eda su propuesta, los dem\u00e1s nodos revisan sus registros para este evento. Si no hay inconsistencias, los nodos declaran: \"S\u00ed, no tengo otros datos sobre este evento. El valor \"O\" es la informaci\u00f3n m\u00e1s reciente que hemos recibido.\" <\/p>\n<p>En cualquier otro caso, los nodos pueden responder a \"Nodo 1\": \"\u00a1Escucha! Tengo datos m\u00e1s recientes sobre esta transacci\u00f3n. No es \"O\", sino algo mejor.\"<\/p>\n<p>Durante la fase de votaci\u00f3n, los nodos llegan a una decisi\u00f3n: o todos aceptan un \u00fanico valor, o alguno de ellos vota en contra, indicando que tiene datos m\u00e1s recientes. <\/li>\n<li> Si la ronda de votaci\u00f3n ha sido exitosa y todos estuvieron a favor, el sistema pasa a una nueva etapa: la aceptaci\u00f3n del valor (Accept). \"Nodo 1\" re\u00fane todas las respuestas de los otros nodos y declara: \"\u00a1Todos han aceptado el valor \"O\"! Ahora anuncio oficialmente que \"O\" es nuestro nuevo valor, \u00a1el mismo para todos! Anoten en su cuadernito, no se olviden. \u00a1Reg\u00edstrenlo en su log!\"\n<p><img decoding=\"async\" alt=\"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos\" src=\"\/wp-content\/uploads\/2019\/08\/c4bc2af053a27d7030824d45c3ad6def.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Los dem\u00e1s nodos env\u00edan una confirmaci\u00f3n (Accepted) de que han registrado el valor \"O\", sin que haya llegado nada nuevo en este tiempo (una especie de compromiso de dos fases). Despu\u00e9s de este evento significativo, consideramos que la transacci\u00f3n distribuida se ha completado.<br \/>\n <img decoding=\"async\" alt=\"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos\" src=\"\/wp-content\/uploads\/2019\/08\/2a9c49729f2607099385fee29f45d1f3.jpg\" style=\"display:block;margin: 0 auto;\" \/> <\/li>\n<\/ol>\n<p>\nAs\u00ed, el algoritmo de consenso en un caso simple consta de cuatro pasos: proponer, votar (voting), aceptar (accept) y confirmar aceptaci\u00f3n (accepted).<\/p>\n<p>Si en alg\u00fan paso no logramos alcanzar un consenso, el algoritmo se reinicia, teniendo en cuenta la informaci\u00f3n que proporcionar\u00e1n los nodos que se negaron a confirmar el valor propuesto.<\/p>\n<h2>El algoritmo de consenso en un sistema as\u00edncrono<\/h2>\n<p>\nHasta ahora, todo hab\u00eda sido simple, ya que est\u00e1bamos hablando de un modelo de intercambio de mensajes sincr\u00f3nico. Pero sabemos que en el mundo moderno estamos acostumbrados a hacer todo de manera as\u00edncrona. \u00bfC\u00f3mo funciona un algoritmo similar en un sistema con un modelo de intercambio de mensajes as\u00edncrono, donde consideramos que el tiempo de espera para recibir una respuesta de un nodo puede ser indefinidamente largo? (Por cierto, la falla de un nodo tambi\u00e9n se puede considerar un ejemplo en el que un nodo puede responder durante un tiempo indefinido). <\/p>\n<blockquote><p>Ahora que entendemos c\u00f3mo funciona, en t\u00e9rminos generales, el algoritmo de consenso, planteo una pregunta a los lectores curiosos que han llegado hasta aqu\u00ed: \u00bfcu\u00e1ntos nodos en un sistema de N nodos con un modelo de mensajes as\u00edncrono pueden fallar para que el sistema a\u00fan pueda alcanzar el consenso?<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">La respuesta correcta y su justificaci\u00f3n se encuentran tras el spoiler.<\/b>La respuesta correcta es: <b>0<\/b>. Si al menos un nodo en un sistema as\u00edncrono falla, el sistema no podr\u00e1 alcanzar consenso. Esta afirmaci\u00f3n est\u00e1 demostrada en un teorema bien conocido en ciertos c\u00edrculos, el teorema FLP (1985, Fischer, Lynch, Paterson, enlace al original al final del art\u00edculo): \"La imposibilidad de alcanzar consenso distribuido con la falla de al menos un nodo\".<br \/>\n<img decoding=\"async\" alt=\"El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos\" src=\"\/wp-content\/uploads\/2019\/08\/92417aafe00841aaa41cbefe0386e21a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nChicos, entonces tenemos un problema, estamos acostumbrados a que todo sea as\u00edncrono. \u00bfY ahora qu\u00e9 hacemos? \u00bfC\u00f3mo seguimos adelante? <\/p>\n<p>Ahora est\u00e1bamos hablando de teor\u00eda, de matem\u00e1ticas. \u00bfQu\u00e9 significa \"el consenso no puede ser alcanzado\" cuando lo traducimos de lenguaje matem\u00e1tico a nuestro lenguaje ingenieril? Significa que \"no siempre puede ser alcanzado\", es decir, existe un caso en el que el consenso no es alcanzable. \u00bfY cu\u00e1l es este caso? <\/p>\n<p>Eso es precisamente lo que se describe como la violaci\u00f3n de la propiedad de liveness, mencionada anteriormente. No tenemos un acuerdo com\u00fan, y el sistema no puede tener progreso (no puede completarse en un tiempo finito) si no recibimos respuestas de todos los nodos. Porque en un sistema as\u00edncrono no tenemos un tiempo de respuesta predecible, y no podemos saber si un nodo ha fallado o simplemente est\u00e1 respondiendo lentamente.<\/p>\n<p>Pero en la pr\u00e1ctica podemos encontrar una soluci\u00f3n. Supongamos que nuestro algoritmo puede funcionar durante mucho tiempo en caso de fallos (potencialmente puede funcionar indefinidamente). Pero en la mayor\u00eda de las situaciones, cuando la mayor\u00eda de los nodos est\u00e1n funcionando correctamente, tendremos progreso en el sistema. <\/p>\n<p>En la pr\u00e1ctica, tratamos con modelos de comunicaci\u00f3n parcialmente s\u00edncronos. La parcialidad de la sincronizaci\u00f3n se entiende as\u00ed: en t\u00e9rminos generales, tenemos un modelo as\u00edncrono, pero se introduce formalmente el concepto de \"tiempo de estabilizaci\u00f3n global\" para un momento dado. <\/p>\n<p>Este momento puede no llegar durante mucho tiempo, pero tarde o temprano debe llegar. Sonar\u00e1 una alarma virtual y a partir de ese momento podemos predecir la delta de tiempo que tomar\u00e1 llegar los mensajes. A partir de ese momento, el sistema pasa de ser as\u00edncrono a s\u00edncrono. En la pr\u00e1ctica, tratamos precisamente con esos tipos de sistemas. <\/p>\n<h2>El algoritmo Paxos resuelve problemas de consenso.<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Paxos_(computer_science)\">Paxos <\/a><\/noindex> es un conjunto de algoritmos que resuelven el problema del consenso para sistemas parcialmente s\u00edncronos, bajo la condici\u00f3n de que algunos nodos pueden fallar. El autor de Paxos es <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Leslie_Lamport\">Leslie Lamport<\/a><\/noindex>. Propuso una prueba formal de la existencia y correcci\u00f3n del algoritmo en 1989. <\/p>\n<p>Sin embargo, la prueba result\u00f3 ser nada trivial. La primera publicaci\u00f3n sali\u00f3 solo en 1998 (33 p\u00e1ginas) describiendo el algoritmo. Result\u00f3 ser extremadamente dif\u00edcil de entender, y en 2001 se public\u00f3 una aclaraci\u00f3n al art\u00edculo que ocup\u00f3 14 p\u00e1ginas. Las extensiones de las publicaciones se proporcionan para demostrar que, en realidad, el problema de consenso no es simple, y detr\u00e1s de dichos algoritmos hay un enorme esfuerzo de las mentes m\u00e1s brillantes.<\/p>\n<blockquote><p>Curiosamente, el mismo Leslie Lamport mencion\u00f3 en su conferencia que en el segundo art\u00edculo de aclaraci\u00f3n hay una afirmaci\u00f3n, una l\u00ednea (no especific\u00f3 cu\u00e1l), que puede ser interpretada de diferentes maneras. Debido a esto, muchas implementaciones modernas de Paxos no funcionan de manera completamente correcta. <\/p><\/blockquote>\n<p>\nUn an\u00e1lisis detallado del funcionamiento de Paxos requerir\u00eda m\u00e1s de un art\u00edculo, por lo que intentar\u00e9 transmitir brevemente la idea b\u00e1sica del algoritmo. En los enlaces al final de mi art\u00edculo, encontrar\u00e1 materiales para profundizar en este tema.<\/p>\n<h4>Roles en Paxos<\/h4>\n<p>\nEn el algoritmo Paxos, hay un concepto de roles. Consideremos tres roles principales (hay modificaciones con roles adicionales):<\/p>\n<ol>\n<li><b>Proposers (tambi\u00e9n pueden encontrarse los t\u00e9rminos: l\u00edderes o coordinadores)<\/b>. Estos son chicos que descubren un nuevo valor a partir del usuario y asumen el papel de l\u00edder. Su tarea es iniciar una ronda de propuestas de un nuevo valor y coordinar las acciones posteriores de los nodos. Adem\u00e1s, Paxos permite que haya m\u00faltiples l\u00edderes en determinadas situaciones.<\/li>\n<li><b>Aceptores (Votantes)<\/b>. Son nodos que votan a favor o en contra de la aceptaci\u00f3n de un determinado valor. Su papel es muy importante, porque de ellos depende la decisi\u00f3n: a qu\u00e9 estado pasar\u00e1 (o no) el sistema despu\u00e9s de la siguiente etapa del algoritmo de consenso.<\/li>\n<li><b>Aprendices<\/b>. Nodos que simplemente reciben y registran el nuevo valor aceptado cuando el estado del sistema cambia. No toman decisiones, solo reciben datos y pueden entregarlos al usuario final. <\/li>\n<\/ol>\n<p>\nUn nodo puede combinar varios roles en diferentes situaciones. <\/p>\n<h4>El concepto de qu\u00f3rum<\/h4>\n<p>\nSuponemos que tenemos un sistema de <b>N<\/b> nodos. Y de ellos, como m\u00e1ximo, <b>F<\/b> nodos pueden fallar. Si F nodos fallan, entonces en nuestro cl\u00faster debe haber, como m\u00ednimo, <b>2F + 1<\/b> nodos acceptor. <\/p>\n<p>Esto es necesario para que siempre, incluso en la peor situaci\u00f3n, los nodos 'buenos', que funcionan correctamente, tengan la mayor\u00eda. Es decir, <b>F + 1<\/b> nodos 'buenos' que hayan coincidido, y el valor final ser\u00e1 aceptado. De lo contrario, podr\u00eda haber una situaci\u00f3n en la que diferentes grupos locales adopten valores diferentes y no puedan llegar a un acuerdo entre s\u00ed. Por lo tanto, necesitamos una mayor\u00eda absoluta para ganar en la votaci\u00f3n.<\/p>\n<h4>La idea general del funcionamiento del algoritmo de consenso Paxos<\/h4>\n<p>\nEl algoritmo Paxos implica dos grandes fases, las cuales se dividen en dos pasos cada una:<\/p>\n<ol>\n<li><b>Fase 1a: Preparar<\/b>. En la etapa de preparaci\u00f3n, el l\u00edder (proposer) informa a todos los nodos: \u00abComenzamos una nueva fase de votaci\u00f3n. Tenemos una nueva ronda. El n\u00famero de esta ronda es n. Ahora comenzaremos a votar\u00bb. Por ahora, solo comunica el inicio de un nuevo ciclo, pero no revela un nuevo valor. La tarea de esta etapa es iniciar una nueva ronda y comunicar a todos su n\u00famero \u00fanico. El n\u00famero de ronda es importante; debe ser un valor mayor que todos los n\u00fameros de votaciones anteriores de todos los l\u00edderes anteriores. Esto se debe a que, gracias al n\u00famero de ronda, otros nodos en el sistema comprender\u00e1n cu\u00e1n recientes son los datos del l\u00edder. Probablemente, otros nodos ya tienen resultados de votaciones de rondas mucho m\u00e1s recientes y simplemente le dir\u00e1n al l\u00edder que est\u00e1 desactualizado.<\/li>\n<li><b>Fase 1b: Promesa<\/b>. Cuando los nodos acceptor reciben el n\u00famero de la nueva fase de votaci\u00f3n, pueden ocurrir dos resultados: \n<ul>\n<li>El n\u00famero n de la nueva votaci\u00f3n es mayor que el n\u00famero de cualquier votaci\u00f3n anterior en la que particip\u00f3 el aceptador. Entonces, el aceptador env\u00eda al l\u00edder una promesa de que no participar\u00e1 en ninguna votaci\u00f3n con un n\u00famero menor que n. Si el aceptador ya ha votado por alg\u00fan valor (es decir, ya ha aceptado un valor en la segunda fase), adjunta a su promesa el valor aceptado y el n\u00famero de votaci\u00f3n en el que particip\u00f3.<\/li>\n<li>Por otra parte, si el aceptador ya sabe de una votaci\u00f3n con un n\u00famero mayor, puede simplemente ignorar la etapa de preparaci\u00f3n y no responder al l\u00edder.<\/li>\n<\/ul>\n<\/li>\n<li><b>Fase 2a: Aceptar<\/b>. El l\u00edder necesita esperar la respuesta de un qu\u00f3rum (mayor\u00eda de los nodos en el sistema) y, si recibe el n\u00famero necesario de respuestas, tiene dos opciones: \n<ul>\n<li>Algunos de los acceptores han enviado valores por los que ya han votado. En este caso, el l\u00edder elige el valor de la votaci\u00f3n con el n\u00famero m\u00e1ximo. Denominaremos a este valor x, y lo env\u00eda a todos los nodos un mensaje del tipo: \u00abAccept (n, x)\u00bb, donde el primer valor es el n\u00famero de la votaci\u00f3n de su propio paso Propose, y el segundo valor es por el que se reunieron, es decir, el valor por el que realmente estamos votando.<\/li>\n<li>Si ninguno de los acceptores ha enviado ning\u00fan valor, sino que simplemente prometieron votar en esta ronda, el l\u00edder puede proponerles votar por su valor, el valor por el cual se convirti\u00f3 en l\u00edder. Denomin\u00e9moslo y. Env\u00eda a todos los nodos un mensaje del tipo: \u00abAccept (n, y)\u00bb, de manera an\u00e1loga al resultado anterior.<\/li>\n<\/ul>\n<\/li>\n<li><b>Fase 2b: Aceptado<\/b>. Luego, los nodos-acceptores, al recibir el mensaje \u00abAccept(...)\u00bb, del l\u00edder, est\u00e1n de acuerdo con \u00e9l (env\u00edan a todos los nodos una confirmaci\u00f3n de que est\u00e1n de acuerdo con el nuevo valor) solo si no han prometido a un (otro) l\u00edder participar en las votaciones con el n\u00famero de ronda <b>n' &gt; n<\/b>, de lo contrario, ignoran la solicitud de confirmaci\u00f3n.\n<p>Si el l\u00edder recibe la respuesta de la mayor\u00eda de los nodos y todos confirman el nuevo valor, entonces el nuevo valor se considera aceptado. \u00a1Hurra! Si no se alcanza la mayor\u00eda o hay nodos que se han negado a aceptar el nuevo valor, todo comienza de nuevo.<\/li>\n<\/ol>\n<p>\nAs\u00ed es como funciona el algoritmo Paxos. Cada una de estas etapas tiene muchas sutilezas, pr\u00e1cticamente no hemos abordado los diferentes tipos de fallos, problemas de m\u00faltiples l\u00edderes y mucho m\u00e1s, pero el objetivo de este art\u00edculo es simplemente familiarizar al lector en un nivel alto con el mundo de la computaci\u00f3n distribuida.<\/p>\n<p>Tambi\u00e9n vale la pena se\u00f1alar que Paxos no es el \u00fanico en su tipo; existen otros algoritmos, por ejemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/raft.github.io\/\">Raft<\/a><\/noindex>, pero eso ya es tema para otro art\u00edculo.<\/p>\n<h2>Enlaces a materiales para un estudio m\u00e1s profundo<\/h2>\n<p>\nNivel \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\">\u00bfC\u00f3mo funciona el consenso distribuido?<\/a><\/noindex>, Preethi Kasireddy, art\u00edculo de blog en Medium<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@nevverlander\/paxos-made-simple-for-real-aa221be7d91b\">Paxos hecho simple. De verdad<\/a><\/noindex>, Adi Kancherla, art\u00edculo de blog en Medium<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ittaiab.github.io\/\">Pensamientos descentralizados<\/a><\/noindex>, Ittai Abraham, blog<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ittaiab.github.io\/2019-06-01-2019-5-31-models\/\">Sincron\u00eda, Asincron\u00eda y Sincron\u00eda parcial<\/a><\/noindex>, Ittai Abraham, art\u00edculo de blog<\/li>\n<\/ul>\n<p>\nNivel \u00abLeslie Lamport\u00bb:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/groups.csail.mit.edu\/tds\/papers\/Lynch\/jacm85.pdf\">Imposibilidad de consenso distribuido con un proceso defectuoso (imposibilidad de FLP)<\/a><\/noindex>, Fischer, Lynch y Paterson, documento de investigaci\u00f3n, 1985<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lamport.azurewebsites.net\/pubs\/lamport-paxos.pdf\">El parlamento a tiempo parcial<\/a><\/noindex>, Leslie Lamport, documento de investigaci\u00f3n, 1998<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lamport.azurewebsites.net\/pubs\/paxos-simple.pdf\">Paxos hecho simple<\/a><\/noindex>, Leslie Lamport, documento de investigaci\u00f3n, 2001<\/li>\n<\/ul>\n<p>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47El gato de Schr\u00f6dinger sin caja: el problema del consenso en sistemas distribuidos | ProHoster","description":"As\u00ed que, imaginemos. En la habitaci\u00f3n hay 5 gatos atrapados, y para ir a despertar al due\u00f1o, necesitan acordar entre ellos, ya que solo pueden abrir la puerta si se lanzan todos juntos sobre ella.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/37335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=37335"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/37335\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/28009"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=37335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=37335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=37335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}