被问爆N遍的haproxy设置

打印 上一主题 下一主题

主题 827|帖子 827|积分 2481

目次
一.实验情况
二.webserver1的设置
三.webserver2设置
四.haproxy-global全局设置
五.haproxy-proxies设置
六.socat工具:动态修改
 七.haproxy静态算法
七.一.static-rr: 基于权重的轮询调理
七.二.first
八.haproxy动态算法
八.一.roundrobin
八.二.leastconn
九.haproxy其他算法
九.一.source:map-base取模法
九.二.一致性hash
九.三.uri
九.四.uri一致性hash
九.五.url_param一致性hash
九.六.hdr
十.haproxy状态页监控

一.实验情况
功能iphaproxyeth0:172.25.254.100webserver1172.25.254.10webserver2172.25.254.20客户端Windows 二.webserver1的设置

  1. dnf install nginx -y       #下载软件包
  2. vmset.sh eth0 172.25.254.10 webserver1.rhel9.org      #利用脚本快速配置网卡
  3. echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html   #写入网页内容
  4. systemctl enable --now nginx                 #现在启动,开机自启
  5. echo 172.25.254.10 - index1.html > /usr/share/nginx/html/index1.html
  6. echo 172.25.254.10 - index2.html > /usr/share/nginx/html/index2.html
  7. echo 172.25.254.10 - index3.html > /usr/share/nginx/html/index3.html
复制代码
三.webserver2设置

  1. dnf install nginx -y
  2. vmset.sh eth0 172.25.254.20 webserver2.rhel9.org
  3. echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
  4. systemctl enable --now nginx
  5. echo 172.25.254.20 - index1.html > /usr/share/nginx/html/index1.html
  6. echo 172.25.254.20 - index2.html > /usr/share/nginx/html/index2.html
  7. echo 172.25.254.20 - index3.html > /usr/share/nginx/html/index3.html
复制代码
四.haproxy-global全局设置

  1. vi  /etc/haproxy/haproxy.cfg
  2. log     127.0.0.1  local2 指定将日志发送到本地回环地址127.0.0.1,并使用 local2 日志设施
  3. chroot   /var/lib/haproxy   设置运行时的根目录为 /var/lib/haproxy,增加安全性。   
  4. pidfile   /var/run/haproxy.pid  指定 HAProxy 进程的 PID(进程标识符)文件的位置为 /var/run/haproxy.pid
  5. maxconn   100000          设置最大并发连接数为 100000  
  6. user      haproxy  指定运行 HAProxy 进程的用户为 haproxy   
  7. group     haproxy  指定运行 HAProxy 进程的用户组为 haproxy
  8. daemon      以守护进程的方式在后台运行 HAProxy  
  9. ###################多进程和socket文件配置#####################
  10.         #utilize system-wide crypto-policies
  11.         ssl-default-bind-ciphers PROFILE=SYSTEM
  12.         ssl-default-server-ciphers PROFILE=SYSTEM
  13.         nbproc 2     #启用多进程
  14.         cpu-map 1 0   #进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗
  15.         cpu-map 2 1   #2 表示第二个进程,1 表示第二个cpu核心
  16. ###################多线程和socket文件配置#####################
  17.         #utilize system-wide crypto-policies
  18.         ssl-default-bind-ciphers PROFILE=SYSTEM
  19.         ssl-default-server-ciphers PROFILE=SYSTEM
  20.         nbthread 2            #启用多线程
  21. 重启:systemctl restart haproxy.service
  22. 验证:pstree -p | grep haproxy
  23. tips:多线程与多进程互斥,不能同时启动。
