【haproxy】负载均衡群集~

1、haproxy 简介

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

负载均衡的实现:

1、软件:

  • 四层:

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

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

2、硬件:

2、调度算法简介

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

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

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

    js 复制代码
     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结果的随机数, 来调度,权重越大越容易被调度

调度算法的对比:

nginx haproxy lvs
rr(轮询) rr rr
加权轮询 static-rr wrr 加权
ip hash 最小连接 源地址 hash SH
url hash source 根据源地址 目的地址 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 安装

js 复制代码
 [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环境

js 复制代码
 lua官网:
 https://www.lua.org
js 复制代码
 [root@7-1 ~]# lua -v    //查看当前系统版本
 Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
js 复制代码
 [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

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

5.2 特殊配置:状态页

js 复制代码
 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             //真实服务器,自定义名字,可以加多个;并且监测服务器是否活着,设置参数


5.3 全局配置 global

js 复制代码
 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配置的语法中是否有错误?

js 复制代码
 haproxy -f 
 haproxy -f /etc/haproxy/haproxy.cfg

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

5.3.1 cpu绑定(cpu的亲缘性)

js 复制代码
 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
js 复制代码
 spread-checks n     //延迟发送,错峰处理。后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
 pidfile             //指定pid文件路径
 log 127.0.0.1 local2 info    //定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个

5.3.2 进程数与线程数 冲突

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

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

5.3.3 多进程和多线程socket

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

js 复制代码
 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

怎么查看套接字:

js 复制代码
 ls /var/lib/haproxy/

5.3.4 日志

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

5.3.4.1 将日志存放在本机上

js 复制代码
 vim /etc/haproxy/haproxy.cfg
 *****在global配置项中定义:
 log 127.0.0.1 local3 info    //基于syslog记录日志到指定设备,级别有1-7(如err、warning、info、debug等)
js 复制代码
 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 将日志放到别的电脑上

js 复制代码
 本机设置:
 vim /etc/haproxy/haproxy.cfg
 log 192.168.125.130 local5 info
js 复制代码
 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 配置

js 复制代码
 *****针对server配置
 check      #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没有其它配置也可以启用检查功能
  #默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定端口才能实现健康性检查
  addr <IP>    #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
  port <num>   #指定的健康状态监测端口
  inter <num>  #健康状态检查间隔时间,默认2000 ms
  fall <num>   #后端服务器 连续失效次数,默认为3
  rise <num>   #后端服务器 连续有效次数,默认为2
 weight <weight>  #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
 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

js 复制代码
  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

js 复制代码
  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

js 复制代码
  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,意思就是不参与负载均衡。

js 复制代码
  server web1  192.168.125.120:80  check
  server web2  192.168.125.130:80  check   weight 0

5.4.5 前后端分离

js 复制代码
 *****首先将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
js 复制代码
 客户机验证:
 [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

js 复制代码
 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 实验:

js 复制代码
 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
js 复制代码
 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
  • 后端服务器之间可以相互访问,检查是否能生效:
js 复制代码
 [root@7-2 ~]#  curl 192.168.125.130
 haproxy 7-3
 [root@7-3 ~]#  curl 192.168.125.120
 7-2 haproxy
  • 设置代理服务器:
js 复制代码
 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
js 复制代码
 客户机 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 新建子配置文件

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

js 复制代码
 [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


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

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

6、调度算法 详解

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

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

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

js 复制代码
 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 对服务器动态权重调整

js 复制代码
 [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

js 复制代码
 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:根据服务器在列表中的位置,自上而下进行调度。只有当第一台真实服务器已达到上限,才会分配给第二台服务器。可以设置权重,但其实不看权重,权重无效。

js 复制代码
 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的默认算法。

js 复制代码
 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 加权的最少连接 动态

js 复制代码
 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

js 复制代码
 balance source

6.3.2 一致性hash

js 复制代码
  balance source
  hash-type consistent   //一致性哈希

6.3.3 url_param

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

6.3.4 hdr 头部信息

js 复制代码
 [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
相关推荐
内核程序员kevin16 分钟前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream5 小时前
Linux的桌面
linux
xiaozhiwise5 小时前
Makefile 之 自动化变量
linux
意疏7 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
BLEACH-heiqiyihu8 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
一只爱撸猫的程序猿8 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx
何遇mirror8 小时前
云原生基础-云计算概览
后端·云原生·云计算
我的K84099 小时前
Flink整合Hudi及使用
linux·服务器·flink