美文网首页
haproxy调度

haproxy调度

作者: Liang_JC | 来源:发表于2020-06-06 11:17 被阅读0次

haproxy的调度算法

1、静态调度

  • 静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和相应速度等,且无法实时修改权重,只能重启后生效
    • static-rr:基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量没有限制
    • first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置

  • 动态算法:基于后端服务器 状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启

    • roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不等于lvs 的rr,支持慢启动即新加的服务器会逐渐增加转发数,每个后端backend中最多支持4095个server,此为默认调度算法, server 权重设置 weight
    • leastconn: 加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度,比较适合长连接的场景使用,比如MySQL等场景。

  • source:源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。

    consistent:一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动

    map-based:取模法,基于服务器权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因权重发生变化而导致调度结果整体改变, hash(o) mod n

  • uri

    基于对用户请求的uri做hash并将请求转发到后端指定服务器

  • url_param

    对用户请求的url中的<params>部分中的参数name作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server

  • hdr

    hdr(<name>):针对用户每个http头部(header)请求中的指定信息做hash, 此处由<name>指定的http首部将会被取出并做hash计算, 然后由服务器总权重相除以后派发至某挑出的服务器, 假如无有效的值,则会被轮询调度

  • rdp-cookie

    rdp-cookie对远程桌面的负载,使用cookie保持会话,用得不多

安装高版本haproxy

#二选一,国内非常慢,还是推荐源码编译
1、安装cenots提供的sclo_rh库
yum install https://cbs.centos.org/kojifiles/packages/centos-release-scl-rh/2/3.el7.centos/noarch/centos-release-scl-rh-2-3.el7.centos.noarch.rpm -y
yum clean all
yum install rh-haproxy18-haproxy -y
ln -s /opt/rh/rh-haproxy18/root/sbin/haproxy /usr/sbin
haproxy -v
HA-Proxy version 1.8.17 2019/01/08
Copyright 2000-2019 Willy Tarreau <willy@haproxy.org>

2、配置第三方yum仓库
vim /etc/yum.repos.d/ius.repo
[ius]
name=ius
baseurl=https://dl.iuscommunity.org/pub/ius/stable/CentOS/$releasever/$basearch/
gpgcheck=0
enabled=1
yum clean all
yum install haproxy18u -y
haproxy -v
HA-Proxy version 1.8.20 2019/04/25
Copyright 2000-2019 Willy Tarreau <willy@haproxy.org>
#自定义配置文件路径
vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network.target

[Service]
Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
EnvironmentFile=-/etc/sysconfig/haproxy
ExecStartPre=/usr/sbin/haproxy -f $CONFIG -f /etc/haproxy/conf.d -c -q
ExecStart=/usr/sbin/haproxy -Ws -f $CONFIG -f /etc/haproxy/conf.d -p $PIDFILE $OPTIONS
ExecReload=/usr/sbin/haproxy -f $CONFIG -c -q
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Type=notify

[Install]
WantedBy=multi-user.target

mkdir /etc/haproxy/conf.d
systemctl start haproxy

源码编译

1、安装依赖
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate

2、编译安装
tar xvf haproxy-1.8.20.tar.gz && cd haproxy-1.8.20
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cp haproxy /usr/sbin/

3、创建启动脚本
cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target

4、创建目录和用户
mkdir /etc/haproxy
useradd haproxy -s /sbin/nologin
mkdir /var/lib/haproxy
chown haproxy.haproxy /var/lib/haproxy/ -R
systemctl restart haproxy
#配置文件
cat /etc/haproxy/haproxy.cfg
global
maxconn 100000      
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
nbproc 4            
cpu-map 1 0 
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
pidfile /run/haproxy.pid
log 127.0.0.1 local3 info

defaults
option http-keep-alive
option  forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client  300000ms
timeout server  300000ms

listen stats
 mode http
 bind 0.0.0.0:9999
 stats enable
 log global
 stats uri     /haproxy-status
 stats auth    haadmin:q1w2e3r4ys

listen  web_port
 bind 0.0.0.0:80
 mode http
 log global
 server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5
 
#haproxy.cfg文件中定义了chroot、 pidfile、 user、 group等参数,如果系统没有相应的资源会导致haproxy无法启动,具体参考日志文件/var/log/messages

5、启动HAProxy
systemctl start haproxy

实现http模式下的客户端IP透传/后端服务器的状态监测机制等配置选项

#ha
vim /etc/haproxy/haproxy.cfg 
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    #开启多线程
    stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
    stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 1
    nbproc 2        #cpu核心数         
    cpu-map 1 0
    cpu-map 2 1 
    
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    option http-keep-alive
    option abortonclose
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

vim /etc/haproxy/conf.d/test.cfg
listen webs 
  bind 0.0.0.0:80
   balance roundrobin
  server web1 192.168.37.27:80 check inter 3000 fall 3 rise 5
  server web2 192.168.37.37:80 check inter 3000 fall 3 rise 5
  server web3 127.0.0.1:8080 check inter 3000 fall 3 rise 5 backup  #sorry服务器
  
systemctl start haproxy
yum install httpd -y
echo sorry > /var/www/html/index.html

#rs1
yum install httpd -y
echo rs1-17 > /var/www/html/index.html
systemctl start httpd

#rs2
yum install httpd -y
echo rs2-27 > /var/www/html/index.html
systemctl start httpd

#client
while :;do curl 192.168.37.7;sleep 0.5;done

基于cookie实现客户端会话保持

