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

117 lines
4.4 KiB
Markdown

# 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).
```typescript
// 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:
```bash
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`
```bash
# 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
```bash
# 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