117 lines
4.4 KiB
Markdown
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
|