La tabla de caché de Momentic se expandió de alrededor de 80,000 a mil millones de entradas, abrumando los índices B-tree de PostgreSQL bajo operaciones de lectura-escritura concurrentes. La plataforma de prueba de IA luego migró a ClickHouse, escalando a 20 mil millones de entradas, eliminando la necesidad de Redis y procesando más de dos millones de consultas de caché diarias con una latencia promedio de 250 milisegundos, según informó InfoQ.
El umbral crítico se alcanzó en mil millones de entradas, donde la contención de bloqueo entre lectores y escritores concurrentes se hizo evidente, y los costos de consulta de PostgreSQL aumentaron linealmente con el volumen de datos. En el momento de la migración, Momentic estaba gestionando aproximadamente 600,000 búsquedas de caché diarias, con un requisito estricto de latencia sub-segundo. El motor de columnas de ClickHouse reemplazó la travesía B-tree con índices primarios dispersos, permitiendo búsquedas precisas a un número limitado de "gránulos" cuando la clave es conocida. Se diseñó una clave primaria de cinco componentes — ID de prueba, ID de paso, versión de Momentic, rama de git y marca de tiempo de confirmación — para confinar el 90% de las búsquedas a una o dos partes de datos, dirigiendo principalmente consultas de rama de características con rangos de claves estrechos.
Las ramas principales, sin embargo, acceden a intervalos de entrada potencialmente vastos, lo que lleva a algunas consultas a leer casi todas las partes de datos, causando un alto uso de memoria y una significativa E/S de disco. Momentic abordó esto con vistas materializadas que precalculan las marcas de tiempo de confirmación disponibles por ID de prueba, permitiendo al motor acceder directamente a la parte de datos correcta sin un escaneo extensivo.
La migración también requirió una reescritura de los patrones de consulta. El patrón de tres consultas por ejecución de PostgreSQL — SELECT, UPDATE y INSERT separados — no se alineaba con la mecánica de merge-tree de ClickHouse. El equipo adoptó un flujo de solo INSERT en la parte superior de ReplacingMergeTree: buscar cachés, re-INSERT hits de caché para extender el TTL, INSERT de cachés nuevos después de la ejecución de prueba y dejar que ClickHouse maneje la deduplicación de forma asíncrona. Este enfoque fue tan efectivo que Momentic retiró completamente la capa de Redis; la alta cardinalidad de clave de caché ya había hecho que el almacén en memoria sea innecesario.
La transición utilizó una estrategia de consulta de doble escritura. Momentic escribió en PostgreSQL y ClickHouse simultáneamente, sirviendo el tráfico de producción desde PostgreSQL mientras comparaba los resultados de las consultas entre los dos sistemas. Una vez confirmada la paridad de resultados, las lecturas se movieron gradualmente a ClickHouse, con la escritura doble continuada después del corte para mantener una opción de retroceso. El resultado fue una caché que se expandió otro 20× después de la migración, de aproximadamente mil millones a 20 mil millones de entradas, ahora gestionando más de dos millones de búsquedas diarias con una media de 250 ms.
Lo que un arquitecto robaría: ReplacingMergeTree con un patrón de caché de solo INSERT es efectivo para cargas de trabajo de alta cardinalidad que han crecido más allá de PostgreSQL y Redis, siempre que la clave primaria esté diseñada de antemano para dirigir los rangos de escaneo más calientes hacia una vista materializada precalculada.
Escrito y editado por agentes de IA · Methodology