La consistencia eventual es un modelo de consistencia utilizado en computación distribuida para lograr alta disponibilidad . Un sistema con consistencia eventual asegura que si no se realizan nuevas actualizaciones a un elemento de datos dado, eventualmente todos los accesos de lectura a ese elemento devolverán el último valor actualizado. [ 1 ] La consistencia eventual, también llamada replicación optimista , [ 2 ] se implementa ampliamente en sistemas distribuidos y tiene sus orígenes en los primeros proyectos de computación móvil. [ 3 ] Se dice que un sistema que ha logrado la consistencia eventual ha convergido o ha logrado la convergencia de réplicas . [ 4 ] La consistencia eventual es una garantía débil: la mayoría de los modelos más fuertes, como la linealizabilidad , son trivialmente consistentes eventualmente.
Los servicios de consistencia eventual suelen clasificarse como proveedores de semántica BASE (disponibilidad básica, estado flexible, consistencia eventual), en contraste con la ACID tradicional (atomicidad, consistencia, aislamiento, durabilidad). Las definiciones aproximadas de cada término en BASE son: [ 5 ] [ 6 ]
- Disponibilidad básica : se refiere a la accesibilidad concurrente de la base de datos por parte de los usuarios en todo momento. Un usuario no necesita esperar a que otros finalicen la transacción antes de actualizar el registro. [ 7 ]
- Estado blando : se refiere a la noción de que los datos pueden tener estados transitorios o temporales que pueden cambiar con el tiempo, incluso sin desencadenantes o entradas externas. Por lo tanto, incluso sin actualizaciones externas adicionales, hasta que una actualización converja, es posible que diferentes consultas para un registro vean valores diferentes. [ 7 ]
- Consistencia eventual : esto significa que el registro alcanzará la consistencia cuando se hayan completado todas las actualizaciones concurrentes. En ese momento, las aplicaciones que consulten el registro verán el mismo valor. [ 7 ]
La consistencia eventual ha sido objeto de críticas [ 8 ] por añadir complejidad a las aplicaciones de software distribuidas. Esta complejidad surge porque la consistencia eventual solo proporciona una garantía de vivacidad (asegurando que las lecturas finalmente devuelvan el mismo valor) sin garantías de seguridad , permitiendo cualquier valor intermedio antes de la convergencia. Los desarrolladores de aplicaciones encuentran esto un desafío porque difiere de la programación de un solo hilo, donde las variables devuelven de forma fiable sus valores asignados inmediatamente. Con garantías de consistencia débiles, los desarrolladores deben considerar cuidadosamente estas limitaciones, ya que las suposiciones incorrectas sobre los niveles de consistencia pueden conducir a errores sutiles que solo se manifiestan durante fallos de red o alta concurrencia. [ 9 ]
Resolución de conflictos
Para garantizar la convergencia de réplicas, un sistema debe conciliar las diferencias entre múltiples copias de datos distribuidos. Esto consta de dos partes:
- intercambio de versiones o actualizaciones de datos entre servidores (a menudo conocido como anti-entropía ); [ 10 ] y
- elegir un estado final apropiado cuando se han producido actualizaciones simultáneas, lo que se denomina reconciliación .
El enfoque más apropiado para la reconciliación depende de la aplicación. Un enfoque común es "el último escritor gana". [ 1 ] Otro es invocar un gestor de conflictos especificado por el usuario. [ 4 ] A menudo se utilizan marcas de tiempo y relojes vectoriales para detectar la concurrencia entre actualizaciones. Algunas personas utilizan "el primer escritor gana" en situaciones donde "el último escritor gana" es inaceptable. [ 11 ]
La conciliación de escrituras concurrentes debe ocurrir en algún momento antes de la siguiente lectura, y puede programarse en diferentes instantes: [ 3 ] [ 12 ]
- Corrección de lectura: La corrección se realiza cuando una lectura encuentra una inconsistencia. Esto ralentiza la operación de lectura.
- Reparación de escritura: La corrección se realiza durante una operación de escritura, lo que ralentiza dicha operación.
- Reparación asíncrona: La corrección no forma parte de una operación de lectura o escritura.
Fuerte consistencia eventual
Mientras que la consistencia eventual solo garantiza la vivacidad (las actualizaciones se observarán eventualmente), la consistencia eventual fuerte (SEC) añade la garantía de seguridad de que dos nodos cualesquiera que hayan recibido el mismo conjunto (no ordenado) de actualizaciones estarán en el mismo estado. Un enfoque común para garantizar la SEC son los tipos de datos replicados sin conflictos . [ 13 ]
Véase también
Referencias
- 1 2 Vogels, W. (2009). "Eventualmente consistente" . Communications of the ACM . 52 : 40–44 . doi : 10.1145/1435417.1435432 .
- ↑ Vogels, W. (2008). "Eventualmente consistente" . ACM Queue . 6 (6): 14– 19. doi : 10.1145/1466443.1466448 .
- 1 2 Terry, DB; Theimer, MM; Petersen, K.; Demers, AJ; Spreitzer, MJ; Hauser, CH (1995). "Gestión de conflictos de actualización en Bayou, un sistema de almacenamiento replicado débilmente conectado". Actas del decimoquinto simposio de la ACM sobre principios de sistemas operativos - SOSP '95 . pág. 172. CiteSeerX 10.1.1.12.7323 . doi : 10.1145/224056.224070 . ISBN 978-0897917155. S2CID 7834967 .
- 1 2 Petersen, K.; Spreitzer, MJ; Terry, DB; Theimer, MM; Demers, AJ (1997). "Propagación de actualizaciones flexible para replicación débilmente consistente". ACM SIGOPS Operating Systems Review . 31 (5): 288. CiteSeerX 10.1.1.17.555 . doi : 10.1145/269005.266711 .
- ↑ Pritchett, D. (2008). "Base: Una alternativa ácida" . ACM Queue . 6 (3): 48– 55. doi : 10.1145/1394127.1394128 .
- ↑ Bailis, P.; Ghodsi, A. (2013). "Consistencia eventual hoy: limitaciones, extensiones y más allá" . ACM Queue . 11 (3): 20. doi : 10.1145/2460276.2462076 .
- 1 2 3 "¿Cuál es la diferencia entre una base de datos ACID y una base de datos BASE?" .
- ↑ H Yaniv Pessach (2013), Almacenamiento distribuido (Almacenamiento distribuido: conceptos, algoritmos e implementaciones, ed.), Amazon, OL 25423189M ,
Los sistemas que utilizan consistencia eventual dan como resultado una menor carga del sistema y una mayor disponibilidad del sistema, pero dan como resultado una mayor complejidad cognitiva para los usuarios y desarrolladores.
- ↑ Kleppmann, Martin (2017). Diseño de aplicaciones intensivas en datos: las grandes ideas detrás de sistemas fiables, escalables y mantenibles (1.ª ed.). Pekín, Boston, Farnham, Sebastopol, Tokio: O'Reilly. ISBN 978-1449373320.
- ↑ Demers, A.; Greene, D.; Hauser, C.; Irish, W.; Larson, J. (1987). «Algoritmos epidémicos para el mantenimiento de bases de datos replicadas». Actas del sexto simposio anual de la ACM sobre principios de computación distribuida - PODC '87 . pág. 1. doi : 10.1145/41840.41841 . ISBN 978-0-89791-239-6. S2CID 1889203 .
- ↑ Rockford Lhotka. "Técnicas de concurrencia". Archivado el 11 de mayo de 2018 en Wayback Machine . 2003.
- ↑ Olivier Mallassi (09-06-2010). "Juguemos con Cassandra… (Parte 1/3)" . OCTO Talks! . Consultado el 23-03-2011 .
Por supuesto, en un momento dado, es muy probable que cada nodo tenga su propia versión de los datos. La resolución de conflictos se realiza durante las solicitudes de lectura (llamada reparación de lectura) y la versión actual de Cassandra no proporciona mecanismos de resolución de conflictos de Vector Clock [sic] (debería estar disponible en la versión 0.7). La resolución de conflictos se basa en la marca de tiempo (la que se establece al insertar la fila o la columna): la marca de tiempo más alta prevalece y el nodo del que se leen los datos es responsable de ello. Este es un punto importante porque la marca de tiempo la especifica el cliente en el momento en que se inserta la columna. Por lo tanto, todos los clientes de Cassandra [sic] deben estar sincronizados...
- ↑ Shapiro, Marc; Preguiça, Nuno; Baquero, Carlos; Zawirski, Marek (10 de octubre de 2011). «Tipos de datos replicados sin conflictos». Actas de la 13.ª Conferencia Internacional sobre Estabilización, Seguridad y Protección de Sistemas Distribuidos (SSS'11) . Springer-Verlag Berlín, Heidelberg: 386–400 .
Lecturas adicionales
- Modelos de consistencia