Teoría + Experimento: cómo usar Haproxy para construir un clúster web

1. Descripción general de haproxy

Haproxy es actualmente una herramienta de programación de clústeres popular

1.1 Comparación de Haproxy con LVS y Nginx

  • LVS tiene el mejor rendimiento, pero es relativamente complicado de construir
  • El módulo ascendente de Nginx admite la función de clúster, pero la función de verificación de estado de los nodos del clúster no es sólida y el rendimiento no es tan bueno como el de Haproxy.

1.2 Programador de clústeres web común

  • El programador de clúster web común actual se divide en software y hardware
  • El software suele utilizar LVS, Haproxy, Nginx de código abierto
  • El hardware más utilizado es F5 y muchas personas utilizan algunos productos domésticos, como Barracuda, NSFOCUS, etc.

1.3 Análisis de la aplicación de haproxy

Aunque LVS tiene una gran capacidad anti-carga en aplicaciones empresariales, tiene deficiencias

  • LVS no admite el procesamiento regular y no puede lograr una separación dinámica y estática
  • Para sitios web grandes, la implementación y configuración de LVS son complicadas y el costo de mantenimiento es relativamente alto

Haproxy es un software que proporciona alta disponibilidad, equilibrio de carga y proxy basado en aplicaciones TCP y HTTP.

  • Especialmente adecuado para sitios web con mucha carga
  • La ejecución en hardware actual puede admitir decenas de miles de solicitudes de conexión simultáneas

Dos, algoritmo de programación Haproxy

Haproxy admite una variedad de algoritmos de programación, los más comúnmente utilizados son tres: RR (Round Robin), LC (Least Connections), SH (Source Hashing)

2.1 RR (Ronda Riobin)

  • El algoritmo RR es el algoritmo más simple y más comúnmente utilizado, a saber, la programación por turnos.
  • Ejemplo de comprensión
    ◆ Hay tres nodos A, B, C
    ◆ El primer acceso de usuario se asignará al nodo A
    ◆ El segundo acceso de usuario se asignará al nodo B
    ◆ El tercer acceso de usuario se asignará al nodo C
    ◆ Cuarto Se continúa asignando un acceso de usuario al nodo A, sondeo para asignar solicitudes de acceso para lograr el equilibrio de carga

2.2 LC (Conexiones mínimas)

  • El algoritmo LC es el algoritmo de conexión mínima, que asigna dinámicamente las solicitudes de front-end de acuerdo con el número de conexiones de nodo back-end
  • Ejemplo de comprensión
    ◆ Hay tres nodos A, B, C, y el número de conexiones de cada nodo es A: 4, B: 5, C: 6.
    ◆ La primera solicitud de conexión de usuario se asignará a A y el número de conexiones se convertirá en A : 5, B: 5, C: 6
    ◆ La segunda solicitud de usuario continuará asignándose a A, y el número de conexiones pasa a ser A6, B: 5, C: 6; se asignará una nueva solicitud a B cada vez La nueva solicitud se asigna al cliente con el menor número de conexiones
    ◆ Debido a que el número de conexiones de A, B y C se liberará dinámicamente en situaciones reales, es difícil tener el mismo número de conexiones
    ◆ Este algoritmo ha mejorado mucho en comparación con el algoritmo rr. Un algoritmo que actualmente se usa más

2.3 SH (Hash de fuente)

  • SH se basa en el algoritmo de programación de acceso a la fuente. Este algoritmo se utiliza en algunos escenarios donde las sesiones de sesión se registran en el lado del servidor. La programación del clúster se puede realizar en función de la IP de origen, la cookie, etc.
  • Ejemplo de comprensión
    ◆ Hay tres nodos A, B y C. El primer usuario se asigna a A para la primera visita, y el segundo usuario se asigna a B para la primera visita
    ◆ Cuando el primer usuario visita por segunda vez, continuará. Asignado a A, el segundo usuario seguirá siendo asignado a B para la segunda visita. Siempre que el programador de equilibrio de carga no se reinicie, el acceso del primer usuario se asignará a A y el acceso del segundo usuario se asignará a B. Realice la programación del clúster
    ◆ La ventaja de este algoritmo de programación es lograr la retención de la sesión, pero cuando algunos accesos IP son muy grandes, causará un desequilibrio de carga y algunos nodos tienen un acceso excesivo, lo que afecta el uso comercial

