Problema
Los equipos que construyen sistemas RAG (Retrieval‑Augmented Generation) suelen necesitar una base de datos de vectores capaz de escalar a decenas de millones de puntos y de recibir inserciones o actualizaciones continuas desde una base relacional. Qdrant es una opción popular, pero su despliegue en Azure no es trivial: hay que decidir entre máquinas virtuales tradicionales, contenedores Docker o un clúster Kubernetes, dimensionar CPU, RAM y almacenamiento SSD, elegir familias de VM que mantengan buen rendimiento bajo carga de búsqueda vectorial y, por último, establecer una estrategia de monitoreo y control de costos. La falta de una guía consolidada lleva a sobre‑provisionamiento costoso o a cuellos de botella que degradan la latencia de búsqueda.
Causa
-
Elección de servicio equivocado
- Las VM de propósito general (B‑Series, D‑Series) pueden quedarse cortas en operaciones de cálculo intensivo y en acceso a disco rápido.
- Un clúster AKS mal configurado puede introducir latencia de red interna y sobrecarga de control plane.
-
Dimensionamiento sin datos de referencia
- Qdrant almacena los vectores en memoria y usa SSD para persistencia. Subestimar la RAM lleva a swapping y a caídas de rendimiento.
- Ignorar la tasa de inserción (writes per second) hace que la IOPS del disco sea insuficiente.
-
Monitorización limitada
- Confiar solo en métricas de Azure Monitor sin exponer los contadores internos de Qdrant (latencia de búsqueda, uso de heap, número de shards) oculta problemas de saturación.
-
Estimación de costos basada en precios estáticos
- No considerar descuentos por reservas, uso de discos Premium SSD vs. Ultra SSD o el coste de tráfico intra‑zona en AKS genera sorpresas en la factura mensual.
Solución
1. Selección del servicio Azure
| Necesidad | Recomendación | Por qué |
|---|---|---|
| Carga predecible, alta densidad de vectores | Azure VM + Docker (Series E o M) | Memoria alta (E: 2 vCPU / 16 GB, M: 8 vCPU / 256 GB) y discos Premium SSD garantizan latencia < 1 ms. |
| Escalado dinámico, múltiples microservicios | Azure Kubernetes Service (AKS) con nodos de la familia Dsv4 o Esv4 | Dsv4 ofrece buen equilibrio CPU‑RAM; Esv4 brinda 8 vCPU / 64 GB por nodo, ideal para búsquedas vectoriales. |
| Necesidad de alta disponibilidad geográfica | AKS con zona de disponibilidad + Azure Load Balancer | Distribuye pods en al menos 2 zonas, evita punto único de falla. |
En la práctica, empiezo con una VM de la serie E4s_v3 (4 vCPU, 32 GB RAM, 1 TB Premium SSD). Si la carga crece, migrar a AKS permite añadir nodos sin tiempo de inactividad.
2. Dimensionamiento de recursos
-
Memoria
- Cada vector ocupa
dim * 4 bytes(float32). Para 10 M de vectores con dimensión 1536: ≈ 60 GB solo para datos. Añadir un 30 % de overhead para índices y estructuras internas → ~ 80 GB. - Reserva al menos 1,5 × el consumo estimado → 120 GB RAM. En una VM E8s_v3 (8 vCPU, 64 GB) se queda justo; mejor E16s_v3 (16 vCPU, 128 GB).
- Cada vector ocupa
-
CPU
- Qdrant paraleliza búsquedas por número de hilos. Un nodo con 8 vCPU puede atender ~ 2 k QPS con vectores de 1536 dimensiones. Multiplica por la carga esperada y añade un 20 % de margen.
-
Almacenamiento
- Usa Premium SSD (P30 1 TB) o Ultra SSD si la tasa de escritura supera 20 k IOPS. Configura el disco como Managed Disk con Write Accelerator cuando la inserción sea muy alta.
-
Red
- En AKS, habilita Azure CNI para que los pods tengan IPs de la VNet y evitar NAT overhead. Reserva al menos 5 Gbps de ancho de banda de red para nodos de búsqueda intensiva.
3. Configuración de Qdrant
- Ejecuta Qdrant en Docker con los flags de memoria y persistencia:
docker run -d \
--name qdrant \
-p 6333:6333 \
-v /data/qdrant:/qdrant/storage \
-e QDRANT__SERVICE__HOST=0.0.0.0 \
-e QDRANT__SERVICE__GRPC_PORT=6334 \
-e QDRANT__STORAGE__MAX_RAM_SIZE=100000000000 \
qdrant/qdrant:latest
- En AKS, utiliza un Helm chart (o manifiesto YAML) que establezca
resources.limits.memoryacorde al cálculo anterior y monte unPersistentVolumeClaimconstorageClassName: premium_lrs.
4. Monitoreo
- Exporters
- Instala el Prometheus exporter que Qdrant incluye (
/metrics). En AKS, añade unServiceMonitorpara que Prometheus raspe/metricsen el puerto 6333.
- Instala el Prometheus exporter que Qdrant incluye (
- Dashboards
- Usa Grafana con paneles predefinidos: latencia de búsqueda (
search_latency_ms), uso de RAM (process_resident_memory_bytes), número de shards activos.
- Usa Grafana con paneles predefinidos: latencia de búsqueda (
- Alertas
- Configura alertas en Alertmanager: RAM > 80 % → escalar, latencia > 200 ms → revisar índices, IOPS > 80 % del disco → cambiar a Ultra SSD.
- Azure Monitor
- Conecta el agente de Azure Monitor al nodo VM o al pool de nodos AKS para correlacionar métricas de red y CPU con los datos de Qdrant.
5. Estimación de costos
- VM
- E16s_v3 (Linux) ≈ US$0.85 /hora → ~ US$600 /mes.
- Discos
- Premium SSD P30 (1 TB) ≈ US$122 /mes.
- AKS
- Nodos de Dsv4 (8 vCPU, 32 GB) ≈ US$0.45 /hora cada uno + costo del plano de control (gratuito bajo 5 nodos).
- Red
- Tráfico intra‑zona es gratuito; salida a Internet se factura por GB.
- Licencias de monitoreo
- Azure Monitor Logs ≈ US$2.30 /GB de ingesta; Prometheus + Grafana en VM o AKS suele ser gratuito si se auto‑hospeda.
Para una estimación rápida, usa la Calculadora de precios de Azure, ingresa los tipos de VM, discos y estimación de tráfico. Aplica Reserved Instances (1‑año o 3‑años) para reducir el gasto en VM hasta un 40 %.
Cuándo aplicar esta solución
- Escenarios con > 10 M vectores y búsquedas en tiempo real.
- Workloads que requieren alta disponibilidad (p.ej., aplicaciones de IA en producción).
- Entornos donde la tasa de ingestión supera 5 k writes/s; el uso de SSD Premium o Ultra es obligatorio.
- Equipos que ya usan Docker o Kubernetes y buscan mantener la consistencia operativa con el resto de la arquitectura Azure.
No es adecuada cuando:
- La carga es esporádica y el número de vectores < 1 M; una VM pequeña o un contenedor en Azure App Service puede ser suficiente.
- El presupuesto es extremadamente limitado y no se pueden asumir discos Premium; en ese caso, considerar un motor de vectores más ligero (p.ej., SQLite con extensión vector) podría ser más económico.
Código
# Creación de un Managed Disk Premium SSD de 1 TB
az disk create \
--resource-group rg-qdrant \
--name qdrant-disk \
--size-gb 1024 \
--sku Premium_LRS
# Despliegue de Qdrant en AKS con Helm (asumiendo helm repo añadido)
helm install qdrant qdrant/qdrant \
--set persistence.enabled=true \
--set persistence.storageClass=premium_lrs \
--set resources.limits.memory=120Gi \
--set service.type=LoadBalancer
Verificación
- Conexión básica
curl http://<IP>:6333/collectionsdebe devolver JSON con las colecciones existentes.
- Carga de prueba
- Inserta 100 k vectores con la API
/pointsy verifica que el tiempo medio de inserción sea < 5 ms.
- Inserta 100 k vectores con la API
- Métricas
- En Grafana, confirma que
process_resident_memory_bytesse mantiene por debajo del 70 % del límite configurado.
- En Grafana, confirma que
- Escalado
- Simula un pico de 5 k QPS usando
heyok6; verifica que las alertas de latencia no se disparen y que los nodos AKS añadan pods automáticamente (si HPA está configurado).
- Simula un pico de 5 k QPS usando
Notas adicionales
- Sharding: Qdrant permite dividir la colección en shards. Para > 50 M vectores, crea 2‑3 shards y asigna cada uno a un pod distinto; reduce la presión de RAM por pod.
- Backup: Programa snapshots de los discos Premium usando
az snapshot create. Los snapshots son incrementales y permiten restaurar rápidamente en caso de corrupción. - **Seguridad