Saltar al contenido
ES EN

Cómo ahorrar memoria en un anillo de hash consistente, al estilo Cloudflare

Guía práctica para revisar un anillo de hash consistente y recortar su memoria sin perder reparto de carga, inspirada en el caso de Cloudflare y Pingora.

Ingeniería de software

El hash consistente reparte peticiones entre servidores con el mínimo de reasignaciones cuando el conjunto cambia. Cloudflare lo usa en su Pingora Backend Router para distribuir peticiones cacheables, y documentó cómo redujo en más de 100 TB la memoria de ese servicio afinando su implementación en Rust. Aquí traducimos esa idea a un método que puedes aplicar a tu propio anillo.

En 30 segundos Cada servidor ocupa muchos puntos en el anillo. Cloudflare usó probabilidad para calcular cuántos hacen falta de verdad, recortó un 90 % y compactó cada entrada de 8 a 6 bytes. Después lo desplegó poco a poco para no vaciar la caché.

Lo que necesitas

Necesitas acceso a la implementación de tu anillo (en el caso de Cloudflare, el crate pingora-ketama), la lista real de backends con sus pesos y una forma de medir el reparto de carga que obtienes hoy. Sin esa línea base no sabrás si has mejorado o empeorado.

También conviene entender la paradoja del cumpleaños: cuantos más puntos de 32 bits coloques, más probable es que dos coincidan, y esas colisiones añaden error al reparto. Es el motivo de que «más hashes» no sea gratis ni infinitamente mejor.

Esquema de un anillo de hash consistente con varios servidores repartidos como puntos sobre una circunferencia
Cada servidor aparece muchas veces en el anillo; cuantos menos puntos, menos memoria.

El método paso a paso

  1. Mide el error de reparto actual: cuánta carga recibe cada backend frente a la que le correspondería por su peso.
  2. Anota cuántos hashes por servidor usas y cuántos anillos mantienes (pesos y combinaciones de funcionalidades los multiplican).
  3. Simula el reparto con menos hashes por servidor y traza el error obtenido. Verás que cada mejora de precisión exige casi un orden de magnitud más de puntos.
  4. Elige el mínimo que cumpla tu margen de error aceptable. Cloudflare comprobó que los últimos 90000 hashes mejoraban el error solo un 0,7 %.
  5. Compacta la estructura: si el hash y el índice de servidor caben en 6 bytes, no guardes 8.
  6. Despliega el anillo nuevo en paralelo al antiguo y desplaza el tráfico de forma gradual.
// Idea, no el código de Cloudflare:
// antes: 8 bytes por punto
struct PuntoViejo { hash: u32, servidor: u32 }

// después: 6 bytes (hash de 32 bits + índice de 16 bits)
#[repr(packed)]
struct PuntoCompacto { hash: u32, servidor: u16 }

Este fragmento es solo una ilustración de la compactación descrita en el artículo; el índice de 16 bits asume que tienes menos de 65 536 servidores, así que valida ese límite en tu caso. El detalle completo está en la crónica de InfoQ y en el blog original.

Cuidado con la caché

Cambiar el anillo cambia a qué servidor va cada petición cacheable. Aunque el nuevo anillo sea mejor, conmutar toda la red de golpe invalidaría casi todo el contenido en caché y dispararía el tráfico hacia los orígenes. Por eso Cloudflare lo desplegó junto al anillo existente, de forma progresiva, para limitar esa rotación.

Gráfica con dos líneas que muestran el tráfico hacia los orígenes durante una migración gradual frente a una brusca
Una migración escalonada evita el pico de tráfico hacia los orígenes.
Truco Antes de tocar nada, saca un perfil de memoria y localiza qué estructura domina. Cloudflare encontró el problema porque investigó el consumo de sus estructuras de hash, no porque adivinara. Y no des por universal el 90 %: tu cifra depende de tu error aceptable y de tus pesos.

Si quieres ver cómo opinan otros desarrolladores sobre por qué el hash consistente sigue siendo útil pese a su coste, hay un debate en Hacker News con puntos de vista interesantes.

Fuente original: infoq.com

Artículo generado mediante AI.larebelion

Kernel

· Dirección de tecnología · España

«Cloudflare no solo ahorró 100 TB: demostró que un parámetro heredado puede costar más que cualquier algoritmo nuevo.»

Comentarios

Publicar un comentario