4.4 KiB
Redis — migrat pe clusterul RAG (2026-04-22)
TL;DR: DIDI folosește clusterul Redis RAG (3 noduri Sentinel + HAProxy VIP). Containerul local
didi-cachedinproduction/docker-compose.ymle oprit dar păstrat ca fallback rapid. Conexiunea e centralizată viaagent-v3/src/shared/redis/connection.ts.
Ce era aici (legacy)
didi-cache — un container Redis 7 Alpine standalone pe didi-network Docker. Single-node, fără HA, fără replicare. 512MB max memory, allkeys-lru eviction. Servea toate sesiunile pipeline + cache-ul framework + lock-uri workeri.
Ce e acum
Cluster Redis RAG (productie)
| Nod | Hostname | IP | Port Redis | Port Sentinel |
|---|---|---|---|---|
| rag01 (HAProxy VIP) | rag01 |
10.11.50.101 |
6379 (replica) | 26379 |
| rag02 (master curent) | rag02 |
10.11.50.102 |
6379 (master) | 26379 |
| rag03 | rag03 |
10.11.50.103 |
6379 (replica) | 26379 |
Endpoint-uri pentru aplicații:
| Scop | Endpoint |
|---|---|
| WRITE (auto-routing master) | 10.11.50.100:16379 |
| READ (replica locală rag01) | 10.11.50.100:6379 |
| Sentinel discovery | 10.11.50.100:16380 (master name ragmaster) |
| HAProxy stats | http://10.11.50.100:8404/stats |
User ACL DIDI: didi cu prefix de chei didi:* și channels didi.*. Parola în vault-ul de credențiale name='Redis ACL — didi'.
ACL persistent via --aclfile /data/users.acl pe toate 3 nodurile (fix permanent 2026-04-22).
Conexiune centralizată în cod
agent-v3/src/shared/redis/connection.ts — toate conexiunile ioredis trec prin createRedisConnection(label). Zero new Redis({...}) inline. Auto-reconnect cu retryStrategy, reconnectOnError pentru READONLY / MASTERDOWN (failover).
// Folosire în cod:
import { createRedisConnection } from './shared/redis/connection';
const redis = createRedisConnection('framework-cache');
didiFramework are propria implementare în src/lib/redis.ts.
Containerul local didi-cache
Definit în production/docker-compose.yml, configurat să pornească dar manual oprit ca parte din migrare. Volumul didi-production-cache-data e intact — datele anterioare (snapshot-uri RDB + AOF) sunt păstrate.
Status curent: Exited.
De ce e păstrat?
- Fallback rapid dacă cluster RAG e indisponibil (oprit pentru maintenance, network issue, etc.)
- Pentru a-l reactiva temporar, există un script switch:
Asta rescriebackend/services/orchestration-layer/scripts/redis-switch.sh local redis.envși restart agent-v3 stack pentru a folosididi-cacheîn loc de cluster.
Switch rapid cluster ↔ local
Script: backend/services/orchestration-layer/scripts/redis-switch.sh
# Folosește local fallback (didi-cache)
./redis-switch.sh local redis
# Folosește clusterul (default)
./redis-switch.sh cluster redis
# Status
./redis-switch.sh status redis
Credentialele cluster în sidecar .cluster-credentials.env (gitignored).
Verificare cluster
# Cu redis-cli din host (default user — pentru debug)
redis-cli -h 10.11.50.100 -p 16379 -a <pwd> PING
# Cu user DIDI
redis-cli -h 10.11.50.100 -p 16379 --user didi -a <pwd> ACL WHOAMI
# Sentinel master discovery
redis-cli -h 10.11.50.100 -p 16380 SENTINEL get-master-addr-by-name ragmaster
Bootstrap automat la fresh deploy
didiFramework detectează la pornire dacă didi:framework:manifest lipsește în Redis și auto-rulează POST /api/sync-redis (56 chei populate în ~700ms). Zero intervenție manuală pe cluster nou.
Chei Redis principale (orientativ)
| Pattern | Scop | TTL |
|---|---|---|
didi:framework:* |
Config framework (tehnici, ponderi, verdicts) | permanent |
didi:config:{component}:v1:* |
Config componente, stage assignments tier-nested | permanent |
didi:pipeline:{sessionId}:* |
Sesiuni pipeline (status, rezultate) | 7 zile |
didi:queue:* |
Lock-uri workeri | 30s-5min |
agent:result:* |
Rezultate intermediare | 7 zile |
agent:media:* |
Cache media (transcript, vision) | 1 oră |
Linkuri rapide
- Ghid utilizare cluster:
landingzone/redis-rag/README.md(repogit.finesynergy.eu/lucian/landingzone) - Onboarding ACL user nou:
landingzone/redis-rag/CLAUDE_PROMPT.md - HAProxy stats:
http://10.11.50.100:8404/stats
Status
- ✅ Migrare aplicată: 2026-04-22
- ✅ User
didiconfigurat cu prefix izolat - ✅ Container local păstrat ca fallback (oprit, volum intact)
- ✅ Bootstrap framework automat la pornire