didi-lot2-backend/backend/services/data-layer/didiCache/MIGRATION.md
2026-07-10 03:39:53 -07:00

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-cache din production/docker-compose.yml e oprit dar păstrat ca fallback rapid. Conexiunea e centralizată via agent-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:
    backend/services/orchestration-layer/scripts/redis-switch.sh local redis
    
    Asta rescrie .env și restart agent-v3 stack pentru a folosi didi-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 (repo git.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 didi configurat cu prefix izolat
  • Container local păstrat ca fallback (oprit, volum intact)
  • Bootstrap framework automat la pornire