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

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. 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).
  2. 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.
  3. 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.
  4. 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.memory acorde al cálculo anterior y monte un PersistentVolumeClaim con storageClassName: premium_lrs.

4. Monitoreo

  1. Exporters
    • Instala el Prometheus exporter que Qdrant incluye (/metrics). En AKS, añade un ServiceMonitor para que Prometheus raspe /metrics en el puerto 6333.
  2. 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.
  3. Alertas
    • Configura alertas en Alertmanager: RAM > 80 % → escalar, latencia > 200 ms → revisar índices, IOPS > 80 % del disco → cambiar a Ultra SSD.
  4. 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

  1. VM
    • E16s_v3 (Linux) ≈ US$0.85 /hora → ~ US$600 /mes.
  2. Discos
    • Premium SSD P30 (1 TB) ≈ US$122 /mes.
  3. AKS
    • Nodos de Dsv4 (8 vCPU, 32 GB) ≈ US$0.45 /hora cada uno + costo del plano de control (gratuito bajo 5 nodos).
  4. Red
    • Tráfico intra‑zona es gratuito; salida a Internet se factura por GB.
  5. 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

  1. Conexión básica
    • curl http://<IP>:6333/collections debe devolver JSON con las colecciones existentes.
  2. Carga de prueba
    • Inserta 100 k vectores con la API /points y verifica que el tiempo medio de inserción sea < 5 ms.
  3. Métricas
    • En Grafana, confirma que process_resident_memory_bytes se mantiene por debajo del 70 % del límite configurado.
  4. Escalado
    • Simula un pico de 5 k QPS usando hey o k6; verifica que las alertas de latencia no se disparen y que los nodos AKS añadan pods automáticamente (si HPA está configurado).

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