- OpenAI amplió a gran escala su infraestructura de PostgreSQL para responder al rápido aumento del tráfico de ChatGPT y de la API, procesando millones de QPS con un único servidor flexible de Azure PostgreSQL y alrededor de 50 réplicas de lectura
- Mantuvieron una arquitectura optimizada para cargas centradas en lectura y migraron parte de las cargas a Azure Cosmos DB para aliviar la presión de escritura
- Mejoraron la estabilidad y la latencia con varias optimizaciones, como pooling de conexiones con PgBouncer, bloqueo de caché, rate limiting y aislamiento de cargas de trabajo
- Para superar las limitaciones de una arquitectura con un solo primario, avanzaron en paralelo con configuraciones de alta disponibilidad (HA), hot standby y pruebas de replicación en cascada (cascading replication)
- Con este enfoque lograron 99.999% de disponibilidad y latencia p99 en decenas de milisegundos, dejando abierta la posibilidad de escalar en el futuro hacia PostgreSQL con sharding o sistemas distribuidos alternativos
Resumen del escalado de PostgreSQL
- PostgreSQL es el sistema de datos central de ChatGPT y de la API de OpenAI, y en el último año la carga creció más de 10 veces
- Un único primario y unas 50 réplicas de lectura distribuidas globalmente procesan las solicitudes de 800 millones de usuarios
- Mantuvieron una arquitectura centrada en lectura y trasladaron parte de las cargas a Azure Cosmos DB para aliviar la carga de escritura
- Se prohibió agregar nuevas tablas, y las nuevas cargas de trabajo se colocan por defecto en un sistema con sharding
Desafíos de una arquitectura con un solo primario y cómo los abordaron
- Una arquitectura con un solo escritor tiene límites de escalabilidad en escritura y un problema de punto único de falla (SPOF)
- El tráfico de lectura se distribuye en las réplicas, y el tráfico de escritura de cargas que pueden fragmentarse se trasladó a Cosmos DB
- Una configuración de alta disponibilidad con hot standby permite una promoción rápida ante fallos (failover)
- Cuando la carga de lectura se dispara, los fallos de caché pueden saturar la CPU
- Introdujeron un mecanismo de bloqueo de caché para evitar consultas duplicadas sobre la misma clave
Optimización de consultas y recursos
- Consultas complejas con múltiples joins consumían demasiada CPU y provocaban latencia en el servicio
- Revisaron el SQL ineficiente generado por el ORM y movieron la lógica de joins complejos a la capa de aplicación
- Configuraron idle_in_transaction_session_timeout para evitar consultas inactivas de larga duración
- Para resolver el problema de “noisy neighbor”, separaron el tráfico en instancias por prioridad
- Así, las solicitudes de baja prioridad no afectan a los servicios de alta prioridad
Gestión de conexiones y control de carga
- Para resolver el límite de 5,000 conexiones de Azure PostgreSQL, introdujeron PgBouncer como capa de proxy
- Reutilizar conexiones redujo el tiempo promedio de conexión de 50 ms a 5 ms
- Para reducir la latencia de red entre regiones, ubicaron el proxy, el cliente y la réplica en la misma región
- Aplicaron rate limiting a nivel de aplicación, proxy y consulta para evitar picos bruscos de tráfico
- También mejoraron la capa ORM para poder bloquear determinados digest de consultas
Replicación y gestión de cambios de esquema
- Como el primario debe hacer streaming de logs WAL a todas las réplicas, aumentar la cantidad de réplicas eleva la carga de red
- Están probando replicación en cascada (cascading replication) en colaboración con el equipo de Azure
- Una réplica intermedia retransmite el WAL a las réplicas inferiores, lo que abre la posibilidad de escalar a más de 100 réplicas
- Se prohíben los cambios de esquema que provoquen una reescritura completa de la tabla (full table rewrite)
- Solo se permiten cambios ligeros dentro de un timeout de 5 segundos, y la creación o eliminación de índices puede hacerse de forma concurrente
- Incluso durante el backfill se aplican límites de velocidad estrictos
Resultados y próximos pasos
- PostgreSQL procesa millones de QPS y logró latencia p99 de decenas de milisegundos y 99.999% de disponibilidad
- En los últimos 12 meses solo hubo un incidente SEV-0, ocurrido durante el lanzamiento de ChatGPT ImageGen
- Las cargas restantes centradas en escritura también se están migrando gradualmente a Cosmos DB
- Una vez completada la replicación en cascada, planean reforzar la escalabilidad y la estabilidad de las réplicas
- A futuro evalúan la posibilidad de adoptar PostgreSQL con sharding o sistemas distribuidos alternativos
1 comentarios
Comentarios en Hacker News
En PostgreSQL, las consultas idle de larga duración suelen causar problemas
En el código de nuestra empresa había mucho el patrón de “connect → iniciar transacción → hacer trabajo → commit si todo sale bien”
Ese enfoque seguía ocupando slots de conexión incluso cuando en realidad no se estaba usando la base de datos, así que al final hubo que aumentar la cantidad de conexiones de Postgres a miles
Por eso agregaron una verificación en tiempo de compilación en el código Rust, para que si se llama a
.awaitmientras se mantiene una conexión dentro de una función async, el compilador avise de inmediatoSe corrigieron más de 100 lugares, pero gracias a eso ahora las pruebas de carga no se ralentizan ni siquiera usando un pool de 32 en vez de 10,000 conexiones
Reducir simplemente el idle timeout también era una opción, pero la verificación estática resultó ser una solución mucho más segura
El artículo era demasiado superficial y solo repetía palabras clave como “¡hicimos sharding!”
Casi no había detalles y daba la impresión de ser texto para SEO
La idea principal del texto se resumía más o menos en “un solo writer no escala, así que redujimos las escrituras y separamos las lecturas”
Casi no había nada nuevo, y solo mencionaba enfoques comunes como optimización de consultas, sharding y réplicas de lectura
Lo que me gusta de Postgres es que puede aguantar bastante escala con solo aumentar CPU y disco
Para cuando llegas al punto de necesitar sharding, ya también puedes permitirte contratar a un especialista
Por eso suena raro decir que “para hacer sharding hay que dejar Postgres”
Por ejemplo, hay noticias de que OpenAI sigue teniendo pérdidas enormes y ni siquiera está claro si podrá aguantar hasta 2027
Sobre los cambios de esquema y los timeouts, se comentó que no basta con configurar timeouts
Ejecutar en paralelo scripts que terminen automáticamente las transacciones en conflicto durante el rollout del esquema sería mucho más eficiente
Estaría bien que Postgres ofreciera eso de forma nativa, porque es mejor cancelar algunas transacciones que quedarse esperando con locks pesados
Como primera publicación del blog de OpenAI Engineering, resultó interesante
Me gustaría ver más casos en el futuro
Había curiosidad por la configuración de replicación
Decían que incluso con 50 réplicas de lectura casi no había retraso de replicación,
pero en la práctica es muy probable que algunas réplicas se atrasen por picos de CPU o memoria
En ese caso, el primario también podría volverse más lento por tener que esperar el envío de WAL
Había una parte que decía que “si una función nueva necesita tablas adicionales, se pone en Azure CosmosDB en vez de PostgreSQL”
Es decir, parecía que mantenían el sistema existente y movían solo las funciones nuevas a otra base de datos
Decían que “aumentaron el tamaño de las instancias”, pero quedaba la duda de hasta qué nivel
Había interés en saber qué CPU y RAM usan, si son instancias comunes como las de cualquier usuario o si se trata de hardware personalizado
Ejemplo: Azure Standard_E192ibds_v6 (96 núcleos, 1.8 TB de RAM, 10 TB SSD, 3M IOPS)
Y hay modelos aún mayores para SAP HANA, como Standard_M896ixds_24_v3, que ofrece 896 núcleos, 32 TB de memoria y red de 185 Gbps
Estas instancias rondan los 175 mil dólares al mes, aunque OpenAI seguramente habrá obtenido descuentos muy grandes
Personalmente, prefiero usar las VM HX176rs para servidores de base de datos
Gracias a la caché HBM, el ancho de banda de memoria es mucho mayor y el rendimiento fue muy superior al de VM generales de precio similar
Usar Azure PostgreSQL y CosmosDB juntos debe ser carísimo
Aun así, este artículo parecía uno de los ejemplos más realistas de “cómo escalar PostgreSQL” en la práctica
Fue fácil identificarse con un enfoque operado en un entorno cloud estándar, sin modificar el kernel ni hackear el código fuente