#ha
vim /etc/haproxy/conf.d/test.cfg 
listen webs
  balance roundrobin
  bind 0.0.0.0:80
  cookie SERVER-COOKIE insert indirect nocache
  server web1 192.168.37.27:80 cookie test1 check inter 3000 fall 3 rise 5
  server web2 192.168.37.37:80 cookie test2 check inter 3000 fall 3 rise 5 
  server web3 127.0.0.1:8080 check inter 3000 fall 3 rise 5 backup
systemctl restart haproxy

#client
curl --cookie "SERVER-COOKIE=test1" 192.168.37.7

四层负载和七层代理的区别

四层负载设备中,把client发送的报文,根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据。
七层负载均衡服务器起了一个代理服务器的作用,服务器建立一次TCP连接要三次握手,而client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用。

基于haproxy ACL实现域名匹配,把不同的域名请求调度到不同的后端服务器

#ha
vim /etc/haproxy/haproxy.cfg
default
  errorfile 503 /var/www/html/503.html
  
vim /etc/haproxy/conf.d/test.cfg 
listen webs
  balance roundrobin
  bind 0.0.0.0:80
  acl web_net hdr_dom(host) -i www.magedu.net
  acl web_org hdr_dom(host) -i www.magedu.org
  use_backend net if web_net
  use_backend org if web_org
  default_backend def

backend net
  server web1 192.168.37.27:80 check inter 3000 fall 3 rise 5

backend org
  server web1 192.168.37.37:80 check inter 3000 fall 3 rise 5

backend def 
  server web1 127.0.0.1:8080 check inter 3000 fall 3 rise 5 backup

echo "It down" > /var/www/html/503.html
systemctl restart haproxy

#client
echo "192.168.37.7 www.magedu.net www.magedu.org www.magedu.xyz" >> /etc/hosts
curl www.magedu.net
curl www.magedu.org
curl www.magedu.xyz

基于HAProxy实现匹配请求URI文件后缀做动静分离

#ha
vim /etc/haproxy/conf.d/test.cfg 
listen webs
  balance roundrobin
  bind :80
  acl php_server path_end -i .php
  acl image_server path_end -i .jpg .png .gif
  use_backend php if php_server
  use_backend image if image_server
  default_backend def

backend php
  server web1 192.168.37.27:80 check inter 3000 fall 3 rise 5

backend image
  server web1 192.168.37.37:80 check inter 3000 fall 3 rise 5

backend def
  server web1 127.0.0.1:8080 check inter 3000 fall 3 rise 5 backup
systemctl restart haproxy

#rs1
yum install php-fpm -y
vim /etc/httpd/conf.d/fcgi.conf
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
vim /var/www/html/info.php
<?php
phpinfo();
?>
systemctl restart httpd php-fpm

#rs2
cp /usr/share/pixmaps/faces/sky.jpg /var/www/html

#client
curl -I www.magedu.net/info.php
curl -I www.magedu.net/sky.jpg

实现https

cd /etc/pki/tls/certs/
vim Makefile
#/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
/usr/bin/openssl genrsa $(KEYLEN) > $@
make magedu.net.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:magedu.net
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:www.magedu.net
Email Address []:
cat magedu.net.key magedu.net.crt > magedu.net.pem
cp magedu.net.pem /var/lib/haproxy/
vim /etc/haproxy/conf.d/test.cfg
listen web_80
  balance roundrobin
  bind 192.168.37.7:80
  redirect scheme https if !{ ssl_fc }
  server web1 192.168.37.27:80 check inter 2000 fall 3 rise 5

listen web_443
  balance roundrobin
  bind 192.168.37.7:443 ssl crt /var/lib/haproxy/magedu.net.pem 
  http-request set-header X-Forwarded-Port %[dst_port]
  http-request add-header X-Forwared-Proto https if { ssl_fc }
  server web1 192.168.37.27:80 check inter 2000 fall 3 rise 5
  server web2 192.168.37.37:80 check inter 2000 fall 3 rise 5
  
systemctl restart haproxy 

#client
curl -I www.magedu.net
curl -kL www.magedu.net

HAProxy基于socker文件多进程情况下服务器自动上下线

vim /etc/haproxy/conf.d/test.cfg
listen web_80
  balance roundrobin
  bind 192.168.37.7:80
  server web1 192.168.37.27:80 check inter 2000 fall 3 rise 5
  server web2 192.168.37.37:80 check inter 2000 fall 3 rise 5

listen web_443
  balance roundrobin
  bind 192.168.37.7:443 ssl crt /var/lib/haproxy/magedu.net.pem
  http-request set-header X-Forwarded-Port %[dst_port]
  http-request add-header X-Forwared-Proto https if { ssl_fc }  
  server web1 192.168.37.27:80 check inter 2000 fall 3 rise 5
  server web2 192.168.37.37:80 check inter 2000 fall 3 rise 5

listen stats            
  bind :9999
  balance roundrobin
  stats enable          #开启状态页
  stats uri /status
  stats auth haadmin:123456     #状态页用户密码
  
yum install socat -y
vim /etc/haproxy/haproxy.cfg
    #开启多线程模式
    stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
    nbproc 1 
    cpu-map 1 0
systemctl restart haproxy

echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock1
echo "get weight web_80/web1" | socat stdio /var/lib/haproxy/haproxy.sock1      #查看权重
echo "disable server web_80/web1" | socat stdio /var/lib/haproxy/haproxy.sock1  #下线服务器
echo "enable server web_80/web1" | socat stdio /var/lib/haproxy/haproxy.sock1   #上线服务器

http://192.168.37.7:9999/status     #状态页查看变化

相关文章

网友评论

      本文标题:haproxy调度

      本文链接:https://www.haomeiwen.com/subject/kmzdahtx.html