Articulo de referencia

replicación de máquina de estados

En informática , la replicación de máquinas de estado ( SMR ) o enfoque de máquina de estado es un método general para implementar un servicio tolerante a fallos mediante la rep...

En informática , la replicación de máquinas de estado ( SMR ) o enfoque de máquina de estado es un método general para implementar un servicio tolerante a fallos mediante la replicación de servidores y la coordinación de las interacciones del cliente con las réplicas del servidor. Este enfoque también proporciona un marco para comprender y diseñar protocolos de gestión de replicación. [ 1 ]

Definición del problema

Servicio distribuido

En cuanto a clientes y servicios, cada servicio consta de uno o más servidores y exporta operaciones que los clientes invocan mediante solicitudes. Si bien usar un único servidor centralizado es la forma más sencilla de implementar un servicio, su tolerancia a fallos depende del procesador que lo ejecuta. Si este nivel de tolerancia a fallos resulta inaceptable, se pueden utilizar varios servidores que fallen de forma independiente. Generalmente, las réplicas de un único servidor se ejecutan en procesadores separados de un sistema distribuido, y se utilizan protocolos para coordinar las interacciones de los clientes con estas réplicas.

Máquina de estados

Para la discusión subsiguiente, una máquina de estados se definirá como la siguiente tupla de valores [ 2 ] (Véase también máquina de Mealy y máquina de Moore ):

  • Un conjunto de Estados
  • Un conjunto de entradas
  • Un conjunto de resultados
  • Una función de transición (Entrada × Estado → Estado)
  • Una función de salida (Entrada × Estado → Salida)
  • Un estado distinguido llamado Start.

Una máquina de estados comienza en el estado denominado "Inicio". Cada entrada recibida pasa por la función de transición y salida para generar un nuevo estado y una salida. El estado se mantiene estable hasta que se recibe una nueva entrada, mientras que la salida se comunica al receptor correspondiente.

Esta discusión requiere que una máquina de estados sea determinista : múltiples copias de la misma máquina de estados comienzan en el estado inicial y, al recibir las mismas entradas en el mismo orden, llegarán al mismo estado habiendo generado las mismas salidas.

Por lo general, los sistemas basados ​​en la replicación de máquinas de estados restringen voluntariamente sus implementaciones al uso de máquinas de estados finitos para simplificar la recuperación de errores.

Tolerancia a fallos

El determinismo es una característica ideal para garantizar la tolerancia a fallos. Intuitivamente, si existen varias copias de un sistema, un fallo en una de ellas se manifestaría como una diferencia en el estado o la salida con respecto a las demás.

El número mínimo de copias necesarias para la tolerancia a fallos es tres: una con el fallo y otras dos con las que se comparan el estado y la salida. Dos copias no son suficientes, ya que no hay forma de determinar cuál es la defectuosa.

Un sistema de tres copias puede soportar como máximo un fallo (tras el cual debe reparar o reemplazar la copia defectuosa). Si fallara más de una copia, los tres estados y resultados podrían ser diferentes, y sería imposible determinar cuál es el correcto.

En general, un sistema que admite F fallos debe tener 2F+1 copias (también llamadas réplicas). [ 3 ] Las copias adicionales se utilizan como evidencia para decidir cuáles de las copias son correctas y cuáles son defectuosas. Los casos especiales pueden mejorar estos límites. [ 4 ]

Todo este razonamiento presupone que las réplicas experimentan únicamente fallos aleatorios e independientes, como errores de memoria o fallos del disco duro. Los fallos causados ​​por réplicas que intentan mentir, engañar o confabularse también pueden ser gestionados mediante el enfoque de máquina de estados, con cambios aislados.

Las réplicas que fallen no tienen por qué detenerse; pueden seguir funcionando, incluso generando resultados erróneos o incorrectos.

Caso especial: Parada por fallo

