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.