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.serverpara hacer hash consistente de una lista de servidoreslocal 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.