En teoría, si se garantiza que una réplica fallida se detendrá sin generar resultados, solo se requieren F+1 réplicas, y los clientes pueden aceptar el primer resultado generado por el sistema. Ningún sistema actual alcanza este límite, pero se utiliza con frecuencia al analizar sistemas construidos sobre una capa tolerante a fallos (ya que dicha capa proporciona semántica de parada por fallo a todas las capas superiores).

Caso especial: Fracaso bizantino

Los fallos en los que una réplica envía valores diferentes en distintas direcciones (por ejemplo, la salida correcta a algunas de sus réplicas compañeras y salidas incorrectas a otras) se denominan fallos bizantinos . [ 5 ] Los fallos bizantinos pueden ser fallos aleatorios y espurios, o ataques maliciosos e inteligentes. 2F+1 réplicas, con hashes no criptográficos, son suficientes para sobrevivir a todos los fallos bizantinos no maliciosos ( con alta probabilidad ). Los ataques maliciosos requieren primitivas criptográficas para lograr 2F+1 (utilizando firmas de mensajes), o se pueden aplicar técnicas no criptográficas, pero el número de réplicas debe aumentarse a 3F+1. [ 5 ]

El enfoque de máquina de estados

La discusión intuitiva anterior implica una técnica sencilla para implementar un servicio tolerante a fallos en términos de una máquina de estados:

  1. Coloca copias de la máquina de estados en varios servidores independientes.
  2. Recibir solicitudes de los clientes, interpretadas como entradas para la máquina de estados.
  3. Elija un orden para las entradas.
  4. Ejecutar las entradas en el orden elegido en cada servidor.
  5. Responda a los clientes con la salida de la máquina de estados.
  6. Supervise las réplicas para detectar diferencias en el estado o la salida.

El resto de este artículo desarrolla los detalles de esta técnica.

El apéndice contiene un análisis de las extensiones típicas utilizadas en sistemas del mundo real, como el registro de eventos , los puntos de control , la reconfiguración y la transferencia de estado .

Insumos para el pedido

El paso crítico en la construcción de un sistema distribuido de máquinas de estados es elegir el orden en que se procesarán las entradas. Dado que todas las réplicas sin fallos llegarán al mismo estado y salida si reciben las mismas entradas, es imperativo que estas se envíen en un orden equivalente en cada réplica. Se han propuesto numerosas soluciones en la literatura. [ 2 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ]

Un canal visible es una vía de comunicación entre dos entidades que participan activamente en el sistema (como clientes y servidores). Ejemplo: cliente a servidor, servidor a servidor.

Un canal oculto es una ruta de comunicación que no se revela al sistema. Por ejemplo, los canales entre clientes suelen estar ocultos, como la comunicación telefónica entre usuarios o la escritura de archivos en un disco por parte de otro proceso.

Cuando todas las rutas de comunicación son canales visibles y no existen canales ocultos, se puede inferir un orden global parcial ( Orden Causal ) a partir del patrón de comunicaciones. [ 8 ] [ 10 ] Cada servidor puede derivar el Orden Causal de forma independiente. Las entradas a la máquina de estados se pueden ejecutar en Orden Causal, lo que garantiza un estado y una salida consistentes para todas las réplicas que no presenten fallos.

En los sistemas abiertos, los canales ocultos son comunes y se debe utilizar una forma de ordenación menos estricta. El orden de las entradas se puede definir mediante un protocolo de votación cuyos resultados dependen únicamente de los canales visibles.

El problema de la votación por un único valor por parte de un grupo de entidades independientes se denomina Consenso . Por extensión, una serie de valores pueden ser elegidos por una serie de instancias de consenso. Este problema se complica cuando los participantes o su medio de comunicación pueden sufrir fallos. [ 3 ]

Las entradas pueden ordenarse según su posición en la serie de instancias de consenso ( Orden de Consenso ). [ 7 ] Cada servidor puede derivar el Orden de Consenso de forma independiente. Las entradas a la Máquina de Estados pueden ejecutarse en Orden de Consenso, lo que garantiza un Estado y una Salida consistentes para todas las réplicas que no presenten fallos.