Tres, experimento

3.1 Preparación del experimento

Anfitrión sistema operativo dirección IP Software principal
Servidor haproxy CentoS7.6 192.168.100.21 haproxy-1.5.19.tar.gz
Servidor Nginx 1 CentoS7.6 192.168.100.22 Nginx-1.12.2.tar.gz
Servidor Nginx 2 CentoS7.6 192.168.100.23 Nginx-1.12.2.tar.gz
Servidor de almacenamiento CentoS7.6 192.168.100.24 nfs-utils rpcbind

3.2 Paso

3.2.1 Servidor de almacenamiento de depuración (192.168.100.24)

'rpm -q nfs-utils          ###如果没装,yum -y install nfs-utils
 rpm -q rpcbind            ###如果没装,yum -y install rpcbind'
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# vi /etc/exports
/opt/51xit 192.168.100.0/24 (rw,sync)
/opt/52xit 192.168.100.0/24 (rw,sync)
[root@localhost ~]# systemctl restart nfs
[root@localhost ~]# systemctl restart rpcbind
[root@localhost ~]# systemctl enable nfs
[root@localhost ~]# systemctl enable rpcbind
[root@localhost ~]# mkdir /opt/51xit /opt/52xit
[root@localhost ~]# echo "this is www.51xit.com" >/opt/51xit/index.html
[root@localhost ~]# echo "this is www.52xit.com" >/opt/52xit/index.html

3.2.2 Compile e instale el servidor Nginx 1 (192.168.100.22)

[root@localhost ~]#yum -y install pcre-devel zlib-devel gcc-c++
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# cd /opt
[root@localhost opt]# ll
total 960
-rw-r--r-- 1 root root 981687 Sep 24 15:58 nginx-1.12.2.tar.gz
[root@localhost ~]# tar zxvf nginx-1.12.2.tar.gz
[root@localhost ~]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# 
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx
[root@localhost nginx-1.12.2]# make
[root@localhost nginx-1.12.2]# make install
[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.12.2]# ls -l /usr/local/sbin/nginx
lrwxrwxrwx 1 root root 27 5 月 16 16:50 /usr/local/sbin/nginx -> /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.12.2]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

'■启动、 停止 Nginx
killall -1 nginx                                                     ####安全重启
killall -3 nginx                                                     ###停止服务
如果出现: -bash: killall: command not found'
[root@localhost nginx-1.12.2]# yum -y install psmisc
[root@localhost nginx-1.12.2]# nginx                                ####启动
[root@localhost nginx-1.12.2]# yum -y install net-tools
[root@localhost nginx-1.12.2]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      20107/nginx: master
'###添加 Nginx 系统服务###'
[root@localhost nginx-1.12.2]# vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx                                                 ####描述
After=network.target                                              ####描述服务类别
[Service]
Type=forking                                                      ####后台运行形式
PIDFile=/usr/local/nginx/logs/nginx.pid                           ####PID 文件位置
ExecStart=/usr/local/nginx/sbin/nginx                             ####启动服务
ExecReload=/usr/bin/kill -s HUP $MAINPID                         ####根据 PID 重载配置
ExecStop=/usr/bin/kill -s QUIT $MAINPID                          ####根据 PID 终止进程
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@localhost nginx-1.12.2]# chmod 754 /lib/systemd/system/nginx.service
[root@localhost nginx-1.12.2]# systemctl status nginx
● nginx.service - nginx
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@localhost nginx-1.12.2]# systemctl start nginx.service
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
[root@localhost nginx-1.12.2]# killall -3 nginx
[root@localhost nginx-1.12.2]# systemctl start nginx.service
[root@localhost nginx-1.12.2]# systemctl status nginx.service
● nginx.service - nginx
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-09-24 17:08:01 CST; 6s ago
  Process: 77233 ExecStart=/usr/local/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
 Main PID: 77234 (nginx)
    Tasks: 2
   CGroup: /system.slice/nginx.service
           ├─77234 nginx: master process /usr/local/nginx/sbin/nginx
           └─77235 nginx: worker process

