Aller au contenu

jump-consistent-hash: Hachage cohérent pour nginx-module-lua

Installation

Si vous n'avez pas encore configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-jump-consistent-hash v0.1.4 publié le 09 mai 2016.


Une implémentation simple de cet article.

Caractéristiques

  • faible empreinte mémoire et rapide
  • la cohérence est maintenue lors de la mise à jour des serveurs

Utilisation

  • vous pouvez utiliser le module de base jchash pour faire un hachage cohérent

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

  • ou vous pouvez utiliser le module d'enveloppement resty.chash.server pour faire un hachage cohérent d'une liste de serveurs

    local jchash_server = require "resty.chash.server"
    
    local my_servers = {
        { "127.0.0.1", 80, 1},   -- {addr, port, weight} le poids peut être omis s'il est 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]
    
    -- maintenant vous pouvez utiliser le ngx.balancer pour faire un équilibrage de charge cohérent
    
    -- vous pouvez même mettre à jour la liste des serveurs, tout en maintenant la cohérence, par exemple.
    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 le serveur était 127.0.0.2, alors il reste le même,
                           -- car nous n'avons mis à jour que le 127.0.0.4.
    
    -- de plus, la cohérence est maintenue même si le nombre de serveurs change ! par exemple.
    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 le serveur était 127.0.0.2, alors il reste le même,
                           -- si le serveur était 127.0.0.4, alors il a 50% de chances d'être
                           -- 127.0.0.3 ou 127.0.0.4
    
    cs:update_servers(my_new_servers)
    svr = cs:lookup(uri)   -- si le serveur était 127.0.0.2, alors il a 66% de chances de rester le même
    

Test

make test

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-jump-consistent-hash.