Pular para conteúdo

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

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou 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 com o NGINX, certifique-se de que o nginx-module-lua esteja instalado.

Este documento descreve lua-resty-jump-consistent-hash v0.1.4 lançado em 09 de maio de 2016.


Uma implementação simples de este artigo.

Recursos

  • pequena pegada de memória e rápida
  • a consistência é mantida através das atualizações dos servidores

Uso

  • você pode usar o módulo básico jchash para fazer hash consistente

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

  • ou você pode usar o módulo de encapsulamento resty.chash.server para fazer hash consistente de uma lista de servidores

    local jchash_server = require "resty.chash.server"
    
    local my_servers = {
        { "127.0.0.1", 80, 1},   -- {addr, port, weight} o peso pode ser omitido se for 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]
    
    -- agora você pode usar o ngx.balancer para fazer um balanceamento consistente
    
    -- você pode até atualizar a lista de servidores e ainda manter a consistência, por exemplo.
    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)   -- se o servidor era 127.0.0.2, então permanece o mesmo,
                           -- pois apenas atualizamos o 127.0.0.4.
    
    -- além disso, a consistência é mantida mesmo que o número de servidores mude! por exemplo.
    local my_less_servers = {
        { "127.0.0.2", 80 },
        { "127.0.0.3", 80 }
    }
    cs:update_servers(my_less_servers)
    svr = cs:lookup(uri)   -- se o servidor era 127.0.0.2, então permanece o mesmo,
                           -- se o servidor era 127.0.0.4, então tem 50% de chance de ser
                           -- 127.0.0.3 ou 127.0.0.4
    
    cs:update_servers(my_new_servers)
    svr = cs:lookup(uri)   -- se o servidor era 127.0.0.2, então tem 66% de chance de permanecer o mesmo
    

Teste

make test

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-jump-consistent-hash.