👁️ Apache Cassandra

Распределённая колоночная БД: модель по запросам, ключи, CQL и репликация.

Шпаргалки · Данные · #cassandra #nosql #cql

Идея

Кластер без главного узла, линейно масштабируется, высокая доступность и быстрая запись. Данные проектируют под запросы, а не под нормализацию. JOIN и произвольные подзапросы не поддерживаются.

Ключи

PRIMARY KEY ((partition_key), clustering_col1, clustering_col2)
Часть Роль
Partition key определяет узел хранения (хэш)
Clustering columns порядок строк внутри партиции

Запрос должен указывать partition key целиком. Хорошая партиция небольшая (десятки тысяч строк), нет «горячих» ключей.

CQL

CREATE KEYSPACE shop
  WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': 3};
USE shop;

CREATE TABLE orders_by_user (
  user_id uuid,
  created timestamp,
  order_id uuid,
  total decimal,
  PRIMARY KEY ((user_id), created, order_id)
) WITH CLUSTERING ORDER BY (created DESC, order_id ASC);

INSERT INTO orders_by_user (user_id, created, order_id, total)
VALUES (uuid(), toTimestamp(now()), uuid(), 99.90) USING TTL 86400;

SELECT * FROM orders_by_user WHERE user_id = ? LIMIT 20;
SELECT * FROM orders_by_user WHERE user_id = ? AND created > '2026-01-01';

UPDATE orders_by_user SET total = 120 WHERE user_id = ? AND created = ? AND order_id = ?;
DELETE FROM orders_by_user WHERE user_id = ?;

Типы

text, int, bigint, decimal, double, boolean, uuid, timeuuid, timestamp, blob, list<T>, set<T>, map<K,V>, frozen<T>.

Согласованность

Уровень задаётся на запрос: CONSISTENCY QUORUM; (в cqlsh).

Уровень Смысл
ONE ответ одной реплики (быстро)
QUORUM большинство реплик
LOCAL_QUORUM большинство в своём ЦОД
ALL все реплики

Правило сильной согласованности: R + W > RF.

Утилиты

cqlsh host 9042
nodetool status          # состояние кластера
nodetool repair          # синхронизация реплик
nodetool compact

Приёмы

  • Одна таблица на один шаблон запроса, данные дублируются осознанно.
  • Удаления создают надгробия (tombstones): избегайте массовых удалений и очередей поверх Cassandra.
  • Для ограничений по времени используйте TTL.