Перейти к содержанию

jump-consistent-hash: Консистентный хеш для nginx-module-lua

Установка

Если вы еще не подписались на RPM репозиторий, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или 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

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-jump-consistent-hash v0.1.4, выпущенный 9 мая 2016 года.


Простая реализация этой статьи.

Особенности

  • небольшой объем памяти и высокая скорость
  • консистентность поддерживается при обновлении серверов

Использование

  • вы можете использовать основной модуль jchash для выполнения консистентного хеша

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

  • или вы можете использовать обертку модуля resty.chash.server для консистентного хеширования списка серверов

    local jchash_server = require "resty.chash.server"
    
    local my_servers = {
        { "127.0.0.1", 80, 1},   -- {addr, port, weight} вес можно опустить, если он равен 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]
    
    -- теперь вы можете использовать ngx.balancer для выполнения консистентной балансировки нагрузки
    
    -- вы даже можете обновить список серверов и сохранить консистентность, например:
    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)   -- если сервер был 127.0.0.2, то он останется тем же,
                           -- так как мы обновили только 127.0.0.4.
    
    -- более того, консистентность сохраняется даже при изменении числа серверов! например:
    local my_less_servers = {
        { "127.0.0.2", 80 },
        { "127.0.0.3", 80 }
    }
    cs:update_servers(my_less_servers)
    svr = cs:lookup(uri)   -- если сервер был 127.0.0.2, то он останется тем же,
                           -- если сервер был 127.0.0.4, то у него 50% шансов быть
                           -- 127.0.0.3 или 127.0.0.4
    
    cs:update_servers(my_new_servers)
    svr = cs:lookup(uri)   -- если сервер был 127.0.0.2, то у него 66% шансов остаться тем же
    

Тест

make test

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-jump-consistent-hash.