Saltar a contenido

jump-consistent-hash: Hash consistente para nginx-module-lua

Instalación

Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.

CentOS/RHEL 7 o Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-jump-consistent-hash

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-jump-consistent-hash

Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.

Este documento describe lua-resty-jump-consistent-hash v0.1.4 lanzado el 09 de mayo de 2016.


Una implementación simple de este artículo.

Características

  • pequeño consumo de memoria y rápido
  • la consistencia se mantiene a través de las actualizaciones de los servidores

Uso

  • puedes usar el módulo básico jchash para hacer hash consistente

    local jchash = require "resty.chash.jchash"
    
    local buckets = 8
    local id = jchash.hash_short_str("random key", buckets)
    

  • o puedes usar el módulo envolvente resty.chash.server para hacer hash consistente de una lista de servidores

    local jchash_server = require "resty.chash.server"
    
    local my_servers = {
        { "127.0.0.1", 80, 1},   -- {addr, port, weight} el peso puede omitirse si es 1
        { "127.0.0.2", 80 },
        { "127.0.0.3", 80 }
    }
    
    local cs, err = jchash_server.new(my_servers)
    local uri = ngx.var.uri
    local svr = cs:lookup(uri)
    local addr = svr[1]
    local port = svr[2]
    
    -- ahora puedes usar el ngx.balancer para hacer un balanceo de carga consistente
    
    -- incluso puedes actualizar la lista de servidores y mantener la consistencia, por ejemplo.
    local my_new_servers = {
        { "127.0.0.2", 80 },
        { "127.0.0.3", 80 },
        { "127.0.0.4", 80 }
    }
    
    cs:update_servers(my_new_servers)
    svr = cs:lookup(uri)   -- si el servidor era 127.0.0.2, entonces se mantiene igual,
                           -- ya que solo actualizamos el 127.0.0.4.
    
    -- además, ¡la consistencia se mantiene incluso si cambia el número de servidores! por ejemplo.
    local my_less_servers = {
        { "127.0.0.2", 80 },
        { "127.0.0.3", 80 }
    }
    cs:update_servers(my_less_servers)
    svr = cs:lookup(uri)   -- si el servidor era 127.0.0.2, entonces se mantiene igual,
                           -- si el servidor era 127.0.0.4, entonces tiene un 50% de probabilidad de ser
                           -- 127.0.0.3 o 127.0.0.4
    
    cs:update_servers(my_new_servers)
    svr = cs:lookup(uri)   -- si el servidor era 127.0.0.2, entonces tiene un 66% de probabilidad de mantenerse igual
    

Prueba

make test

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-jump-consistent-hash.