🗄️ Bases de données

database-cassandra-guide

Modélisation et administration Apache Cassandra incluant partition keys, clustering, compaction, réplication et tuning opérationnel.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- database-cassandra-guide --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } database-cassandra-guide -Launch"

🚀 Déjà installé ?

claude "/database-cassandra-guide"

Ou tapez /database-cassandra-guide dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

CassandraApache Cassandrapartition keyCQL

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/database-cassandra-guide ~/.claude/skills/

Payload du plugin : skills/database-cassandra-guide · source éditable : database-skills/cassandra-guide

📖 Manuel

Cassandra Guide

1. Modéliser par les requêtes (Query-Driven Design)

Cassandra n'est pas relationnel : le schéma découle des requêtes, pas l'inverse.

Étapes :

  1. Lister exhaustivement les patterns de requête de l'application.
  2. Créer une table par requête — la dénormalisation est normale et attendue.
  3. Choisir la partition key pour distribuer uniformément les données entre nœuds.
  4. Choisir les clustering columns pour le tri intra-partition et les filtres de range.

Critères de choix de partition key :

-- Table events par utilisateur et mois (bucketing temporel)
CREATE TABLE events_by_user (
    user_id    UUID,
    month      TEXT,          -- ex. '2026-06'
    event_time TIMEUUID,
    payload    TEXT,
    PRIMARY KEY ((user_id, month), event_time)
) WITH CLUSTERING ORDER BY (event_time DESC);

2. Concevoir le schéma CQL

Types recommandés :

User Defined Types (UDT) :

CREATE TYPE address (
    street TEXT,
    city   TEXT,
    zip    TEXT
);

CREATE TABLE customers (
    id      UUID PRIMARY KEY,
    name    TEXT,
    address FROZEN<address>
);

Materialized Views — attention :

3. Configurer la réplication

ContexteStratégieConfig
Dev / single DCSimpleStrategyreplication_factor: 1
Prod single DCSimpleStrategyreplication_factor: 3
Prod multi-DCNetworkTopologyStrategyRF par DC (dc1: 3, dc2: 3)
-- Keyspace production multi-datacenter
CREATE KEYSPACE myapp
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'dc1': 3,
    'dc2': 3
};

Consistency levels en production :

4. Choisir la stratégie de compaction

Cas d'usageStratégiePourquoi
Écritures massives, lectures raresSTCS (SizeTiered)Défaut, peu de IOPS, favorise l'ingestion
Lectures fréquentes, updatesLCS (Leveled)Moins de SSTables à lire, CPU + IOPS plus élevé
Time-series, TTL uniformeTWCS (TimeWindow)Expire des fenêtres entières, zéro amplification
ALTER TABLE events_by_user
WITH compaction = {
    'class': 'TimeWindowCompactionStrategy',
    'compaction_window_unit': 'DAYS',
    'compaction_window_size': 1
};

Règle TWCS : fenêtre = granularité des TTL. Si TTL = 30 jours → fenêtre de 1 jour max.

5. Gérer le cluster (opérations courantes)

# État du cluster
nodetool status

# Réparation d'un nœud (priorité : anti-entropy)
nodetool repair -pr keyspace_name

# Nettoyage après ajout d'un nœud (supprime les données dont le nœud n'est plus responsable)
nodetool cleanup keyspace_name

# Décommissionner proprement un nœud
nodetool decommission

# Compaction forcée d'une table
nodetool compact keyspace_name table_name

# Vider les tombstones (flush mémoire → SSTables)
nodetool flush keyspace_name

Réparations : utiliser cassandra-reaper pour orchestrer les repairs en production — ne jamais lancer nodetool repair sur tous les nœuds simultanément.

6. Implémenter les requêtes (bonnes pratiques client)

# Driver Python — prepared statement + paging
from cassandra.cluster import Cluster
from cassandra.policies import DCAwareRoundRobinPolicy

cluster = Cluster(
    ['node1', 'node2'],
    load_balancing_policy=DCAwareRoundRobinPolicy(local_dc='dc1')
)
session = cluster.connect('myapp')

# Prepared statement (parse côté serveur une seule fois)
stmt = session.prepare(
    "SELECT * FROM events_by_user WHERE user_id=? AND month=? LIMIT 100"
)
stmt.consistency_level = ConsistencyLevel.LOCAL_QUORUM

# Pagination
rows = session.execute(stmt, [user_id, '2026-06'], timeout=5.0)
for row in rows:
    process(row)

Règles impératives :

7. Monitorer le cluster

Métriques critiques à surveiller (JMX → Prometheus via cassandra-exporter ou jmx_exporter) :

MétriqueSeuil d'alerte
ReadLatency P99> 10 ms
WriteLatency P99> 5 ms
PendingCompactions> 32 par nœud
DroppedMutations> 0
GC pause (G1GC)> 500 ms
Partition size (EstimatedPartitionSizeHistogram)> 50 MB
Tombstone warnings dans les logs> 1 000 par requête
# Alerte Prometheus — dropped mutations
- alert: CassandraDroppedMutations
  expr: rate(cassandra_droppedmessage_dropped_total{message_type="MUTATION"}[5m]) > 0
  for: 2m
  labels:
    severity: critical

8. Anti-patterns et pièges

PiègeConséquenceRemède
Partition > 100 MBRead timeout, GC pressureBucketing temporel ou clé composite
DELETE massifs sans TTLAccumulation de tombstonesUtiliser TTL à l'insertion, TWCS
SELECT * sans LIMITFull-partition scanToujours paginer ou limiter
Secondary index sur colonne haute cardinalitéScatter-gather sur tout le clusterTable de lookup dédiée
RF=1 en prodPerte de données à la moindre panneRF ≥ 3 obligatoire
Repair jamais exécutéDonnées "zombies" (résurrection après gc_grace_seconds)Repair automatisé toutes les 72 h max
Batch non-logged inter-partitionsPerformance dégradée, coordination overheadBatch uniquement intra-partition ou via driver async
Schéma créé avant de connaître les requêtesRefonte coûteuseQuery-driven modeling dès le départ

9. Planification de capacité

# Estimer la taille réelle des partitions
nodetool tablehistograms keyspace_name table_name
# → colonne "Partition Size" → vérifier le P99