复制代码
五.haproxy-proxies设置

  1. dnf install haproxy -y
  2. rpm -qc haproxy    查看相关文件路径
  3. vi  /etc/haproxy/haproxy.cfg
  4. ------------------------------frontend前端和backend后端------------------------------
  5. .......
  6. #main frontend which proxys to the backends
  7. #-----------------------------------------------------------
  8. frontend webcluster          #定义了一个名为 webcluster 的前端部分。
  9. bind *:80                    #绑定所有接口的 80 端口来接收请求
  10. mode http                    #指明工作模式为 HTTP 协议
  11. use_backend webcluster-host   #将接收到的请求转发到名为 webcluster-host 的后端。
  12. backend webcluster-host    #定义了名为 webcluster-host 的后端部分。
  13. balance     roundrobin               #使用轮询的负载均衡算法
  14. server      web1      172.25.254.10:80   
  15. server      web2      172.25.254.20:80   #分别定义了两台后端服务器 web1 和 web2 及其对应的 IP 地址和端口。
  16. ------------------------------listen同时拥有前后端------------------------------
  17. vi  /etc/haproxy/haproxy.cfg
  18. ......
  19. #main frontend which proxys to the backends
  20. #-------------------------------------------------------
  21. listen webcluster
  22. bind *:80
  23. mode http
  24. balance     roundrobin
  25. server      web1      172.25.254.10:80
  26. server      web2      172.25.254.20:80   #写域名的话,需要本地解析。
  27. 重启:systemctl restart haproxy.service
  28. 验证:curl 172.25.254.100;分别可以stop其中的nginx看看前端和后端是否已起服务。都成功的话会出现第一个请求可能会被发送到 web1 ,第二个请求发送到 web2 ,第三个请求又回到 web1 ,以此类推,实现负载均衡。
  29. ------------------------------srever配置------------------------------
  30. dnf install httpd -y
  31. vi /etc/httpd/conf/httpd.conf
  32.         #listen 12.34.56.78:80
  33.         listen 8080  #改监听
  34. systemctl enable --now httpd
  35. echo 刘大帅随时server with you > /var/www/html/index.html   #在浏览器访问172.25.254.100:8080,有内容就对。
  36. vi  /etc/haproxy/haproxy.cfg
  37. ......
  38. #main frontend which proxys to the backends
  39. #-------------------------------------------------------
  40. listen webcluster
  41. bind *:80
  42. mode http
  43. balance     roundrobin
  44. server      web1      172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2      #在后面加上disabled该web下线
  45. server      web2      172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1      #安全检查的间隔为 2 秒,连续失败 3 次认为服务器不可用,连续成功 5 次认为服务器恢复可用,权重为 1
  46. server web_server 172.25.254.100:8080 backup   #backup不会参与调度,只有前两台都出现问题才会。
  47. 重启:systemctl restart haproxy
  48. 测试:将分别stop两台其中的nginx,curl 172.25.254.100.有内容就行。
  49. -------------------------------重定向到网站---------------------------------
  50. listen webcluster
  51. bind *:80
  52. mode http
  53. balance     roundrobin
  54. redirect prefix http://www.baidu.com/
  55. 重启:systemctl restart haproxy
  56. 测试:浏览器访问172.25.254.100,会跳到百度网站。
复制代码
六.socat工具:动态修改

  1. 1.单进程热处理:
  2. vi  /etc/haproxy/haproxy.cfg
  3. ........
  4. # turn on stats unix socket
  5. stats socket /var/lib/haproxy/stats mode 600 level admin   #加权限
  6. ........
  7. 重启:systemctl restart haproxy
  8. dnf install socat -y
  9. ll /var/lib/haproxy/   #看有几个文件,跟配置文件里面对应的
  10. [root@haproxy ~]#echo "show info" | socat stdio /var/lib/haproxy/stats
  11. [root@haproxy ~]#echo "show servers state" | socat stdio /var/lib/haproxy/stats
  12. [root@haproxy ~]#echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats   #看权重
  13. [root@haproxy ~]#echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats   #改权重
  14. [root@haproxy ~]#echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/haproxy.sock   #下线
  15. [root@haproxy ~]#echo "enable server webcluster/web1" |  socat stdio /var/lib/haproxy/haproxy.sock   #上线
  16. 2.多进程热处理:
  17. vi  /etc/haproxy/haproxy.cfg
  18. ........
  19. # turn on stats unix socket
  20. stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1
  21. stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2
  22. #utilize system-wide crypto-policies
  23.         ssl-default-bind-ciphers PROFILE=SYSTEM
  24.         ssl-default-server-ciphers PROFILE=SYSTEM
  25.         nbproc 2     
  26.         cpu-map 1 0   
  27.         cpu-map 2 1  
  28. ........
  29. 重启:systemctl restart haproxy
  30. ll /var/lib/haproxy/   #看有几个文件,跟配置文件里面对应的
  31. [root@haproxy ~]#echo "show info" | socat stdio /var/lib/haproxy/stats1
  32. [root@haproxy ~]#echo "show info" | socat stdio /var/lib/haproxy/stats2
复制代码
 七.haproxy静态算法

七.一.static-rr: 基于权重的轮询调理

  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   static-rr
  9. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2     
  10. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  11. #为了效果,关闭多进程。
  12. #为了效果,关闭多进程。
  13. #为了效果,关闭多进程。
  14. 重启:systemctl restart haproxy
  15. echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats    #看看支不支持热处理,结果是不能修改
复制代码
七.二.first

根据服务器在列表中的位置,自上而下进行调理;其只会当第一台服务器的连接数达到上限,新哀求才会分配给下一台服务;其会忽略服务器的权重设置;不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效。
  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   first
  9. server    web1  172.25.254.10:80 maxconn 1 check inter 2 fall 3 rise 5 weight 2  
  10. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  11. #为了效果,关闭多进程。
  12. #为了效果,加一个链接最大数maxconn 1,后面需要改回来。
  13. #为了效果,加一个链接最大数maxconn 1,后面需要改回来。
  14. 重启:systemctl restart haproxy
  15. 测试:多台主机执行循环while true ;do curl 172.25.254.100;sleep 0.1;done
复制代码
八.haproxy动态算法

