• Haproxy搭建Web集群


    一、Haproxy概述

    1.1 Haproxy介绍

    Haproxy:常用的负载均衡软件,和nginx一样,支持四层转发和七层转发
    可以支持一万以上的并发请求,是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理软件
    主要用户高并发的web场景,工作原理和nginx、lvs都一样,配置方式有区别

    注:LVS的DR和NAT模式都是基于四层转发
    TUN模式是基于四层加七层

    1.2 Haproxy支持功能

    • 1、基于TCP和HTTP协议的反向代理
    • 2、支持HTTPS的代理配置
    • 3、针对http请求添加cookie,转发到后端服务器(添加缓存)
    • 4、支持主备服务器切换(keepalived)
    • 5、基于端口的实时监控
    • 6、压缩响应报文

    1.3 Haproxy特点

    • 1、可靠性和稳定性非常好,可以和负载均衡的硬件设备f5 BIG媲美
    • 2、可以同时维护40000-50000个并发连接,单位时间内处理最大请求数20000个
    • 3、支持八种负载均衡算法,但是haproxy不带缓存功能,但是可以支持会话保持
    • 4、支持配置虚拟主机

    1.4 Haproxy的负载均衡算法

    • 1、roundrobin:轮询
    • 2、static-rr:加权轮询
    • 3、leastconn:最小连接数
    • 4、source:根据请求的源ip进行调度
    • 5、uri:根据请求地址进行调度
    • 6、url_param:根据URL的参数实现调度
    • 7、hdr(name):根据HTTP请求头来锁定每一次HTTP请求
    • 8、rdp-cookie(name):根据cookie(name)来锁定并hash每一次TCP请求

    1.5 LVS、Nginx、Haproxy的区别

    • 1、LVS基于Linux内核实现负载均衡,性能最高,但是对系统硬件要求也比较高
    • Haproxy和Nginx是基于第三方应用实现负载均衡,性能相对较低
    • 2、LVS可以实现ip+端口的四层负载均衡,无法实现http请求的转发。Haproxy和Nginx都可以实现四层和七层的转发
    • 3、LVS只能实现四层转发,检测的状态只能是单一的功能(监测端口)
    • Haproxy可以支持端口、URI、脚本等多种状态的检测方式
    • 4、Haproxy虽然功能强大,但是整体性能低于LVS,Nginx的性能又低于Proxy
    • 5、Nginx主要用于提供Web服务或者缓存服务器。Nginx的stream和upstream模块虽然也支持集群功能,但是对集群节点健康检查功能不强,性能没有LVS和Haproxy好

    1.6 Haproxy的缺点

    Haproxy一半都是单节点部署、单实例运行。一旦代理服务器出现故障,整个负载集群全部不可用,所以一般结合keepalived实现代理地址的高可用

    Haproxy本身是一个无状态的负载均衡器,没缓存,也没有会话保持,靠应用程序实现会话保持。状态不是保存在代理服务器,而是在后端服务器,或者依靠cookie

    Haproxy的日志比较简单,一般只提供基本的请求日志和错误日志。需要更高级的日志便依赖人工自定义

    二、Haproxy+七层反向代理

    1. 实验配置:
    2. 20.0.0.61:代理服务器
    3. 20.0.0.62:web服务器1
    4. 20.0.0.63:web服务器2
    5. 20.0.0.10:客户端

    配置代理服务器 

    1. [root@nginx1 ~]# cd /opt
    2. --传入Haproxy软件包--
    3. [root@nginx1 opt]# tar -xf haproxy-1.5.19.tar.gz
    4. [root@nginx1 opt]# yum install -y pcre-devel bzip2-devel gcc gcc-c++ make #安装依赖环境
    5. [root@nginx1 opt]# cd haproxy-1.5.19/
    6. [root@nginx1 haproxy-1.5.19]# make TARGET=LInux2628 ARCH=X86_64 #uname -r查看内核版本,只要内核版本大于2.6,就用2628
    7. [root@nginx1 haproxy-1.5.19]# make install
    8. [root@nginx1 haproxy-1.5.19]# mkdir /etc/haproxy
    9. [root@nginx1 haproxy-1.5.19]# cd examples/
    10. [root@nginx1 examples]# cp haproxy.cfg /etc/haproxy/
    11. [root@nginx1 examples]# cd /etc/haproxy/
    12. [root@nginx1 haproxy]# cp haproxy.cfg haproxy.cfg.bak
    13. [root@nginx1 haproxy]# vim haproxy.cfg

    Haproxy配置文件修改及解析

    1. global #全局配置,主要用于定义全局参数
    2. --4~5行--修改,定义haproxy日志输出设置和日志级别,local0为日志设备,默认存放到系统日志
    3. log /dev/log local0 info
    4. log /dev/log local0 notice
    5. #log loghost local0 info
    6. maxconn 4096 #最大连接数,需考虑ulimit -n限制,推荐使用10240
    7. --8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
    8. #chroot /usr/share/haproxy
    9. uid 99 #用户UID
    10. gid 99 #用户GID
    11. daemon #守护进程模式
    12. nbproc 4 #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2
    13. defaults #配置默认参数,包括监听地址、协议、backend(upstream)组件
    14. log global #引入global定义的日志格式
    15. mode http #模式为http(7层代理http,4层代理tcp)
    16. option httplog #日志类别为http日志格式
    17. option dontlognull #不记录健康检查日志信息
    18. retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
    19. redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
    20. maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
    21. #contimeout 5000 #设置连接超时时间,默认单位是毫秒
    22. #clitimeout 50000 #设置客户端超时时间,默认单位是毫秒
    23. #srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒
    24. timeout http-request 10s #默认http请求超时时间
    25. timeout queue 1m #默认队列超时时间
    26. timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容
    27. timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
    28. timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
    29. timeout http-keep-alive 10s #默认持久连接超时时间
    30. timeout check 10s #设置心跳检查超时时间
    31. --删除下面所有listen项--,添加
    32. listen test 0.0.0.0:80 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用
    33. option httpchk GET /index.html #检查服务器的test.html文件
    34. balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
    35. server inst1 20.0.0.62:80 check inter 2000 fall 3 weight 3
    36. server inst2 20.0.0.63:80 check inter 2000 fall 3 weight 4 #设置权重
    37. #开启对后端服务器的健康检查,检查的时间间隔:2000ms
    38. #fall 3:表示连续三次检测不到后端服务器的心跳线,则认为该节点失效
    39. 添加haproxy系统服务
    40. [root@nginx1 haproxy]# cd /opt/haproxy-1.5.19/examples/
    41. [root@nginx1 examples]# cp haproxy.init /etc/init.d/haproxy
    42. [root@nginx1 examples]# chmod 777 /etc/init.d/haproxy
    43. [root@nginx1 examples]# chkconfig --add /etc/init.d/haproxy
    44. [root@nginx1 examples]# ln -s /usr/local/sbin/haproxy /usr/sbin/
    45. [root@nginx1 examples]# systemctl restart haproxy.service

    配置后端web服务器

    1. [root@nginx2 ~]# vim /usr/local/nginx/html/index.html
    2. --添加--
    3. this is test1
    4. [root@nginx3 ~]# vim /usr/local/nginx/html/index.html
    5. --添加--
    6. this is test2

    访问测试

    三、Haproxy+四层反向代理

    配置代理服务器

    1. [root@nginx1 haproxy]# vim haproxy.cfg
    2. #listen test 0.0.0.0:80
    3. # option httpchk GET /index.html
    4. # balance roundrobin
    5. # server inst1 20.0.0.62:80 check inter 2000 fall 3
    6. # server inst2 20.0.0.63:80 check inter 2000 fall 3
    7. frontend test
    8. bind *:80
    9. mode tcp
    10. default_backend test
    11. backend test
    12. mode tcp
    13. balance static-rr
    14. server server1 20.0.0.62:80 check inter 2000 fall 3 weight 3
    15. server server2 20.0.0.63:80 check inter 2000 fall 3 weight 4
    16. [root@nginx1 haproxy]# systemctl restart haproxy.service

     访问测试

    模拟节点故障

    1. [root@nginx2 ~]# systemctl stop nginx
    2. 关闭web服务器1地nginx服务

    1. [root@nginx2 ~]# systemctl restart nginx
    2. 重启web服务器1的nginx服务

    四、Haproxy日志单独存放

    默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中

    1. [root@nginx1 haproxy]# vim /etc/haproxy/haproxy.cfg
    2. global
    3. log /dev/log local0 info
    4. log /dev/log local0 notice
    5. service haproxy restart
    6. #需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件
    7. [root@nginx1 haproxy]# vim /etc/rsyslog.d/haproxy.conf
    8. if ($programname == 'haproxy' and $syslogseverity-text == 'info')
    9. then -/var/log/haproxy/haproxy-info.log
    10. &~
    11. if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
    12. then -/var/log/haproxy/haproxy-notice.log
    13. &~
    14. -------------------------------------------------------------------------------------------
    15. 将haproxy的info 日志记录到/var/log/haproxy/haproxy-info.log下
    16. 将haproxy的notice日志记录到/var/log/haproxy/haproxy-notice.log下
    17. &~”表示当日志写入到日志文件后,rsyslog停止处理这个信息
    18. ----------------------------------------------------------------------------------------
    19. [root@nginx1 haproxy]# systemctl restart rsyslog.service
    20. [root@nginx1 haproxy]# systemctl restart haproxy.service
    21. [root@nginx1 haproxy]# tail -f /var/log/haproxy/haproxy-info.log
    22. #查看haproxy的访问请求日志信息

  • 相关阅读:
    layui select多选下拉显示 以及多值回显
    2023.10.02 win7x64sp1下Navicat_Premium15_x86连接Oracle_10g(安装在win2003x86)
    PAM从入门到精通(十)
    完美解决 在将最终稿件上传到 IEEE PDF eXpress进行格式检查是出现“font not embedded“的问题 (不会出现自动压缩图像的现象)
    【笔记】逻辑斯蒂回归
    vue.js实现自定义tab滑动切换效果
    代码随想录二刷 |数组 | 螺旋矩阵II
    win11 Windows hello录入指纹失败解决方法
    【Rust指南】配置加速Cargo下载、更新依赖库|利用随机数编写Rust猜数游戏
    nginx配置指南
  • 原文地址:https://blog.csdn.net/pupcarrot/article/details/134030956