ACID, BASE y el teorema CAP
Qué garantías da una transacción clásica, qué se ofrece en su lugar cuando los datos están repartidos, y qué dice y qué no dice el teorema CAP.
ACID frente a BASE
ACID son las cuatro garantías de una transacción en una base de datos relacional. Atomicidad: la transacción se ejecuta entera o no se ejecuta. Consistencia: al terminar, la base cumple todas sus reglas de integridad. Aislamiento: dos transacciones a la vez no se estorban, el resultado es como si hubieran ido una detrás de otra. Durabilidad: lo confirmado sobrevive a un corte de luz.
Muchos sistemas NoSQL no garantizan del todo ese paquete, y ofrecen en su lugar consistencia eventual: una escritura se acepta en un nodo y se propaga a las copias, de modo que durante un intervalo hay lecturas que todavía devuelven el valor antiguo. No es un fallo, es el precio de responder sin esperar a que todos los nodos estén de acuerdo.
Ese modelo se resume con el acrónimo BASE, elegido a propósito como opuesto químico de ACID: Basically Available (básicamente disponible), Soft state (estado blando, que puede cambiar sin que nadie escriba, según se propagan las copias) y Eventually consistent (consistente con el tiempo).
| Aspecto | ACID | BASE |
|---|---|---|
| Qué prioriza | Que el dato sea correcto en todo momento | Que el sistema siga respondiendo |
| Justo después de escribir | Toda lectura ve ya el valor nuevo | Puede haber lecturas con el valor antiguo durante un intervalo |
| Cómo lo consigue | Bloqueos y coordinación entre los participantes | Acepta la escritura y propaga las copias por detrás |
| Quién resuelve los conflictos | El motor, antes de confirmar | El motor o la aplicación, después, al reconciliar |
| Escenario natural | Mover saldo entre dos cuentas | Un contador de visitas o un catálogo replicado entre continentes |
Consistencia eventual no significa «inconsistente»: significa que, si dejan de entrar escrituras, todas las copias acaban coincidiendo.
Para el examen
ACID: atomicidad, consistencia, aislamiento y durabilidad
BASE: Basically Available, Soft state, Eventually consistent
Filosofía de BASE: responder siempre y dejar que las copias converjan
El teorema CAP o de Brewer
El teorema CAP, también llamado teorema de Brewer, es el marco con el que se razona sobre cualquier base de datos distribuida. Enuncia tres propiedades deseables, y las siglas salen de sus nombres en inglés: Consistency (consistencia), Availability (disponibilidad) y Partition Tolerance (tolerancia a particiones).
- Consistency: hay un único valor visible del dato, lo pregunte quien lo pregunte y en el nodo que sea.
- Availability: cualquier petición obtiene respuesta, sin errores ni esperas indefinidas.
- Partition Tolerance: el sistema sigue operando aunque la red se corte entre grupos de nodos.
La formulación clásica, y la que se pregunta en examen con estas palabras, es que un sistema distribuido no puede asegurar las tres a la vez: como mucho garantiza dos de las tres simultáneamente. Esa formulación tiene matices importantes, que se ven en el punto «Cómo se lee bien el CAP».
CAP: Consistency, Availability, Partition Tolerance. Dos de tres, nunca las tres.
Para el examen
Otro nombre: teorema de Brewer
Qué dice: un sistema distribuido no puede asegurar a la vez consistencia, disponibilidad y tolerancia a particiones
Cuántas se pueden tener: como mucho, dos de las tres
Qué garantiza exactamente cada letra
Consistency, en CAP, es más fuerte de lo que suena: significa que hay un único estado visible del dato, de manera que cualquier lectura, contra el nodo que sea, devuelve la última escritura confirmada. Técnicamente es linealizabilidad. Si un sistema acepta que dos nodos respondan valores distintos al mismo tiempo, no es consistente en el sentido de CAP.
Availability significa que toda petición que llega a un nodo que funciona recibe una respuesta con sentido, ni un error ni un tiempo de espera infinito. Ojo: no habla de rapidez, habla de que haya respuesta. Un sistema que se bloquea esperando a que otro nodo confirme está sacrificando disponibilidad, aunque el nodo esté encendido.
Partition Tolerance significa que el sistema sigue operando aunque la red pierda o retrase indefinidamente los mensajes entre grupos de nodos. La partición no es que un nodo se caiga: es que la red se rompe por en medio y quedan dos grupos vivos, cada uno atendiendo peticiones, sin poder hablarse y sin saber si el otro está caído o simplemente incomunicado. Esa incertidumbre es lo que hace difícil el problema.
La C de CAP no es la C de ACID. En CAP es que todos vean el mismo valor; en ACID es que la transacción respete las reglas de integridad de la base.
Para el examen
Consistencia en CAP: que toda lectura vea la última escritura: linealizabilidad
Partición: un corte de red entre grupos de nodos vivos
Lo que NO es una partición: la caída de un nodo
Cómo se lee bien el CAP
El enunciado «dos de tres» es cómodo para memorizar, pero deja pensar que un arquitecto elige tranquilamente dos propiedades de un catálogo de tres. No es así, y conviene saberlo porque los enunciados de examen bien redactados lo tienen en cuenta.
Primero: la tolerancia a particiones no se elige. Si el sistema está repartido entre máquinas, la red se cortará antes o después, y no renunciar a P equivale a decidir que el sistema se romperá cuando pase. Por eso la elección real de cualquier base distribuida es entre CP y AP.
Segundo: la disyuntiva solo aparece durante la partición. Mientras la red va bien, un sistema puede ofrecer consistencia y disponibilidad a la vez sin contradecir el teorema. El teorema dice qué pasa cuando llega el corte: entonces, o el nodo aislado responde con datos que quizá estén obsoletos (elige A) o se niega a responder para no mentir (elige C).
Ese doble régimen es lo que recoge PACELC, una extensión posterior del modelo: si hay Partición, hay que elegir entre Availability y Consistency; y en caso contrario (Else), hay que elegir entre Latency y Consistency, porque mantener las copias de acuerdo cuesta tiempo aunque la red funcione.
En un sistema distribuido la P no es opcional. La pregunta útil no es «qué dos elijo», sino «qué hago cuando la red se parta: responder o esperar».
Para el examen
La P: no se elige: en un sistema distribuido las particiones ocurren
La decisión real: CP o AP, y solo durante la partición
PACELC: añade que, sin partición, se elige entre latencia y consistencia
Dónde cae cada producto
La clasificación habitual reparte los productos en tres grupos, aunque el tercero es más teórico que real.
| Grupo | Qué hace cuando la red se parte | Productos que se citan |
|---|---|---|
| CP (consistencia y tolerancia a particiones) | Prefiere no responder antes que devolver un dato dudoso | MongoDB, HBase, BigTable, Redis en clúster |
| AP (disponibilidad y tolerancia a particiones) | Responde siempre, asumiendo que el dato puede estar desactualizado | Cassandra, Riak, CouchDB, Voldemort, DynamoDB |
| CA (consistencia y disponibilidad) | No tiene plan: da por hecho que la red nunca se parte | Los relacionales clásicos en un solo nodo: Oracle, MySQL, PostgreSQL, SQL Server |
La fila CA hay que leerla con cuidado. Un sistema que no está distribuido no puede sufrir particiones, así que decir que es CA no es tanto una elección de diseño como una descripción de que no hay reparto. En cuanto un relacional se despliega en clúster, vuelve a tener que decidir entre C y A como todos los demás.
Otra advertencia útil: varios de estos productos son configurables. Cassandra permite exigir que una lectura consulte a la mayoría de las réplicas, con lo que se acerca a CP en esa operación concreta, y MongoDB permite leer de una réplica secundaria y comportarse como AP. La etiqueta describe el comportamiento por defecto, no una ley del producto.
Para el examen
CP: MongoDB, HBase y BigTable
AP: Cassandra, Riak, CouchDB y DynamoDB
CA: los relacionales clásicos, en un solo nodo