Sep 24 17:08:01 localhost.localdomain systemd[1]: Starting nginx...
Sep 24 17:08:01 localhost.localdomain systemd[1]: PID file /usr/local/nginx/l...
Sep 24 17:08:01 localhost.localdomain systemd[1]: Started nginx.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost nginx-1.12.2]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service
'####刷下命令,服务正常工作了###
killall -3 nginx                                          ###停止服务
systemctl start nginx.service
###上面命令一刷,下面就可以正常使用了###
systemctl start nginx.service
systemctl stop nginx.service
systemctl reload nginx.service
systemctl restart nginx.service
systemctl status nginx.service'
###安装httpd 挂载测试页###
[root@localhost nginx-1.12.2]# yum -y install nfs-utils
[root@localhost nginx-1.12.2]# systemctl start nfs
[root@localhost nginx-1.12.2]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@localhost nginx-1.12.2]# showmount -e 192.168.100.24
Export list for 192.168.100.24:
/opt/52xit 192.168.100.0/24
/opt/51xit 192.168.100.0/24
[root@localhost nginx-1.12.2]# mount 192.168.100.24:/opt/51xit /usr/local/nginx/html/                         ###临时挂载
[root@localhost nginx-1.12.2]# vi /etc/fstab                ###永久挂载,需要重启
192.168.100.24:/opt/51xit/ /usr/local/nginx/html/ nfs defaults,_netdev 0 0
[root@localhost nginx-1.12.2]# init 6

Inicio de sesión en la página web: verificación 192.168.100.22
Inserte la descripción de la imagen aquí

3.2.3 Compile e instale el servidor Nginx 2 (192.168.100.23)

La operación es la misma que 3.2.2 , simplemente cambie 51xit a 52xit , puede consultar 3.2.2

Inicio de sesión en la página web: verificación 192.168.100.23
Inserte la descripción de la imagen aquí

3.2.4 Configurar el servidor Haproxy (192.168.100.21)

