【haproxy】负载均衡群集~

2,050 阅读8分钟

1、haproxy 简介

haproxy软件 是一个专门做代理的软件。

负载均衡的实现:

1、软件:

  • 四层:

    • LVS:Linux Virtual Server
    • Nginx
    • HAProxy:High Availability Proxy
  • 七层:

    • HAProxy:七层软件,也可以读懂四层,所以既是七层,也是四层。
    • Nginx:既是七层,也是四层

2、硬件:

2、调度算法简介

  • 动态算法:基于后端服务器状态进行调度。直接动态的调整算法 ,直接生效,不需要重启restart,只需要reload就可以

  • 静态算法:调整算法后,必须要重启软件,才能生效。

  • 其他算法:可以进行动静切换,主要依靠参数进行切换。

     balance source      //根据下面的参数,确定是动态还是静态
     hash-type map-based    //此为动态
    

haproxy支持多种调度算法,最常用的是前3种:

  1. 动态轮询 RR,Round Robin,也是默认的调度算法。
  2. 静态轮询 static-rr,也可以添加权重 weight
  3. 最小连接算法 LC,表示最少连接者先处理 leastconn
  4. source,表示根据请求源IP
  5. uri,表示根据请求的URI,做cdn需使用
  6. url param,表示根据请求的URl参数' balance url param’requires an URL parameter name
  7. hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求
  8. randaom 基于hash结果的随机数, 来调度,权重越大越容易被调度

调度算法的对比:

nginxhaproxylvs
rr(轮询)rrrr
加权轮询static-rrwrr 加权
ip hash最小连接源地址 hash SH
url hashsource 根据源地址目的地址 hash DH
cookie hash根据请求来调度默认 wlc 加权最小连接
fair根据cookie 来调度lc 最小连接
最小连接根据请求头SED初始连接高权重优先
NQ 每个人都有一个链接后 再使用 初始链接高权重
  1. lvs 是 内核中的功能, nginx haproxy 是第三方实现的功能
  2. lvs 只能提供四层负载均衡无法提供7层负载(无法控制 7层协议 http 头部 url 等)功能单一
  3. nginx, haproxy 可以实现 4层和7层负载, 功能较多, 但是 性能不如lvs , lvs> haproxy > nginx
  4. hproxy 对比 nginx 性能优越, 功能又单一了,haprox只做反向代理。
  5. lvs 没有 后端服务器健康性检测, nginx和haproxy 有后端服务器健康性检测

4层 性能好 功能少 只能控制 四层协议 端口 ip

7层 性能弱 功能多 可以控制 7层协议 http

3、LVS、Nginx和haproxy 的区别:

  1. LVS基于Linux操作系统实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
  2. LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
  3. LVS因为工作在TCP模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URI等多种状态检测方式;
  4. HAProxy功能强大,但整体性能低于4层模式的IVS负载均衡。
  5. Nginx主要用于web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好。

4、安装软件

注意:安装haproxy前,必须要装lua软件。

版本:如果要安装2.0及以上版本的haproxy,那么lua版本必须要大于5.3

4.1 yum 安装

 [root@7-1 ~]#  yum install haproxy -y
 [root@7-1 ~]#  haproxy -v    //验证haproxy版本
 HA-Proxy version 1.5.18 2016/05/10    //yum安装的版本比较老

4.2 rpm包(第三方)

官方没有提供rpm相关的包,可以通过第三方仓库的rpm包

从第三方网站下载rpm包:pkgs.org/download/ha…

但是要注意甄别,下载的数据包有没有什么问题!

4.3 编译安装

