stream-upsync: Módulo NGINX para sincronização de backends de stream a partir do consul ou etcd
Instalação
Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:
- RedHat Enterprise Linux 7, 8, 9 e 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 e Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-stream-upsync
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 nginx-module-stream-upsync
Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:
load_module modules/ngx_stream_upsync_module.so;
Este documento descreve o nginx-module-stream-upsync v1.2.2 lançado em 02 de janeiro de 2020.
nginx-consul:
stream {
upstream test {
upsync 127.0.0.1:8500/v1/kv/upstreams/test/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
include /usr/local/nginx/conf/servers/servers_test.conf;
}
upstream bar {
server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass test;
}
server {
listen 2345;
upstream_show
}
server {
listen 127.0.0.1:9091;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass bar;
}
}
stream {
upstream test {
upsync 127.0.0.1:2379/v2/keys/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=etcd strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
include /usr/local/nginx/conf/servers/servers_test.conf;
}
upstream bar {
server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass test;
}
server {
listen 2345;
upstream_show
}
server {
listen 127.0.0.1:9091;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass bar;
}
}
stream {
upstream test {
least_conn; //hash $uri consistent;
upsync 127.0.0.1:8500/v1/kv/upstreams/test/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
upsync_lb least_conn; //hash_ketama;
include /usr/local/nginx/conf/servers/servers_test.conf;
}
upstream bar {
server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass test;
}
server {
listen 2345;
upstream_show
}
server {
listen 127.0.0.1:9091;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass bar;
}
}
NOTA: O comando include do upstream é necessário; na primeira vez, o arquivo despejado deve incluir todos os servidores.
Descrição
Este módulo fornece um método para descobrir servidores de backend. Suportando a adição ou exclusão dinâmica de servidores de backend através do consul/etcd e ajustando dinamicamente o peso dos servidores de backend, o módulo puxará rapidamente a nova lista de servidores de backend do consul/etcd para sincronizar o roteador IP do nginx. O Nginx não precisa ser recarregado. Possui algumas vantagens em relação a outros:
-
pontual
O módulo envia a chave para o consul/etcd com um índice, o consul/etcd comparará com seu índice; se o índice não mudar, a conexão ficará pendurada por cinco minutos; durante esse período, qualquer operação na chave-valor será retornada imediatamente.
-
desempenho
Puxar do consul/etcd equivale a uma solicitação ao nginx; atualizar o roteador IP do nginx não requer recarga, portanto, o impacto no desempenho do nginx é pequeno.
-
estabilidade
Mesmo que uma puxada falhe, ela puxará na próxima upsync_interval, garantindo que o servidor de backend forneça serviços de forma estável. E suporta despejar a configuração mais recente para o local, então mesmo que o consul/etcd fique fora do ar, o nginx pode ser recarregado a qualquer momento.
Diretivas
upsync
syntax: upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=segundos/minutos] [upsync_timeout=segundos/minutos] [strong_dependency=off/on]
contexto: upstream
descrição: Puxar servidores upstream do consul/etcd... .
Os significados dos parâmetros são:
-
upsync_interval
tempo de intervalo para puxar servidores do consul/etcd.
-
upsync_timeout
tempo limite da solicitação para puxar servidores do consul/etcd.
-
upsync_type
tipo de servidor para puxar do conf.
-
strong_dependency
quando o nginx é iniciado, se strong_dependency estiver ativado, isso significa que os servidores dependerão do consul/etcd e puxarão servidores do consul/etcd.
upsync_dump_path
syntax: upsync_dump_path $path
padrão: /tmp/servers_$host.conf
contexto: upstream
descrição: despejar os backends upstream para o $path.
upsync_lb
syntax: upsync_lb $load_balance
padrão: round_robin/ip_hash/hash modula
contexto: upstream
descrição: principalmente para least_conn e hash consistente; ao usar um deles, você deve indicar o uso de upsync_lb.
upsync_show
syntax: upsync_show
padrão: nenhum
contexto: server
descrição: mostrar todos os upstreams.
curl http://localhost:2345/upstream_show
mostrar todos os upstreams
Consul_interface
Os dados podem ser obtidos do armazenamento de chave/valor ou do catálogo de serviços. No primeiro caso, o parâmetro upsync_type da diretiva deve ser consul. Por exemplo
upsync 127.0.0.1:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
No segundo caso, deve ser consul_services.
upsync 127.0.0.1:8500/v1/catalog/service/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul_services strong_dependency=off;
Você pode adicionar ou excluir servidores de backend através do consul_ui ou http_interface. Abaixo estão exemplos para o armazenamento de chave/valor.
exemplo de http_interface:
- adicionar
padrão: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;
curl -X PUT http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
curl -X PUT -d "{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
ou
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
-
excluir
curl -X DELETE http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port -
ajustar-peso
curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port ou curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port -
marcar servidor-como-inativo
curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port ou curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":1}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port -
verificar
curl http://$consul_ip:$port/v1/kv/upstreams/$upstream_name?recurse
Etcd_interface
Você pode adicionar ou excluir servidores de backend através do http_interface.
Principalmente como etcd, exemplo de http_interface:
- adicionar
padrão: weight=1 max_fails=2 fail_timeout=10 down=0 backup=0;
curl -X PUT http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port
curl -X PUT -d value="{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port
-
excluir
curl -X DELETE http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name/$backend_ip:$backend_port -
ajustar-peso
curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port -
marcar servidor-como-inativo
curl -X PUT -d value="{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://$etcd_ip:$port/v2/keys/$dir1/$upstream_name/$backend_ip:$backend_port -
verificar
curl http://$etcd_ip:$port/v2/keys/upstreams/$upstream_name
Estilo de código
O estilo de código é baseado principalmente em style
veja também
- o nginx_upstream_check_module: https://github.com/alibaba/tengine/blob/master/src/http/ngx_http_upstream_check_module.c
- o patch do nginx_upstream_check_module: https://github.com/yaoweibin/nginx_upstream_check_module
- ou baseado em https://github.com/xiaokai-wang/nginx_upstream_check_module
dependência de fonte
- Cjson: https://github.com/kbranigan/cJSON
- http-parser: https://github.com/nodejs/http-parser
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub do nginx-module-stream-upsync.