八.一.roundrobin

基于权重的轮询动态调理算法;支持权重的运行时调解,差别于Ivs中的rr轮训模式;haproxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数);其每个后端backend中最多支持4095个real server;支持对real server权重动态调解;roundrobin为默认调理算法,此算法使用广泛。
  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   roundrobin    #还是以负载小的主
  9. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2  
  10. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  11. 重启:systemctl restart haproxy
  12. echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats    #支持热处理
复制代码
八.二.leastconn

leastconn加权的最少连接的动态;支持权重的运行时调解和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调理(新客户端连接);比较适合长连接的场景使用,比如:MySQL等场景。
  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   leastconn
  9. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2  
  10. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  11. 重启:systemctl restart haproxy
  12. echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats    #支持热处理
复制代码
九.haproxy其他算法

九.一.source:map-base取模法

源地址hash,基于用户源地址hash并将哀求转发到后端服务器,后续同一个源地址哀求将被转发至同-个后端web服务器。
map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此哀求转发至对应的后端服务器。
此方法是静态的,即不支持在线调解权重,不支持慢启动,可实现对后端服务器均调理缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调理结果团体改变,hash-type 指定的默认值为此算法。
所谓取模运算,就是计算两个数相除之后的余数,10%7=3,7%4=3
map-based算法:基于权重取模,hash(source_ip)%全部后端服务器相加的总权重。
  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   source
  9. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2  
  10. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  11. 重启:systemctl restart haproxy
  12. 测试:源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同-个后端web服务器。所以可以直接for i in {1..6}; do curl 172.25.254.100; done
  13. echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats  #否支持热处理
  14. echo "set weight webcluster/web1 0" | socat stdio /var/lib/haproxy/stats   
  15. echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats  #只能动态上线和下线
复制代码
九.二.一致性hash

  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   source
  9. hash-type consistent   #不加就不支持在线调整
  10. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2  
  11. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  12. 重启:systemctl restart haproxy
  13. 效果是一样的;变了权重,也是一样。
复制代码
九.三.uri

基于对用户哀求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后根据最终结果将哀求转发到后端指定服务器。
实用于后端是缓存服务器场景。
默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash。此算法基于应用层,以是只支持 mode http,不支持 mode tcp。
  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   uri
  9. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2  
  10. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  11. 重启:systemctl restart haproxy
  12. 测试:在web1;2中写入网页内容,在测试端
  13. curl 172.25.254.100/index1.html
  14. 172.25.254.100/index2.html
  15. 172.25.254.100/index3.html
复制代码
九.四.uri一致性hash

  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   uri
  9. hash-type consistent
  10. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2  
  11. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  12. 重启:systemctl restart haproxy
  13. 测试:是否支持热处理
复制代码
九.五.url_param一致性hash

url_param对用户哀求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器,后端搜刮同一个数据会被调理到同一个服务器,多用与电商通常用于追踪用户,以确保来自同一个用户的哀求始终发往同一个realserver。假如无没key,将按roundrobin算法。
  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   url_param name,userid
  9. hash-type consistent
  10. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1  #看效果,修改权重。
  11. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  12. 重启:systemctl restart haproxy
  13. 测试:在测试端curl 172.25.254.100/index1.html?name=lee
  14. 172.25.254.100/index1.html?name=lee
  15. 172.25.254.100/index1.html?name=test
  16. 172.25.254.100/index1.html?name=test
复制代码
九.六.hdr

针对用户每个http头部(header)哀求中的指定信息做hash此处由 name 指定的http首部将会被取出并做hash计算然后由服务器总权重取模以后派发至某挑出的服务器,假如无有用值,则会使用默认的轮询调理。
  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. #main frontend which proxys to the backends
  4. #-------------------------------------------------------
  5. listen webcluster
  6. bind *:80
  7. mode http
  8. balance   hdr(User-Agent)   #访问的浏览器
  9. hash-type consistent
  10. server    web1  172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1  
  11. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1        
  12. 重启:systemctl restart haproxy
  13. 测试:在测试端curl -vA "sogo" 172.25.254.100/index1.html
  14. curl -vA "google" 172.25.254.100/index1.html
  15. curl -vA "firefox" 172.25.254.100/index1.html
  16. curl -vA "360" 172.25.254.100/index1.html
  17. 用两个不同的浏览器输入172.25.254.100
复制代码
十.haproxy状态页监控

  1. vi  /etc/haproxy/haproxy.cfg
  2. ......
  3. server    web2  172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1  
  4. listen stats
  5.         bind *:9999
  6.         mode http
  7.         stats enable
  8.         stats refresh 10   #好久刷新
  9.         stats uri /status自定义stats    #自定义stats page uri
  10.         stats auth lee:lee     #认证,可以出现多次
  11. .....
  12. 重启:systemctl restart haproxy
  13. 测试:在本地浏览器里输入:172.25.254.100:9999/status
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表