4.3.1 解决lua环境

 lua官网:
 https://www.lua.org
 [root@7-1 ~]# lua -v    //查看当前系统版本
 Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
 [root@7-5 ~]#  cd /data
 *****加载lua-5.4.4.tar.gz安装包*****
 [root@7-5 data]#  tar zxf lua-5.4.4.tar.gz
 [root@7-5 data]#  cd lua-5.4.4/
 [root@7-5 lua-5.4.4]#  ls
 doc  Makefile  README  src
 [root@7-5 lua-5.4.4]#  make all test
 [root@7-5 lua-5.4.4]#  cd ..
 [root@7-5 data]#  ls
 haproxy-2.4.25.tar.gz  lua-5.4.4  lua-5.4.4.tar.gz
 [root@7-5 data]#  ln -s lua-5.4.4 lua    //软链接
 [root@7-5 data]#  ls
 haproxy-2.4.25.tar.gz  lua  lua-5.4.4  lua-5.4.4.tar.gz
 [root@7-5 data]#  cd lua
 [root@7-5 lua]#  cd src
 ​
 `注意区分版本问题:`
 [root@7-5 src]#  ./lua -v
 Lua 5.4.4  Copyright (C) 1994-2022 Lua.org, PUC-Rio    //当前目录下的lua,也就是上面编译安装的lua版本
 [root@7-5 src]#  lua -v
 Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio    //系统默认自带的版本

4.3.2 编译安装 haproxy⭐⭐

