👁️ 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.