- Utilisation de 2 requêtes séparées + fusion en Python - 1ère requête: ml_detected_anomalies pour les détections récentes - 2ème requête: view_dashboard_entities avec IN clause pour les user-agents - La clause IN permet d'utiliser l'index ClickHouse (splitByChar ne l'utilise pas) - PREWHERE optimise les performances de requête Problème résolu: - unique_ua était toujours à 0 car la jointure LEFT JOIN ne fonctionnait pas - La solution avec IN clause fonctionne car elle utilise l'index sur entity_value Testé avec 141.98.11.0/24: - 5 IPs, 8 détections, 65 user-agents uniques - 141.98.11.209: 68 user-agents différents Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
6.0 KiB
📅 Modification de la Politique de Rétention
🎯 Objectif
Augmenter la durée de conservation des données dans ClickHouse pour pouvoir investiguer des incidents plus anciens.
📊 Durées de rétention actuelles
| Table / Vue | Ancien TTL | Nouveau TTL | Fichier |
|---|---|---|---|
view_dashboard_entities |
30 jours | 90 jours | deploy_dashboard_entities_view.sql |
view_dashboard_user_agents |
7 jours | 90 jours | deploy_user_agents_view.sql |
audit_logs |
90 jours | 90 jours | deploy_audit_logs_table.sql |
ml_detected_anomalies |
~1-6h* | 30 jours (recommandé) | bot_detector_ai |
*La table ml_detected_anomalies est gérée par le service bot_detector_ai
🔧 Méthode 1: Appliquer sur tables existantes (RECOMMANDÉ)
Étape 1: Exécuter le script SQL
clickhouse-client --host test-sdv-anubis.sdv.fr --port 8123 \
--user admin --password SuperPassword123! \
< update_retention_policy.sql
Étape 2: Vérifier les modifications
SELECT
name,
engine,
create_table_query
FROM system.tables
WHERE database = 'mabase_prod'
AND name LIKE 'view_dashboard%'
FORMAT Vertical;
Étape 3: (Optionnel) Forcer l'application du TTL
-- Attention: Peut prendre plusieurs minutes
OPTIMIZE TABLE mabase_prod.view_dashboard_entities FINAL;
OPTIMIZE TABLE mabase_prod.view_dashboard_user_agents FINAL;
🔧 Méthode 2: Recréer les tables avec le nouveau TTL
Pour view_dashboard_entities
clickhouse-client --host test-sdv-anubis.sdv.fr --port 8123 \
--user admin --password SuperPassword123! \
--database mabase_prod \
< deploy_dashboard_entities_view.sql
Pour view_dashboard_user_agents
clickhouse-client --host test-sdv-anubis.sdv.fr --port 8123 \
--user admin --password SuperPassword123! \
--database mabase_prod \
< deploy_user_agents_view.sql
🔧 Méthode 3: Modifier ml_detected_anomalies
Cette table est gérée par le service bot_detector_ai. Deux options :
Option A: Modification directe (si accès)
-- Vérifier le TTL actuel
SHOW CREATE TABLE mabase_prod.ml_detected_anomalies;
-- Modifier le TTL (exemple: 30 jours)
ALTER TABLE mabase_prod.ml_detected_anomalies
MODIFY TTL detected_at + INTERVAL 30 DAY;
-- Appliquer immédiatement
OPTIMIZE TABLE mabase_prod.ml_detected_anomalies FINAL;
Option B: Modifier la configuration de bot_detector_ai
Dans le fichier de configuration de bot_detector_ai (probablement config.yaml ou settings.py):
# Exemple de configuration
clickhouse:
retention_days: 30 # Au lieu de 1 ou 7
Puis redémarrer le service :
docker compose restart bot_detector_ai
📈 Impact sur le stockage
Estimation de l'augmentation
| Table | Données/jour | 30 jours → 90 jours | Impact |
|---|---|---|---|
view_dashboard_entities |
~100 MB | ×3 | +200 MB |
view_dashboard_user_agents |
~50 MB | ×13 | +600 MB |
ml_detected_anomalies |
~1 GB | ×30 | +29 GB |
Total estimé: +30 GB pour 90 jours de rétention
Vérifier l'espace disque actuel
SELECT
table,
formatReadableSize(sum(data_compressed_bytes)) AS compressed_size,
formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size,
count() AS rows
FROM system.parts
WHERE database = 'mabase_prod'
AND table LIKE 'view_dashboard%'
GROUP BY table
ORDER BY compressed_size DESC;
✅ Vérification après modification
Test 1: Subnet ancien (ex: 212.30.36.0/24)
# Via API
curl "http://192.168.1.2:8000/api/entities/subnet/212.30.36.0/24?hours=2160"
# Via ClickHouse
SELECT count()
FROM mabase_prod.view_dashboard_entities
WHERE entity_type = 'ip'
AND entity_value LIKE '212.30.36.%'
AND log_date >= now() - INTERVAL 90 DAY;
Test 2: Vérifier les dates minimales
-- Date la plus ancienne dans view_dashboard_entities
SELECT min(log_date) AS oldest_date
FROM mabase_prod.view_dashboard_entities;
-- Date la plus ancienne dans view_dashboard_user_agents
SELECT min(log_date) AS oldest_date
FROM mabase_prod.view_dashboard_user_agents;
-- Date la plus ancienne dans ml_detected_anomalies
SELECT min(detected_at) AS oldest_date
FROM mabase_prod.ml_detected_anomalies;
🚨 Points d'attention
1. Espace disque
Vérifiez l'espace disque disponible avant d'augmenter la rétention :
df -h /var/lib/clickhouse
2. Performance des requêtes
Plus de données = requêtes plus lentes. Solutions :
- Ajouter des index
- Utiliser des agrégations pré-calculées
- Partitionner par mois (déjà fait)
3. Nettoyage automatique
ClickHouse applique le TTL automatiquement pendant les opérations de merge. Les données ne sont pas supprimées instantanément.
4. Backup
Faire un backup avant de modifier les tables :
clickhouse-backup create mabase_prod_backup_$(date +%Y%m%d)
📚 Références
🆘 Dépannage
Problème: "TTL expression must return Date or DateTime"
Solution: Vérifier que la colonne utilisée dans le TTL est de type Date ou DateTime
-- Vérifier les types de colonnes
DESCRIBE TABLE mabase_prod.view_dashboard_entities;
Problème: "Table is in readonly mode"
Solution: La table est gérée par une vue matérialisée. Modifier la vue, pas la table.
Problème: OPTIMIZE prend trop de temps
Solution: Exécuter en arrière-plan avec un timeout plus long
-- Exécuter avec timeout de 1 heure
SET max_execution_time = 3600;
OPTIMIZE TABLE mabase_prod.view_dashboard_entities FINAL;
Dernière mise à jour: 2026-03-15
Version: 1.0