Apache Cassandra

Base de datos NoSQL distribuida - escalabilidad lineal, sin punto unico de fallo, volumenes masivos de datos

TL;DR

Qué: Una base de datos NoSQL distribuida diseñada para alta disponibilidad y escalabilidad.

Por qué: Sin punto único de fallo, escalabilidad lineal, maneja volúmenes masivos de datos.

Quick Start

Instalar con Docker:

docker run --name cassandra -p 9042:9042 -d cassandra:latest

Conectar:

docker exec -it cassandra cqlsh

Crear keyspace y tabla:

CREATE KEYSPACE myapp WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': 1
};

USE myapp;

CREATE TABLE users (
  user_id UUID PRIMARY KEY,
  name TEXT,
  email TEXT,
  created_at TIMESTAMP
);

Cheatsheet

ComandoDescripción
DESCRIBE KEYSPACES;Listar keyspaces
USE keyspace;Seleccionar keyspace
DESCRIBE TABLES;Listar tablas
DESCRIBE TABLE name;Mostrar esquema de tabla
SELECT * FROM table;Consultar datos
INSERT INTO table (...) VALUES (...);Insertar datos
EXIT;Salir de cqlsh

Gotchas

Data modeling (query-first)

-- Diseñar tablas basándose en consultas, no relaciones
-- Consulta: Obtener todos los posts por usuario, ordenados por tiempo
CREATE TABLE posts_by_user (
  user_id UUID,
  post_id TIMEUUID,
  title TEXT,
  content TEXT,
  PRIMARY KEY (user_id, post_id)
) WITH CLUSTERING ORDER BY (post_id DESC);

CRUD operations

-- Insertar
INSERT INTO users (user_id, name, email, created_at)
VALUES (uuid(), 'John', '[email protected]', toTimestamp(now()));

-- Seleccionar
SELECT * FROM users WHERE user_id = some-uuid;

-- Actualizar
UPDATE users SET name = 'Johnny'
WHERE user_id = some-uuid;

-- Eliminar
DELETE FROM users WHERE user_id = some-uuid;

Primary key structure

-- Solo clave de partición
PRIMARY KEY (user_id)

-- Clave de partición + columna de clustering
PRIMARY KEY (user_id, created_at)

-- Clave de partición compuesta
PRIMARY KEY ((country, city), user_id)

Collections

-- Lista
emails LIST<TEXT>

-- Set
tags SET<TEXT>

-- Map
properties MAP<TEXT, TEXT>

Next Steps