Serie Nginx: use el módulo upsync para lograr el equilibrio de carga

Inserte la descripción de la imagen aquí

1. El problema de la recarga de nginx

Descripción del problema

La recarga de Nginx tiene una cierta pérdida. Si está utilizando una conexión larga, al recargar nginx, todos los procesos de trabajo que estén conectados durante mucho tiempo saldrán sin problemas, y cuando se liberen todas las conexiones en el proceso de trabajo, el proceso realmente se cierra. .

Solución

Actualmente hay tres opciones para la versión comunitaria de nginx:

El módulo Dyups de Tengine.
Upsync + Consul of Weibo realiza el equilibrio dinámico de carga.
Balancer_by_lua de OpenResty (Paiyun usa su slardar de código abierto (Consul balancer_by_lua)).
Este artículo utiliza el módulo upsync para resolver el problema de degradación del rendimiento causado por el proceso de recarga nginx después de que se modifica el archivo de configuración.

Su función es extraer la lista de servidores back-end del cónsul y actualizar la información de enrutamiento de Nginx. Este módulo no depende de ningún módulo de terceros. Como la base de datos de Nginx, el cónsul utiliza el servicio de cónsul de KV.Cada proceso de trabajo de Nginx extrae de forma independiente la configuración de cada upstream y actualiza su propia ruta.

Dos, combate real

2.1 Parche nginx

No es necesario que realice este paso. Si no lo hace, elimine este módulo al compilar

git clone https://github.com/xiaokai-wang/nginx_upstream_check_module
## 打补丁包
patch -p0 < /usr/local/src/nginx_upstream_check_module-master/check_1.9.2+.patch

Descargar el código fuente del módulo nginx-upsync

git clone https://github.com/weibocom/nginx-upsync-module.git
下载nginx源码
wget 'http://nginx.org/download/nginx-1.10.1.tar.gz'
tar -xzvf nginx-1.10.1.tar.gz
cd nginx-1.10.1/
开始编译
./configure --prefix=/data/app/nginx-1.10.1 --user=nginx --group=nginx  --with-http_ssl_module  --with-http_stub_status_module   --add-module=/usr/local/src/nginx-upsync-module-master/ --add-module=/usr/local/src/nginx_upstream_check_module-master/
make
make install

Tres, empieza cónsul

wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip
unzip consul_0.6.4_linux_amd64.zip
./consul agent -advertise=x.x.x.x -client=0.0.0.0 -dev

Crear archivo de configuración nginx

mkdir -p /usr/local/nginx/conf/servers
/usr/local/nginx/conf/nginx.conf
events {
    
    
 worker_connections  4096;  ## Default: 1024
}
 
http {
    
    
 upstream test {
    
    
 # fake server otherwise ngx_http_upstream will report error when startup
 server 127.0.0.1:11111;
 
 # all backend server will pull from consul when startup and will delete fake server
 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;
 }
 
 upstream bar {
    
    
 server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
 }
 
 server {
    
    
 listen 8080;
 
 location = /proxy_test {
    
    
 proxy_pass http://test;
 }
 
 location = /bar {
    
    
 proxy_pass http://bar;
 }
 
 location = /upstream_show {
    
    
 upstream_show;
 }
 
 }
}

Cuatro, prueba

for i in `seq 3`;do mkdir html$i/test -p && echo $i >html$i/test/test.html; done; 
 
docker run -d -p 8001:80 -v /root/html1/:/usr/share/nginx/html nginx
docker run -d -p 8002:80 -v /root/html2/:/usr/share/nginx/html nginx
docker run -d -p 8003:80 -v /root/html3/:/usr/share/nginx/html nginx

Cinco, agregue servicios

curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/test/192.168.56.12:8001
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/test/192.168.56.12:8002
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/test/192.168.56.12:8003

Compruebe si hay contenido en el archivo conf / servers / servers_test.conf

cat conf/servers/servers_test.conf
server 192.168.56.12:8003 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.56.12:8002 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.56.12:8001 weight=1 max_fails=2 fail_timeout=10s;

O abra el navegador http://192.168.56.11:8080/upstream_show?test

El contenido de la pantalla es el siguiente:

Upstream name: test; Backend server count: 3
 server 192.168.56.12:8003 weight=1 max_fails=2 fail_timeout=10s;
 server 192.168.56.12:8002 weight=1 max_fails=2 fail_timeout=10s;
 server 192.168.56.12:8001 weight=1 max_fails=2 fail_timeout=10s;

para resumir

Este módulo solo modifica la información de la caché en sentido ascendente y no puede modificar ni agregar otras configuraciones

Problemas encontrados en la prueba

Al agregar servicios, se produjo el siguiente error, que provocó que la adición del servicio no se realizara en tiempo real, y tardó aproximadamente 3 minutos.

registro de cónsul:

2016/03/22 05:34:42 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (149.023µs) from=127.0.0.1:38853
 2016/03/22 05:34:43 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (146.759µs) from=127.0.0.1:38854
 2016/03/22 05:34:45 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (149.853µs) from=127.0.0.1:38855
 2016/03/22 05:34:46 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (111.46µs) from=127.0.0.1:38856
 2016/03/22 05:34:48 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (142.696µs) from=127.0.0.1:38857
 2016/03/22 05:34:48 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (112.089µs) from=127.0.0.1:38858
 2016/03/22 05:34:49 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (114.29µs) from=127.0.0.1:38859
 2016/03/22 05:34:50 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (148.245µs) from=127.0.0.1:38860

registro de nginx

2016/03/22 05:35:09 [error] 18879#0: recv() failed (104: Connection reset by peer)
2016/03/22 05:35:09 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
2016/03/22 05:35:10 [error] 18879#0: recv() failed (104: Connection reset by peer)
2016/03/22 05:35:10 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
2016/03/22 05:35:11 [error] 18879#0: recv() failed (104: Connection reset by peer)
2016/03/22 05:35:11 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
2016/03/22 05:35:13 [error] 18879#0: recv() failed (104: Connection reset by peer)
2016/03/22 05:35:13 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
2016/03/22 05:35:13 [error] 18879#0: recv() failed (104: Connection reset by peer)
2016/03/22 05:35:13 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
2016/03/22 05:35:14 [error] 18879#0: recv() failed (104: Connection reset by peer)

Fenómeno problema

Al agregar un servicio, se produce este problema y el nuevo servicio no se puede agregar a la carga a tiempo y no afecta al servicio normal. En este momento, cuando continúa agregando un servicio al cónsul, este error puede terminar y los dos registros de servicios actuales pueden agregarse con éxito.

Seis, documentación de ayuda

La dirección oficial de github
nginx_upstream_check_module https: //www.cnblogs.com/Carpe ...

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/liuxingjiaoyu/article/details/112763969
Recomendado
Clasificación