Optimización del ordenamiento causal y por consenso
En algunos casos, se dispone de información adicional (como relojes en tiempo real). En estos casos, es posible lograr un ordenamiento causal o de consenso más eficiente para las entradas, con un número reducido de mensajes, menos rondas de mensajes o mensajes de menor tamaño. Consulte las referencias para obtener más detalles [ 1 ] [ 4 ] [ 6 ] [ 11 ].
Se pueden realizar optimizaciones adicionales al considerar la semántica de las operaciones de la máquina de estados (como las operaciones de lectura frente a las de escritura). Véanse las referencias Paxos generalizado . [ 2 ] [ 12 ]

Si bien el SMR clásico suele imponer un orden total de las solicitudes, investigaciones recientes sobre libros de contabilidad distribuidos fragmentados demuestran que un orden parcial es suficiente para la consistencia cuando las transacciones no entran en conflicto. Los modelos de dependencia basados ​​en grafos, como los utilizados en el protocolo Cerberus, permiten que las transiciones de estado sin conflicto se produzcan en paralelo en diferentes réplicas, superando las limitaciones de rendimiento de un único registro lineal. [ 13 ]

Envío de salidas

Las solicitudes del cliente se interpretan como entradas para la máquina de estados y se procesan para generar salidas en el orden adecuado. Cada réplica genera una salida de forma independiente. Las réplicas que no presentan fallos siempre producen la misma salida. Antes de enviar la respuesta al cliente, se deben filtrar las salidas defectuosas. Normalmente, la mayoría de las réplicas devuelven la misma salida, que se envía como respuesta al cliente.

Fallo del sistema

Si no existe una mayoría de réplicas con la misma salida, o si menos de la mayoría de las réplicas devuelven una salida, se ha producido un fallo del sistema. La respuesta del cliente debe ser la única salida: FALLO.

Auditoría y detección de fallos

El fallo permanente e imprevisto de una réplica se denomina fallo . Es difícil obtener pruebas de fallo, ya que la réplica puede simplemente tardar en responder [ 14 ] o incluso mentir sobre su estado [ 5 ] .

Las réplicas sin fallos siempre tendrán el mismo estado y producirán las mismas salidas. Esta invariante permite detectar fallos comparando los estados y las salidas de todas las réplicas. Normalmente, una réplica cuyo estado o salida difiere de la mayoría de las réplicas se considera defectuosa.

Una implementación común consiste en pasar sumas de verificación del estado actual de la réplica y de las salidas recientes entre servidores. Un proceso de auditoría en cada servidor reinicia la réplica local si se detecta una desviación. [ 15 ] No se requiere seguridad criptográfica para las sumas de verificación.

It is possible that the local server is compromised, or that the Audit process is faulty, and the replica continues to operate incorrectly. This case is handled safely by the Output filter described previously (see Sending Outputs).

Appendix: extensions

Input log

In a system with no failures, the Inputs may be discarded after being processed by the State Machine. Realistic deployments must compensate for transient non-failure behaviors of the system such as message loss, network partitions, and slow processors.[15]

One technique is to store the series of Inputs in a log. During times of transient behavior, replicas may request copies of a log entry from another replica in order to fill in missing Inputs.[7]

In general the log is not required to be persistent (it may be held in memory). A persistent log may compensate for extended transient periods, or support additional system features such as Checkpoints, and Reconfiguration.

Checkpoints

If left unchecked a log will grow until it exhausts all available storage resources. For continued operation, it is necessary to forget log entries. In general a log entry may be forgotten when its contents are no longer relevant (for instance if all replicas have processed an Input, the knowledge of the Input is no longer needed).

A common technique to control log size is store a duplicate State (called a Checkpoint), then discard any log entries which contributed to the checkpoint. This saves space when the duplicated State is smaller than the size of the log.

