Problema
Se necesita ejecutar un motor de búsqueda vectorial (Qdrant) en Azure para alimentar un RAG que crecerá a decenas de millones de vectores y que recibirá inserciones/actualizaciones continuas desde SQL Server. La pregunta central es: ¿qué servicio de Azure usar, cómo dimensionar la máquina, qué familia de VM se adapta a cargas intensivas de memoria, cómo monitorizar el clúster y cómo prever el gasto mensual?
Este escenario se repite en muchos proyectos de IA generativa, donde la base de datos vectorial pasa de pruebas de concepto a producción y la infraestructura debe escalar sin interrupciones.
Causa
Los problemas suelen aparecer por tres motivos recurrentes:
- Elección inadecuada del servicio – desplegar Qdrant en una VM genérica o en un clúster de AKS sin considerar la carga de I/O y la latencia de red genera cuellos de botella cuando el número de vectores supera los pocos millones.
- Sub‑dimensionamiento de recursos – la memoria RAM y el IOPS de los discos SSD son críticos para mantener el índice en RAM y evitar lecturas de disco excesivas. Un cálculo basado solo en CPU puede dejar la instancia sin espacio para los segmentos de datos.
- Falta de observabilidad – sin métricas de latencia, uso de heap y consumo de disco, los incidentes aparecen como “latencia alta” sin pista de la causa, lo que dificulta la corrección rápida y la planificación de capacidad.
Solución
1. Selección del tipo de servicio
| Opción | Ventajas | Desventajas | Cuándo usar |
|---|---|---|---|
| Azure VM + Docker | Simplicidad de despliegue, control total del host, fácil de probar en entornos de desarrollo. | Escalado manual, alta fricción para actualizaciones. | PoC, entornos con < 5 M vectores, equipo pequeño. |
| Azure Kubernetes Service (AKS) | Orquestación automática, escalado horizontal, integración con Azure Monitor y Azure Policy. | Curva de aprendizaje, necesidad de definir pods, storage class. | Producción, > 10 M vectores, necesidad de alta disponibilidad. |
| Azure Container Apps (opcional) | Serverless, facturación por uso, sin gestión de nodos. | Limitado a contenedores ligeros, menos control sobre hardware subyacente. | Cargas variables con picos impredecibles y bajo presupuesto. |
Para la mayoría de los despliegues productivos de Qdrant, AKS resulta la opción más robusta. Permite definir un node pool con máquinas optimizadas para memoria y SSD, y añadir un deployment con replicación y readiness probes.
2. Dimensionamiento de recursos
- Memoria – Qdrant mantiene los índices en RAM. Como regla práctica, reserva al menos 2 GB de RAM por cada 1 M de vectores (para vectores de 1536 dimensiones, típicos de embeddings). Para 30 M vectores, apunta a ~60 GB de RAM.
- CPU – Las operaciones de inserción y búsqueda son paralelizables. Un vCPU por 5 M de vectores suele ser suficiente, pero mantén un margen del 30 % para picos de carga.
- Almacenamiento – Usa discos Premium SSD v2 (IOPS ≥ 5 000, throughput ≥ 200 MiB/s) y provisiona al menos 2× el tamaño estimado de los vectores (por redundancia de snapshots).
- Red – En AKS, coloca los pods en una subnet con Accelerated Networking y habilita private endpoints para evitar latencia externa.
Elección de familia de VM
| Familia | Características clave | Uso típico con Qdrant |
|---|---|---|
| Esv4 / Esv5 | Memoria alta (up to 432 GiB), SSD premium, buen ratio CPU/RAM. | Cargas con > 20 M vectores, alta concurrencia. |
| Mdv2 | Máxima memoria (up to 3.8 TiB), pero CPU limitado. | Indexes inmensamente grandes que caben íntegramente en RAM. |
| Dsv4 / Dsv5 | Balance general, buen rendimiento de red. | Entornos de prueba o workloads < 10 M vectores. |
En producción he visto que Esv4 (por ejemplo, Standard_E8s_v4) ofrece un equilibrio cómodo: 8 vCPU, 64 GiB RAM, 2 × P10 Premium SSD.
3. Configuración de AKS
# Crear un cluster AKS con un node pool de tipo Esv4
az group create -n rg-qdrant -l eastus2
az aks create \
-g rg-qdrant \
-n aks-qdrant \
--node-vm-size Standard_E8s_v4 \
--node-count 3 \
--enable-addons monitoring \
--network-plugin azure \
--vnet-subnet-id /subscriptions/<sub>/resourceGroups/rg-qdrant/providers/Microsoft.Network/virtualNetworks/vnet-qdrant/subnets/aks-subnet \
--attach-acr <acr-name>
- Persistencia – Crea un storage class basado en Premium SSD v2 y monta un PersistentVolume para los snapshots de Qdrant.
- Health checks – Define
livenessProbeyreadinessProbeque consulten/healthdel API. - Auto‑escalado – Configura Cluster Autoscaler y Horizontal Pod Autoscaler (HPA) con métricas de CPU y de uso de memoria del contenedor.
4. Observabilidad
- Azure Monitor – Habilita el container insights al crear el cluster (
--enable-addons monitoring). Recopila métricas de CPU, memoria, IOPS y latencia de red. - Prometheus + Grafana – Qdrant expone un endpoint
/metrics. Añade un scrape config en Prometheus y un dashboard de Grafana con paneles de:qdrant_collection_points_count(tamaño del índice)qdrant_search_latency_secondsprocess_resident_memory_bytes
- Alertas – Configura alertas en Azure Monitor o en Prometheus Alertmanager para: uso de RAM > 80 %, latencia de búsqueda > 200 ms, IOPS > 90 % de la cuota.
5. Estimación de costos
- VMs – Calcula el precio por hora de la familia elegida (Esv4 ≈ $0.40/h en East US 2). Multiplica por número de nodos y horas al mes.
- Discos – Premium SSD v2 tiene costo por GB‑mes (≈ $0.12/GB). Multiplica por el espacio provisionado.
- Red – Salida de datos a internet se cobra por GB; si todo el tráfico es interno a la VNet, el costo es casi nulo.
- AKS – El control plane es gratuito; solo pagas por los nodos.
- Monitor – Azure Monitor tiene un nivel gratuito; el consumo extra se mide en métricas y logs (≈ $2.30/1 M métricas).
Una hoja de cálculo sencilla con los parámetros anteriores permite obtener una estimación mensual con ±10 % de precisión.
Cuándo aplicar esta solución
- Escala esperada > 10 M vectores o crecimiento rápido.
- Requerimientos de alta disponibilidad (mínimo 2 réplicas).
- Necesidad de observabilidad centralizada (integración con Azure Monitor o Prometheus).
- Presupuesto suficiente para VMs de alta memoria (Esv4/Es5).
No es adecuada cuando:
- El proyecto está en fase de prototipo con < 5 M vectores y no justifica la complejidad de AKS.
- El equipo no tiene experiencia con Kubernetes y el tiempo de puesta en marcha es crítico; una VM única puede ser más rápida.
Verificación
- Carga de datos – Inserta un lote de 1 M vectores y verifica que
qdrant_collection_points_countaumenta en tiempo real. - Latencia de búsqueda – Ejecuta 100 consultas de similitud y confirma que la métrica
qdrant_search_latency_secondsse mantiene bajo el umbral definido (p.ej., 150 ms). - Uso de recursos – Observa
process_resident_memory_bytes; debe estar por debajo del 80 % de la RAM asignada. - Resiliencia – Detén un nodo del pool; AKS debe re‑programar los pods y el endpoint debe seguir respondiendo sin errores 5xx.
Notas adicionales
- Snapshots automáticos – Programa snapshots diarios a un Blob Storage mediante la CLI de Qdrant (
qdrant snapshot create). - Sincronización con SQL Server – Usa Change Data Capture (CDC) en SQL Server y un Azure Function que publique cambios a una cola (Service Bus) consumida por un worker que actualice Qdrant.
- Tuning de índices – Ajusta
hnsw_myhnsw_ef_constructal crear la colección; valores más altos reducen latencia a costa de mayor RAM. - Costos ocultos – Los snapshots en Blob pueden generar costos de almacenamiento y salida; configura una política de retención de 30 días para evitar sorpresas.
Con estos lineamientos puedes pasar de una prueba de concepto a una arquitectura de producción robusta, predecible en costos y fácil de monitorizar.