haproxy调度

2020-06-06  本文已影响0人  Liang_JC

haproxy的调度算法

1、静态调度

安装高版本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     #状态页查看变化
上一篇 下一篇

猜你喜欢

热点阅读