Checkpoints may be added to any State Machine by supporting an additional Input called CHECKPOINT. Each replica maintains a checkpoint in addition to the current State value. When the log grows large, a replica submits the CHECKPOINT command just like a client request. The system will ensure non-faulty replicas process this command in the same order, after which all log entries before the checkpoint may be discarded.

In a system with checkpoints, requests for log entries occurring before the checkpoint are ignored. Replicas which cannot locate copies of a needed log entry are faulty and must re-join the system (see Reconfiguration).

Reconfiguration

Reconfiguration allows replicas to be added and removed from a system while client requests continue to be processed. Planned maintenance and replica failure are common examples of reconfiguration. Reconfiguration involves Quitting and Joining.

Quitting

Cuando un servidor detecta que su estado o salida es defectuoso (véase Auditoría y detección de fallos ), puede salir selectivamente del sistema. Del mismo modo, un administrador puede ejecutar manualmente un comando para eliminar una réplica para su mantenimiento.

Se agrega una nueva entrada a la máquina de estados llamada QUIT . [ 2 ] [ 6 ] Una réplica envía este comando al sistema como una solicitud de cliente. Todas las réplicas que no presentan fallas eliminan la réplica que se retira del sistema al procesar esta entrada. Durante este tiempo, la réplica puede ignorar todos los mensajes del protocolo. Si queda una mayoría de réplicas que no presentan fallas, la salida es exitosa. De lo contrario, se produce una falla del sistema .

Unión

Tras su desconexión, un servidor que ha fallado puede reiniciarse selectivamente o volver a unirse al sistema. Asimismo, un administrador puede añadir una nueva réplica al grupo para aumentar la capacidad.

Se agrega una nueva entrada a la máquina de estados llamada JOIN . Una réplica envía este comando al sistema como si fuera una solicitud de cliente. Todas las réplicas que no presentan fallas agregan el nodo de unión al sistema al procesar esta entrada. Una nueva réplica debe estar actualizada con respecto al estado del sistema antes de unirse (consulte Transferencia de estado ).

Transferencia estatal

Cuando se dispone de una nueva réplica o se reinicia una antigua, debe actualizarse al estado actual antes de procesar las entradas (véase la sección «Unión »). Lógicamente, esto requiere aplicar todas las entradas desde el inicio del sistema en el orden adecuado.

Las implementaciones típicas interrumpen el flujo lógico mediante una transferencia de estado del punto de control más reciente (véase Puntos de control ). Esto implica copiar directamente el estado de una réplica a otra mediante un protocolo fuera de banda.

Un punto de control puede ser extenso, lo que requiere un período de transferencia prolongado. Durante este tiempo, se pueden agregar nuevas entradas al registro. Si esto ocurre, la nueva réplica también debe recibir las nuevas entradas y aplicarlas una vez recibido el punto de control. En las implementaciones típicas, se agrega la nueva réplica como observadora al protocolo de ordenación antes de iniciar la transferencia de estado, lo que permite que la nueva réplica recopile entradas durante este período.

Optimización de la transferencia de estado

Las implementaciones comunes reducen los tiempos de transferencia de estado al enviar únicamente los componentes de estado que difieren. Esto requiere conocer el funcionamiento interno de la máquina de estados. Dado que la transferencia de estado suele ser un protocolo fuera de banda, esta suposición no es difícil de cumplir.

La compresión es otra característica que se suele añadir a los protocolos de transferencia de estado, reduciendo el tamaño total de la transferencia.

Elección de líder (para Paxos)

Paxos [ 7 ] es un protocolo para resolver consensos y puede utilizarse como protocolo para implementar el Orden de Consenso.

Paxos requiere un único líder para garantizar la vivacidad. [ 7 ] Es decir, una de las réplicas debe permanecer como líder el tiempo suficiente para lograr el consenso sobre la siguiente operación de la máquina de estados. El comportamiento del sistema no se ve afectado si el líder cambia después de cada instancia, o si cambia varias veces por instancia. El único requisito es que una réplica permanezca como líder el tiempo suficiente para que el sistema avance.