更多源码包下载地址:www.haproxy.org/#down

 [root@7-5 src]#  cd /data
 [root@7-5 data]#  yum -y install gcc openssl-devel pcre-devel systemd-devel     //安装依赖环境
 [root@7-5 data]#  tar xf haproxy-2.4.25.tar.gz 
 [root@7-5 data]#  cd haproxy-2.4.25/
 ​
 *****查看安装方法*****
 [root@7-5 haproxy-2.4.25]# ll Makefile 
 -rw-rw-r-- 1 root root 40812 Feb 12 23:18 Makefile
 [root@7-5 haproxy-2.4.25]# cat README 
 [root@7-5 haproxy-2.4.25]# cat INSTALL
 **********
 ​
 mkdir /usr/local/lua
 cp -r src/   /usr/local/lua/
 ​
 *****功能插件模块*****
 make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/data/lua/src/  LUA_LIB=/data/lua/src/     //最后一个参数,要指明安装的Lua软件位置
 ​
 *****小拓展:二进制包就是可执行程序,make就是将源代码编译成二进制文件。
 ​
 make install PREFIX=/apps/haproxy
 ​
 ln -s /apps/haproxy/sbin/haproxy /usr/sbin/   //做软链接,为什么做软链接,就是为了自动补全功能
 ​
 haproxy  -v
 haproxy  -h   查看帮助
 ​
 *****生成.service文件(直接复制粘贴)*****
 tee /usr/lib/systemd/system/haproxy.service  <<eof
 ​
 [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 /var/lib/haproxy/haproxy.pid
 ExecReload=/bin/kill -USR2 $MAINPID
 LimitNOFILE=100000
 ​
 [Install]
 WantedBy=multi-user.target
 ​
 eof
 [root@7-5 ~]# vim /usr/lib/systemd/system/haproxy.service     //可以查看一下是否为上面的三部分
 ​
 *****建立配置文件*****
 mkdir /etc/haproxy
 vim /etc/haproxy/haproxy.cfg   //注意:以cfg结尾
 ​
 *****下面都是配置文件,直接复制即可,不存在格式问题*****
 global
 maxconn 100000
 chroot /apps/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 /var/lib/haproxy/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:123456
 ​
 listen  web_port
  bind 0.0.0.0:8899
  mode http
  log global
  server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5
 *****上述都是配置文件,直接复制即可,不存在格式问题*****
 ​
 systemctl start haproxy
 ​
 mkdir  /var/lib/haproxy    //pid 文件路径
 ​
 ​
 #设置用户和目录权限
 [root@centos7 ~]# useradd -r -s /sbin/nologin  haproxy
 [root@centos7 ~]# systemctl enable --now haproxy

套接字.sock文件的作用:同一台机器里的两个软件进行交互,数据不用封装、解封装,可以直接通过套接字交流。

5、配置文件

5.1 主配置文件

配置文件位置:/etc/haproxy/haproxy.cfg

配置文件由两大部分组成:

  1. global 全局配置
 进程及安全配置相关的参数
 性能调整相关参数
 Debug参数
  1. proxy 代理段配置(反向代理)
  • defaults:类似于代理的全局配置。为frontend,、backend,、listen提供默认配置
  • frontend:前端,也就是代理服务器。 定义虚拟机、监听、分配请求,相当于nginx中的server { }
  • backend:后端,后台真实服务器。 相当于nginx中的upstream { }
  • listen:等于前端加后端(frontend+backend),同时拥有前端和后端配置,虽然比较死板,不灵活,但是配置简单,生产环境中,推荐使用。

image.png

5.2 特殊配置:状态页

 listen stats   //状态页
  mode http     //支持七层。四层的话,只能写tcp,不支持udp
  bind 192.168.125.100:9999    //监听的IP和端口号
  stats enable
  log global
  stats uri     /haproxy-status     //路径为192.168.125.100:80/haproxy-status
  stats auth    haadmin:123456      //状态页的用户名和密码
  
 listen  cxk            //代理的名字,可以自定义cxk
  bind 0.0.0.0:8899    //监听的地址和端口
  mode http            //代理类型,七层http、四层tcp
  log global          //日志,使用全局配置
  server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5             //真实服务器,自定义名字,可以加多个;并且监测服务器是否活着,设置参数

image.png
image.png

5.3 全局配置 global

 global    //全局配置
 maxconn 100000    //最大连接数
 chroot /apps/haproxy    //chroot禁锢,只可以访问/apps/haproxy文件
 stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin      //指明socket文件位置
 uid 99    //指明uid
 gid 99    //指明gid
 daemon    //守护进程,后台方式运行
 #nbproc 4    //指定进程数,可以设置与cpu核数相匹配。
 #cpu-map 1 0
 #cpu-map 2 1
 #cpu-map 3 2
 #cpu-map 4 3
 pidfile /var/lib/haproxy/haproxy.pid
 log 127.0.0.1 local3 info     //日志

小拓展:检查haproxy配置的语法中是否有错误?

 haproxy -f 
 haproxy -f /etc/haproxy/haproxy.cfg

注意:不能重新加载 reload,必须要重启 restart

5.3.1 cpu绑定(cpu的亲缘性)

 vim /etc/haproxy/haproxy.cfg
 *****把注释取消掉*****
 cpu-map 1 0       //将第1个work进程绑定到第0号cpu
 cpu-map 2 1       //将第2个work进程绑定到第1号cpu
 cpu-map 3 2       //将第3个work进程绑定到第2号cpu
 cpu-map 4 3       //将第4个work进程绑定到第3号cpu
 systemctl restart haproxy
 spread-checks n     //延迟发送,错峰处理。后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
 pidfile             //指定pid文件路径
 log 127.0.0.1 local2 info    //定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个

5.3.2 进程数与线程数 冲突

不能同时打开 多个进程和多个线程

 *****放入全局配置
 vim /etc/haproxy/haproxy.cfg
 nbproc     4     //指定进程数
 nbthread   2     //指定线程数
 systemctl restart haproxy     //就算重启也不会生效,因为两个不能同时使用
 #nbproc     4     //注释掉,就是只有一个进程

5.3.3 多进程和多线程socket

假设目前 有两个进程,只有一个套接字,但是一个套接字只能随机对应一个进程。那么我们可以给每个进程 设置一个单独的套接字:

 vim /etc/haproxy/haproxy.cfg
 global
 maxconn 100000
 chroot /apps/haproxy
 ​
 *****添加下面内容*****
 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 2
 *****添加上面内容*****
 systemctl restart haproxy

怎么查看套接字:

 ls /var/lib/haproxy/

5.3.4 日志

HAproxy 本身不记录客户端的访问日志,可以在HAProxy的配置中,利用rsyslog服务记录日志 指定日志文件服务器

5.3.4.1 将日志存放在本机上

 vim /etc/haproxy/haproxy.cfg
 *****在global配置项中定义:
 log 127.0.0.1 local3 info    //基于syslog记录日志到指定设备,级别有1-7(如err、warning、info、debug等)
 vim /etc/rsyslog.conf
  14 # Provides UDP syslog reception       //把udp下面两行的注释取消掉
  15 $ModLoad imudp
  16 $UDPServerRun 514
 ​
  72 # Save boot messages also to boot.log
  73 local7.*                                                /var/log/boot.log
  74 local3.*                                                /var/log/haproxy.log
  
 systemctl restart haproxy rsyslog     //重启

5.3.4.2 将日志放到别的电脑上

 本机设置:
 vim /etc/haproxy/haproxy.cfg
 log 192.168.125.130 local5 info
 192.168.125.130设置:
 vim /etc/rsyslog.conf
  14 # Provides UDP syslog reception       //把udp下面两行的注释取消掉
  15 $ModLoad imudp
  16 $UDPServerRun 514
 ​
  72 # Save boot messages also to boot.log
  73 local7.*                                                /var/log/boot.log
  74 local5.*                                                /var/log/haproxy.log
  
 systemctl restart rsyslog
 tail -f /var/log/haproxy.log

5.4 Proxies 代理配置

server 配置

 *****针对server配置
 check      #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没有其它配置也可以启用检查功能
  #默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定端口才能实现健康性检查
  addr <IP>    #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
  port <num>   #指定的健康状态监测端口
  inter <num>  #健康状态检查间隔时间,默认2000 ms
  fall <num>   #后端服务器 连续失效次数,默认为3
  rise <num>   #后端服务器 连续有效次数,默认为2
 weight <weight>  #默认为1,最大值为2560(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
 backup      #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry Server
 disabled    #将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求
 redirect prefix http://www.baidu.com/  #将请求临时(302)重定向至其它URL,只适用于http模式
 redir http://www.baidu.com     #将请求永久(301)重定向至其它URL,只适用于http模式
 maxconn <maxconn>   #当前后端server的最大并发连接数

5.4.1 添加后端健康性检查 check

haproxy 是默认无 后端健康性检查,可以手动添加check

  vim /etc/haproxy/haproxy.cfg
  server web1  192.168.125.120:80  check     //加入check
  server web2  192.168.125.130:80  check
  systemctl restart haproxy

5.4.2 备胎backup

  server web1  192.168.125.120:80  check
  server web2  192.168.125.130:80  check
  server web3  192.168.125.160:80  backup    //添加backup,当前面两台正常时,160不用工作;但当前两台挂了,160就进行接管,继续工作。

5.4.3 下线 disabled

  server web1  192.168.125.120:80  check
  server web2  192.168.125.130:80  check
  server web3  192.168.125.160:80  disabled    //添加disabled,标记为下线

5.4.4 权重 weight

当权重为0,意思就是不参与负载均衡。

  server web1  192.168.125.120:80  check
  server web2  192.168.125.130:80  check   weight 0

5.4.5 前后端分离

 *****首先将listen的配置注释掉*****
 #listen  cxk 
  #bind 192.168.125.150:80
  #mode http 
  #log global
  #server web1  192.168.125.120:80
  #server web2  192.168.125.130:80 weight 0
 ​
 `设置前端和后端:`
 frontend cxk
  bind 192.168.125.150:80
  use_backend web     //注意:要引用下面的后端
     
 backend web 
  server web1  192.168.125.120:80     //权重默认是1
  server web2  192.168.125.130:80 weight 2      //权重为2
 systemctl restart haproxy
 客户机验证:
 [root@localhost ~]# curl 192.168.125.150
 haproxy 7-3
 [root@localhost ~]# curl 192.168.125.150
 haproxy 7-3
 [root@localhost ~]# curl 192.168.125.150
 7-2 haproxy
 [root@localhost ~]# curl 192.168.125.150
 haproxy 7-3
 [root@localhost ~]# curl 192.168.125.150
 haproxy 7-3
 [root@localhost ~]# curl 192.168.125.150
 7-2 haproxy

5.4.6 永久重定向 redir

 server web1  192.168.125.120:80 check redir http://www.jd.com     //如果调度给120,那么就跳转到京东
 server web2  192.168.125.130:80 check redir http://www.baidu.com    //如果调度给130,那么就跳转到百度
 systemctl restart haproxy

5.4.7 haproxy 实验:

image.png

 7-2:
 [root@7-2 ~]#  systemctl stop firewalld
 [root@7-2 ~]#  setenforce 0
 [root@7-2 ~]#  yum install httpd -y
 [root@7-2 ~]#  systemctl start httpd
 [root@7-2 ~]#  cd /var/www/html
 [root@7-2 html]#  echo "7-2 haproxy" > index.html
 7-3:
 [root@7-3 ~]#  systemctl stop firewalld
 [root@7-3 ~]#  setenforce 0
 [root@7-3 ~]#  yum install httpd -y
 [root@7-3 ~]#  systemctl start httpd
 [root@7-3 ~]#  cd /var/www/html
 [root@7-3 html]#  echo "haproxy 7-3" > index.html
  • 后端服务器之间可以相互访问,检查是否能生效:
 [root@7-2 ~]#  curl 192.168.125.130
 haproxy 7-3
 [root@7-3 ~]#  curl 192.168.125.120
 7-2 haproxy
  • 设置代理服务器:
 7-5:代理服务器
 vim /etc/haproxy/haproxy.cfg
 listen  cxk⭐
  bind 192.168.125.150:80⭐     //如果有人访问我的80端口,就转给两台后端服务器。端口可以有多个,比如80-90,就是监听80到90之间的所有端口
  mode http
  log global 
  server web1  192.168.125.120:80⭐
  server web2  192.168.125.130:80⭐
  systemctl stop httpd
  systemctl restart haproxy

image.png

 客户机 7-4:
 [root@localhost ~]# curl 192.168.125.150    //访问代理
 haproxy 7-3
 [root@localhost ~]# curl 192.168.125.150
 7-2 haproxy
 [root@localhost ~]# curl 192.168.125.150
 haproxy 7-3
 [root@localhost ~]# curl 192.168.125.150
 7-2 haproxy

5.5 新建子配置文件

当业务众多时,将所有配置都放在一个配置文件中,会造成维护困难。可以考虑按业务分类,将配置信息拆分,放在不同的子配置文件中,从而达到方便维护的目的。

 [root@localhost ~]# mkdir /etc/haproxy/conf.d/    //创建子配置目录
 ​
 [root@localhost ~]# sed -n '40,$p'  /etc/haproxy/haproxy.cfg    //打印主配置文件的38行到最后一行
 [root@localhost ~]# sed -n '40,$p'  /etc/haproxy/haproxy.cfg   > /etc/haproxy/conf.d/test.cfg    //重定向到子配置文件conf.d下的test.cfg中。注意:配置文件名同样要以.cfg结尾
 ​
 [root@localhost ~]# vim /etc/haproxy/haproxy.cfg 
 *****注释掉主配置文件中的38行到最后一行*****
 #frontend cxk
  #bind 192.168.125.150:80
  #use_backend web
 ​
 #backend web
  #server web1  192.168.125.120:80
  #server web2  192.168.125.130:80 weight 2
 *****上面全部注释*****
 ​
 [root@localhost ~]# vim /usr/lib/systemd/system/haproxy.service    //将子配置文件的位置,加入到.service文件中
 ​
 [Unit]
 Description=HAProxy Load Balancer
 After=syslog.target network.target
 ​
 [Service]
 ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg  -f /etc/haproxy/conf.d/ -c -q
 ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/  -p /var/lib/haproxy/haproxy.pid       //加入子配置文件的路径⭐
 ExecReload=/bin/kill -USR2 $MAINPID
 LimitNOFILE=100000
 ​
 [Install]
 WantedBy=multi-user.target
 ​
 [root@localhost ~]# systemctl daemon-reload 
 [root@localhost ~]# systemctl restart haproxy

image.png
image.png

小拓展:haproxy如何查看选项的意思?

 haproxy -h    //帮助命令
     -f选项:可以指明文件或者目录

6、调度算法 详解

默认的调度算法:动态轮询

HAProxy通过固定参数 balance 指明对后端服务器的调度算法,该参数可以配置在listenbackend选项中。注意:前端不支持 balance指令。

HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。

 backend web    //后端
 balance static-rr    //指明调度算法
  server web1  192.168.125.120:80
  server web2  192.168.125.130:80

6.1 静态调度算法

6.1.1 socat工具

对服务器动态权重和其它状态 可以利用 socat工具进行调整。

示例1: 利用工具socat 对服务器动态权重调整

 [root@centos7 ~]# yum -y install socat
 ​
 [root@centos7 ~]# socat -h    //查看帮助
 [root@centos7 ~]# echo "help" | socat stdio /var/lib/haproxy/haproxy.sock   //查看scoket文件的帮助, 这个只是haproxy 软件的帮助
 ​
 [root@centos7 ~]# echo "show backend" | socat stdio /var/lib/haproxy/haproxy.sock   //查看 后端服务器的名称
 # name
 stats
 cxk
 ​
 ​
 [root@centos7 ~]# echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock    //查看haproxy 的版本信息
 ​
 ​
 [root@centos7 ~]# echo "get weight web/web1" | socat stdio /var/lib/haproxy/haproxy.sock   //查看服务器的权重。web是后端的名字,web1是真实服务器的名字
 1 (initial 1)
 ​
 ​
 [root@centos7 ~]# echo "set weight web/web1 2" | socat stdio /var/lib/haproxy/haproxy.sock     //将后端web1的权重改为2

6.1.2 static-rr 静态轮询

static-rr:基于权重的轮询调度,不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 wrr

 vim /etc/haproxy/conf.d/test.cfg
 backend web
  balance static-rr                    //静态轮询
  server web1  192.168.125.120:80
  server web2  192.168.125.130:80
 systemctl restart haproxy.service     //重启

静态轮询不支持用socat工具 动态修改权重

6.1.3 first

maxconn 最大连接数

first:根据服务器在列表中的位置,自上而下进行调度。只有当第一台真实服务器已达到上限,才会分配给第二台服务器。可以设置权重,但其实不看权重,权重无效。

 vim /etc/haproxy/conf.d/test.cfg
 backend web
  balance first                       //调度算法设置为first
  server web1  192.168.125.120:80 check  maxconn 10    //设置最大连接数为10
  server web2  192.168.125.130:80 check
 systemctl restart haproxy.service     //重启

6.2 动态算法

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

6.2.1 动态轮询

Round Robin:基于权重的轮询动态调度算法,也是haproxy的默认算法。

 listen web_host
  bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
  mode http
  log global
  balance roundrobin      //动态轮询
  server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
  server web2 10.0.0.27:80 weight 2 check inter 3000 fall 2 rise 5

6.2.2 最小连接 leastconn

leastconn 加权的最少连接 动态

 listen web_host
  bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
  mode http
  log global
  balance leastconn
  server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
  server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 5

6.2.3 random 随机算法

weight权重较大的主机,有更大概率获取新请求,也就是权重越大,越可能优先分配。

6.3 其他算法

  • source:源地址哈希
  • 一致性哈希
  • url哈希
  • url_param

6.3.1 source

源地址hash

 balance source

6.3.2 一致性hash

  balance source
  hash-type consistent   //一致性哈希

6.3.3 url_param

 假设:
 url = http://www.laowang.com/foo/bar/index.php?key=value      //param代表?后面的键值对,这个键值对的设置,还需要与开发协商
 则:
 host = "www.laowang.com"
 url_param = "key=value"

6.3.4 hdr 头部信息

 [root@centos7 ~]# curl -A 'firefox' http://192.168.125.120/index.html     //访问火狐浏览器,就是访问120
 [root@centos7 ~]# curl -A 'chrome' http://192.168.125.130/index.html    //访问谷歌浏览器,就是访问130