El equipo de ingeniería de Meta presentó ZGateway, una capa de proxy que ahora se ubica entre las aplicaciones cliente y ZippyDB, el almacén clave-valor más usado de la empresa. ZippyDB sostiene metadatos de producto, contadores y configuración a un ritmo de miles de millones de operaciones por segundo. ZGateway empezó como un parche para la proliferación de conexiones a lo largo de más de un millón de máquinas cliente, y creció hasta convertirse en el lugar donde viven el agrupamiento de pedidos, el control de admisión, la caché y la conmutación por falla.

¿Qué problema tenía ZippyDB?

Con acceso directo, cada cliente de ZippyDB se conectaba a cada máquina de base de datos que necesitara. Un solo cliente podía tocar decenas de miles de fragmentos repartidos en cientos de miles de máquinas, así que tanto un cliente típico como una máquina de base de datos típica cargaban decenas de miles de conexiones TLS.

Cada conexión ociosa consumía memoria, CPU y un descriptor de archivo en los dos extremos, y los conteos de entrada crecían con cada nueva camada de clientes. Las tormentas de reconexión provocaban caídas por agotamiento de descriptores de archivo y por falta de memoria. En un incidente, un error de enrutamiento hizo que cada cliente abriera una conexión por fragmento y la flota entera entró en un ciclo de reinicios.

Arreglarlo del lado del cliente era impracticable, porque la flota de clientes está repartida entre cientos de equipos distintos.

Qué es ZGateway

ZGateway es una capa de proxy sin estado entre los clientes de ZippyDB y la flota de bases de datos ZServer. Según Meta, maneja más de mil millones de operaciones por segundo y transporta cerca del 40% del tráfico de ZippyDB, con proyección de superar el 60%, a un costo aproximado de 6% de sobrecarga de cómputo para un caso de uso promedio.

Corre como capas regionales que se descubren a través de ServiceRouter, la malla de servicios de Meta, en dos sabores. Uno es proxy puro y el otro es caché de lectura directa. El motor es el cliente pesado de ZippyDB escrito en C++ de la propia Meta, así que ZGateway es en la práctica un cliente de ZippyDB corriendo como servicio administrado.

Un cliente manda sus pedidos por una conexión pegajosa a una máquina ZGateway regional. Esa máquina termina el TLS, autoriza contra las listas de control de acceso del caso de uso, aplica control de admisión y modelado de tráfico por inquilino, resuelve el fragmento, revisa la caché local si está en una capa con caché, agrupa el pedido con otro trabajo en vuelo para ese mismo fragmento y lo reenvía a las réplicas correctas. Las respuestas se demultiplexan de vuelta, y quedan registradas las métricas, las trazas y el uso de cuota por caso de uso. El TLS se mantiene dentro de la pila de Thrift y ServiceRouter, y la selección de réplica se queda en el cliente embebido.

¿Cuánto bajan las conexiones?

Meta modela la flota como bolas lanzadas a cajones, con una fórmula que entrega la probabilidad de que una máquina reciba tráfico dados los fragmentos y las máquinas en juego.

Con cifras de ejemplo de 20 regiones, 500.000 máquinas de base de datos, 30.000 máquinas de proxy, 1.000.000 de clientes y 50.000 fragmentos por cliente, los conteos de conexión por máquina se desploman entre 97% y 98%, y el total de conexiones persistentes cae cerca de 19 veces.

La ganancia de fondo está en cómo escala. Con acceso directo, la convergencia de conexiones sobre la base de datos crece de forma lineal con la cantidad de clientes. Con ZGateway se reduce aproximadamente al número de regiones multiplicado por la densidad de fragmentos por máquina, un valor independiente del tamaño de las dos flotas.

Lo que vino después del proxy

Una vez instalada la capa, Meta le fue colgando funciones que antes vivían en el cliente.

  • Migración segura. Banderas de configuración acotadas por servicio y por prefijo de fragmento entregan una rampa por porcentaje, un filtro por región y un interruptor de corte global.
  • Descarte discriminado de carga. Los pedidos se mapean a canastas por inquilino, divididas por prioridad, que se vacían por turnos. Un inquilino que inunda el sistema solo llena su propia canasta. En una sobrecarga controlada por sobre el 90% de CPU a lo largo de unas 1.350 canastas de inquilinos, solo 6 vecinos ruidosos perdieron carga, el resto ejecutó el 99,9% de sus pedidos con cero rechazos, el rendimiento útil se mantuvo cerca del 97% al 98%, y la maquinaria costó alrededor de 8% de CPU.
  • Caché de lectura. Las capas con caché sirven las lecturas calientes dentro del proceso, toman un candado de llenado por clave cuando fallan y se mantienen frescas con eventos de captura de cambios, bajo un contrato de obsolescencia acotada.
  • Balanceo de carga. Las capas mezclan máquinas de entre 26 y 126 núcleos, así que un balanceador del plano de control empuja el peso de ServiceRouter de cada máquina en dirección contraria a su carga reciente de CPU.
  • Resiliencia entre regiones. El enrutamiento global, las mega regiones y los anillos permiten que una capa regional saturada conmute hacia capacidad sana cercana.
  • Transacciones. La contabilidad que se llevaba del lado del cliente se movió a la pasarela, y se consolidó en nueve fases hasta cubrir el 100% del tráfico transaccional, sin regresión de confiabilidad.

¿Sirve fuera de Meta?

No. ZGateway no es desplegable fuera de la infraestructura de Meta, y la propia publicación lo dice. El valor está en los patrones, y no en un paquete que alguien pueda instalar.

Los números que deja la publicación son cuatro. La pasarela mueve más de mil millones de operaciones por segundo y transporta cerca del 40% del tráfico de ZippyDB con alrededor de 6% de sobrecarga. Convierte la convergencia de conexiones sobre la base de datos, que antes crecía con la cantidad de clientes, en un número acotado que Meta controla. El agrupamiento y la fusión de pedidos entre clientes terminan con las estampidas sobre claves calientes y permitieron retirar bibliotecas de cliente frágiles. Y el descarte discriminado aisló a 6 inquilinos ruidosos entre unos 1.350 con la CPU sobre 90%, manteniendo entre 97% y 98% de rendimiento útil.