Cassandra — escala primero, preguntas después.
Cassandra fue diseñada en Facebook para una sola cosa: nunca caerse, aunque mueras de éxito. No tiene maestro, no tiene punto único de falla, y agregar un nodo es literalmente conectarlo al clúster. A cambio te pide algo: modelar la base según las queries que vas a hacer.
01El anillo — todos los nodos son iguales
En lugar de un servidor maestro, Cassandra coloca los nodos en un anillo. Cada uno es responsable de un rango del espacio de hashes. No hay jerarquía. Si uno se cae, los demás cubren su trabajo. Si agregas uno nuevo, el anillo se reorganiza para que cada nodo cargue una porción igual.
02La clave de todo: la partition key
En Cassandra, la primary key se divide en dos partes: la partition key decide en qué nodo vive la fila; la clustering key decide en qué orden se guardan las filas dentro de la partición.
CREATE TABLE messages ( chat_id text, ts timestamp, by text, text text, PRIMARY KEY ((chat_id), ts) );
(chat_id)entre paréntesis dobles → partition key. Su hash decide el nodo.tsa continuación → clustering key. Ordena los mensajes dentro del chat.- Todos los mensajes del mismo chat viven juntos, ordenados por fecha — leerlos es 1 disco, 1 nodo.
Si pones la PK en algo que cambia (como un user_id que rara vez se consulta solo), las particiones quedan minúsculas y las queries reales tienen que tocar muchos nodos. La regla de oro: diseña la PK alrededor de la query que más vas a ejecutar.
03Caso · Clúster Ver el anillo en vivo
Aquí tienes un clúster de 5 nodos con factor de replicación 3. Selecciona un chat (esa es la partition key), escribe un mensaje y dale a INSERT. Vas a ver la fila volar hacia su nodo dueño y luego replicarse en los dos siguientes del anillo. Hacé clic en cualquier nodo para ver qué guarda dentro.
partition_key = 'general' → el hash decide el nodo. La fila se replica en 3 nodos.
Cada fila se almacena 3 veces (replicación). Los nodos comparten el espacio del anillo y cada partición vive completa en su nodo dueño + sus 2 réplicas siguientes.
Tocá un nodo del anillo para ver qué particiones guarda.
Esperando comandos…
Todos los mensajes con chat_id = 'general' caen en el mismo nodo dueño + sus dos réplicas. Mientras esos tres nodos no se caigan a la vez, el chat sigue funcionando perfectamente — y leer todo el historial es una operación local, ultra rápida.
04Reglas de las queries — lo que duele al principio
Por cómo funciona la partición, Cassandra obliga a que tu WHEREincluya la partition key. No puedes hacer "dame todos los mensajes donde el texto contiene X" como en SQL: eso obligaría a escanear todos los nodos.
-- ✓ válido — sabe a qué nodo ir SELECT * FROM messages WHERE chat_id = 'general'; -- ✓ válido — partition + rango sobre clustering SELECT * FROM messages WHERE chat_id = 'general' AND ts > '2026-01-01'; -- ✗ inválido — sin partition key, necesitaría hablar con todos SELECT * FROM messages WHERE text = 'hola';
Si realmente necesitas otra forma de buscar, creas una segunda tabla con la PK diseñada para esa query. Sí: en Cassandra se duplica el dato a propósito. Es barato (disco) y vuelve cada query super rápida.
05Consistency level — eligiendo en cada query
Como hay varias réplicas, en cada operación puedes elegir cuántas tienen que confirmar:
06Cuándo Cassandra, cuándo NO
"Modela según tus queries, no según tus entidades." En SQL diseñas las tablas con la idea de un mundo limpio y normalizado; en Cassandra diseñas con la idea de las preguntas que tu app va a hacer cada segundo. Es una mentalidad distinta — pero a escala planetaria, es la única que sobrevive.