Resolución de conflictos

En general, un líder es necesario solo cuando hay desacuerdo sobre qué operación realizar, [ 11 ] y si esas operaciones entran en conflicto de alguna manera (por ejemplo, si no son conmutativas). [ 12 ]

Cuando se proponen operaciones contradictorias, el líder actúa como la única autoridad para aclarar la situación, definiendo un orden para las operaciones y permitiendo que el sistema avance.

En Paxos, varias réplicas pueden creer que son líderes simultáneamente. Esta característica simplifica enormemente la elección de líder en Paxos, y cualquier algoritmo que garantice un "líder eventual" funcionará.

Antecedentes históricos

Varios investigadores publicaron artículos sobre el enfoque de máquina de estados replicada a principios de la década de 1980. Anita Borg describió una implementación de un sistema operativo tolerante a fallos basado en máquinas de estados replicadas en un artículo de 1983, A Message System Supporting Fault Tolerance . [ 16 ] Leslie Lamport también propuso el enfoque de máquina de estados, en su artículo de 1984 sobre "Using Time Instead of Timeout In Distributed Systems" . Fred Schneider posteriormente desarrolló el enfoque en su artículo "Implementing Fault-Tolerant Services Using the State Machine Approach: A Tutorial" .

Ken Birman desarrolló el modelo de sincronía virtual en una serie de artículos publicados entre 1985 y 1987. La principal referencia a este trabajo es "Exploiting Virtual Synchrony in Distributed Systems" , que describe el Isis Toolkit, un sistema que se utilizó para construir las bolsas de valores de Nueva York y Suiza, el sistema francés de control de tráfico aéreo, el buque de guerra AEGIS de la Armada de los Estados Unidos y otras aplicaciones.

Un trabajo reciente de Miguel Castro y Barbara Liskov utilizó el enfoque de máquina de estados en lo que ellos llaman una arquitectura de "tolerancia a fallos bizantinos práctica" que replica servicios especialmente sensibles utilizando una versión del enfoque original de máquina de estados de Lamport, pero con optimizaciones que mejoran sustancialmente el rendimiento.

Más recientemente, se ha creado la biblioteca BFT-SMaRt [ 17 ] , una biblioteca de replicación de máquinas de estado tolerante a fallos bizantinos de alto rendimiento desarrollada en Java. Esta biblioteca implementa un protocolo muy similar al de PBFT, además de protocolos complementarios que ofrecen transferencia de estado y reconfiguración de hosts sobre la marcha (es decir, operaciones JOIN y LEAVE). BFT-SMaRt es el esfuerzo más reciente para implementar la replicación de máquinas de estado y aún se mantiene activamente.

Raft , un algoritmo basado en el consenso, fue desarrollado en 2013.

Motivado por PBFT, Tendermint BFT [ 18 ] se introdujo para redes parcialmente asíncronas y se utiliza principalmente para cadenas de bloques de prueba de participación .