[root@localhost ~]# yum -y install pcre-devel bzip2-devel gcc gcc-c++
[root@localhost ~]# cd /opt
[root@localhost opt]# tar xzvf haproxy-1.4.24.tar.gz 
[root@localhost opt]# cd haproxy-1.4.24/
[root@localhost haproxy-1.4.24]# make TARGET=linux26
[root@localhost haproxy-1.4.24]# make install
[root@localhost haproxy-1.4.24]# mkdir /etc/haproxy
[root@localhost haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/
[root@localhost haproxy-1.4.24]# vi /etc/haproxy/haproxy.cfg
global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy
        uid 99
        gid 99
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        #redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen  webcluster 0.0.0.0:80
        option httpchk GET /index.html
        balance roundrobin
        server inst1 192.168.100.22:80 check inter 2000 fall 3
        server inst2 192.168.100.23:80 check inter 2000 fall 3
'###上述配置文件解释###
1、Haproxy配置文件通常分为三个部分
global:为全局配置
defaults:为默认配置
listen:为应用组件配置
global配置参数
log 127.0.0.1 local0:配置日志记录,配置日志记录,local0为日志设备,默认存放到系统日志
log 127.0.0.1 local1 notice:notice为日志级别,通常有24个级别
maxconn 4096:最大连接数
uid 99:用户uid          gid 99:用户gid

2、defaults配置项配置默认参数,一般会被应用组件继承,如果在应用组件中没有特别声明,将安装默认配置参数设置
log global:定义日志为global配置中的日志定义
mode http:模式为http
option httplog:采用http日志格式记录日志
option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包
retries 3:检查节点服务器失败连续达到三次则认为节点不可用
maxconn 2000:最大连接数
contimeout 5000:连接超时时间
clitimeout 50000:客户端超时时间
srvtimeout 50000:服务器超时时间

3、listen配置项目一般为配置应用模块参数
listen  appli4-backup 0.0.0.0:10004:定义一个appli4-backup的应用
option  httpchk /index.html:检查服务器的index.html文件
option  persist :强制将请求发送到已经down掉的服务器
balance roundrobin:负载均衡调度算法使用轮询算法
server  inst1 192.168.114.56:80 check inter 2000 fall 3:定义在线节点
server  inst2 192.168.114.56:81 check inter 2000 fall 3 backup:定义备份节点'
[root@localhost haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy
[root@localhost haproxy-1.4.24]# chmod 755 /etc/init.d/haproxy
[root@localhost haproxy-1.4.24]# chkconfig --add haproxy
[root@localhost haproxy-1.4.24]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@localhost haproxy-1.4.24]# service haproxy start
[root@localhost haproxy-1.4.24]# systemctl stop haproxy.service 
[root@localhost haproxy-1.4.24]# systemctl start haproxy.service

Inicio de sesión en la página web: interruptor de verificación 192.168.100.21
, encontrará diferentes páginas del sitio web, lo que indica que se ha logrado el equilibrio de carga
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Cuatro, archivo de registro de Haproxy

[root@localhost haproxy-1.4.24]# mkdir -p var/log/haproxy                 ###创建日志文件存放点
[root@localhost haproxy-1.4.24]# vi /etc/haproxy/haproxy.cfg
global                        ###下面log开头的 统统去掉换下面的配置
        log /dev/log    local0 info
        log /dev/log    local1 notice
[root@localhost haproxy-1.4.24]# systemctl restart haproxy.service
[root@localhost haproxy-1.4.24]# touch /etc/rsyslog.d/haproxy.conf
[root@localhost haproxy-1.4.24]# vi /etc/rsyslog.d/haproxy.conf 
if ($programname == 'haproxy' and $syslogseverity-text == 'info') then -/var/log/haproxy/haproxy-info.log
& ~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log
& ~
[root@localhost haproxy-1.4.24]#  systemctl restart rsyslog.service 
[root@localhost haproxy]# tail -f /var/log/haproxy/haproxy-info.log
Sep 24 17:23:14 localhost haproxy[65722]: 192.168.100.2:62258 [24/Sep/2020:17:22:21.206] webcluster webcluster/inst1 0/0/0/1/52926 200 1700 - - cD-- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
Sep 24 17:23:54 localhost haproxy[65722]: 192.168.100.2:62275 [24/Sep/2020:17:23:41.993] webcluster webcluster/inst2 0/0/0/0/12236 200 258 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
Sep 24 17:24:53 localhost haproxy[65722]: 192.168.100.2:62293 [24/Sep/2020:17:24:03.530] webcluster webcluster/inst1 0/0/0/1/50041 200 984 - - cD-- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
[root@localhost haproxy-1.4.24]# cd /var/log/haproxy
[root@localhost haproxy]# ll
total 4
-rw------- 1 root root 538 Sep 24 17:24 haproxy-info.log

Inicio de sesión en la página web: 192.168.32.21
y luego verifique la generación continua de archivos de registro

Cinco, optimización de parámetros de Haproxy

A medida que aumenta la carga en el sitio web corporativo, la optimización de los parámetros haproxy es muy importante:

  • maxconn: Número máximo de conexiones, ajustado según la situación real de la aplicación, se recomienda 10240
  • daemon: modo de proceso daemon, Haproxy se puede iniciar en modo de proceso no daemon, se recomienda utilizar el modo de proceso daemon para iniciar
  • nbproc: la cantidad de procesos concurrentes para el equilibrio de carga. Se recomienda que sea igual o 2 veces la cantidad de núcleos de CPU del servidor actual
  • reintentos: la cantidad de reintentos, que se utiliza principalmente para verificar los nodos del clúster. Si hay muchos nodos y la cantidad de simultaneidad es grande, configúrelo en 2 o 3 veces
  • opción http-server-close: cierre de forma activa la opción de solicitud http, se recomienda utilizar esta opción en un entorno de producción
  • timeout http-keep-alive: tiempo de espera de conexión largo, establezca el tiempo de espera de conexión largo, que se puede establecer en 10 s
  • timeout http-request: tiempo de espera de la solicitud http, se recomienda establecer este tiempo en 5 ~ 10s para aumentar la velocidad de liberación de la conexión http
  • timeout client: tiempo de espera del cliente. Si el tráfico es demasiado grande y la respuesta del nodo es lenta, puede establecer este tiempo más corto, y se recomienda establecerlo en aproximadamente 1 minuto.

Supongo que te gusta

Origin blog.csdn.net/ZG_66/article/details/108776473
Recomendado
Clasificación