Referencias

  1. 1 2 Schneider, Fred (1990). "Implementación de servicios tolerantes a fallos mediante el enfoque de máquina de estados: un tutorial" (PS) . ACM Computing Surveys . 22 (4): 299– 319. CiteSeerX 10.1.1.69.1536 . doi : 10.1145/98163.98167 . S2CID 678818 .  
  2. 1 2 3 4 Lamport, Leslie (1978). "La implementación de sistemas multiproceso distribuidos confiables" . Computer Networks . 2 (2): 95– 114. doi : 10.1016/0376-5075(78)90045-4 . Recuperado el 13 de marzo de 2008 .
  3. 1 2 Lamport, Leslie (2004). "Límites inferiores para el consenso asíncrono" .
  4. 1 2 Lamport, Leslie; Mike Massa (2004). "Paxos barato". Conferencia Internacional sobre Sistemas y Redes Confiables, 2004. págs. 307–314 . doi : 10.1109/DSN.2004.1311900 . ISBN  978-0-7695-2052-0. S2CID 1325830 . 
  5. 1 2 3 Lamport, Leslie; Robert Shostak; Marshall Pease (julio de 1982). "El problema de los generales bizantinos" . ACM Transactions on Programming Languages ​​and Systems . 4 (3): 382– 401. CiteSeerX 10.1.1.64.2312 . doi : 10.1145/357172.357176 . S2CID 55899582. Recuperado el 2 de febrero de 2007 .  
  6. 1 2 3 Lamport, Leslie (1984). "Using Time Instead of Timeout for Fault-Tolerant Distributed Systems" . ACM Transactions on Programming Languages ​​and Systems . 6 (2): 254– 280. CiteSeerX 10.1.1.71.1078 . doi : 10.1145/2993.2994 . S2CID 402171. Recuperado el 13 de marzo de 2008 .  
  7. 1 2 3 4 5 Lamport, Leslie (mayo de 1998). "El Parlamento a Tiempo Parlamentario" . ACM Transactions on Computer Systems . 16 (2): 133– 169. doi : 10.1145/279227.279229 . S2CID 421028. Recuperado el 2 de febrero de 2007 . 
  8. 1 2 Birman, Kenneth; Thomas Joseph (1987). "Explotando la sincronía virtual en sistemas distribuidos". ACM SIGOPS Operating Systems Review . 21 (5): 123– 138. doi : 10.1145/37499.37515 . hdl : 1813/6651 .
  9. Lampson, Butler (1996). "Cómo construir un sistema de alta disponibilidad utilizando consenso" . Recuperado el 13 de marzo de 2008 .
  10. Lamport, Leslie (julio de 1978). "Tiempo, relojes y ordenamiento de eventos en un sistema distribuido" . Communications of the ACM . 21 (7): 558– 565. doi : 10.1145/359545.359563 . S2CID 215822405. Consultado el 2 de febrero de 2007 . 
  11. ^ Lamport , Leslie (2005). "Paxos rápidos" .
  12. 1 2 Lamport, Leslie (2005). Consenso generalizado y Paxos (Informe técnico). Microsoft Research. MSR-TR-2005-33.
  13. Hellings, Jelle; Sadoghi, Mohammad (2021). "Cerberus: Procesamiento de transacciones minimalista multi-fragmento resistente a la manipulación bizantina" (PDF) . Actas de la Fundación VLDB . 14 (11): 2230– 2243. arXiv : 2202.04522 . doi : 10.14778/3476249.3476274 .
  14. Fischer, Michael J.; Nancy A. Lynch; Michael S. Paterson (1985). "Imposibilidad del consenso distribuido con un proceso defectuoso" . Journal of the Association for Computing Machinery . 32 (2): 347– 382. doi : 10.1145/3149.214121 . hdl : 1721.1/149560 . S2CID 207660233. Recuperado el 13 de marzo de 2008 . 
  15. 1 2 Chandra, Tushar; Robert Griesemer; Joshua Redstone (2007). "Paxos en acción". Actas del vigésimo sexto simposio anual de la ACM sobre Principios de computación distribuida (PDF) . págs. 398–407 . doi : 10.1145/1281100.1281103 . ISBN  9781595936165. S2CID 207164635 . 
  16. Borg, A.; Baumbach, J.; Glazer, S. (1983). Un sistema de mensajes que admite tolerancia a fallos (PDF) . Simposio sobre principios de sistemas operativos. págs. 90–99 . doi : 10.1145/800217.806616 . 
  17. BFT-SMaRt . Repositorio de Google Code para la biblioteca de replicación BFT-SMaRt.
  18. Buchman, E.; Kwon, J.; Milosevic, Z. (2018). "Los últimos rumores sobre el consenso BFT". arXiv : 1807.04938 [ cs.DC ].
  • Vídeo sobre máquinas de estados replicadas en MIT TechTV.
  • Apache Bookkeeper es un servicio de registro replicado que se puede utilizar para construir máquinas de estado replicadas.