Haproxy 介绍
Haproxy是一个开源的、高性能的基于tcp和http应用代理的高可用的、负载均衡服务软件,它支持双机热备(heartbeat)、高可用(heartbeat、)、负载均衡(lvs、nginx、squid)、虚拟主机、基于tcp和http的应用代理、图形界面查看信息等功能,其配置简单、维护方便,而且拥有很好的对服务器节点的健康检查功能(相当于keepalived),当其代理的后端服务器出现问题的时候,haproxy会自动的将该故障服务器摘除,当故障的服务器恢复侯,haproxy还会自动将该服务器自动加入进来提供服务
Haproxy特别适用于那些高负载,访问量很大,但又需要会话保持及七层应用代理的业务应用,haproxy运行在今天的普通的服务器硬件上,几乎不需要进行任何的优化就可以支持数亿万计的并发连接,并且它的运行模式使得它可以很简单、轻松、安全的整合到各种已有的网站架构中,同时,haproxy的代理模式,可以使得所有应用服务器不会暴露到公共网络上,即后面的节点服务器不需要公网ip地址
从1.3版本起,haproxy软件引入了frontend,backend的功能,frontend(acl 规则匹配) 可以让运维管理人员根据任意http请求头内容做规则匹配,然后把请求定向到相关的backend(这个是事先定义好的多个server pools),等待前端把请求转过来的服务器组),通过frontend和backend,我们可以很容易的实现haproxy的各种七层应用代理功能。
官网站点: https://www.haproxy.com/ https://www.haproxy.org/
Haproxy原理即-- 解决方案拓扑图
1、Haproxy L4 负载均衡用用架构拓扑
Haproxy软件的四层tcp应用代理非常优秀,且配置非常方便,比lvs和nginx配置简单很多,首先,配置haproxy不需要再rs(real server)端做任何特殊配置(只要对应服务开启就ok)就可以实现应用代理,其次,haproxy的配置语法和增加虚拟主机功能等也比lvs/nginx简单,下面是haproxy的layer4层应用代理的拓扑图
客户机----->haproxy------>web服务器------>mysql数据库----->web服务器------>haproxy---->客户机
说明:由于haproxy软件采用的是类nat模式(本质不同)的应用代理,数据包来去都会经过haproxy,因此,在流量特别大的情况下(门户级别的流量吧),其效率和性能不如lvs的dr模式负载均衡
2、HAPROXY L7负载均衡应用架构拓扑图
Haproxy软件最大的优势在于其7层的根据url请求头应用过滤的功能以及session会话功能,在门户网站的高并发生产架构中,haproxy软件一般在4层lvs负载均衡软件的下一层,或者像haproxy官方推荐的也可以挂在硬件负载均衡althon、ns、f5、a10下适用,其表现非常好,从2009年起taobao网,京东商城的业务也大面积的适用了haproxy做未7层cache应用代理
下面是haproxy的layer7层代理的拓扑结构图
客户端----> lvs、f5工作在5层-----> haproxy7层------>web服务器
说明:lvs支持大并发,haproxy负责7层
HAPROXY服务实施基础准备
拓扑图如下:
Haproxy的实施部署环境:
- 防火墙关闭
- selinux设置为Disabled(也可不设置)
- 系统为CentOS Linux release 7.9.2009 (Core)
- 下载nginx
[root@hd1 ~]# yum -y install haproxy
备份主目录(这个作为运维应给不用说)
[root@hd1 ~]# cd /etc/haproxy/
[root@hd1 haproxy]# cp haproxy.cfg haproxy.cfg.bak
修改配置文件,将60行以后的配置删除后,添加到defaults最后面,如下内容:
[root@hd1 haproxy]# vi haproxy.cfg
frontend mywebs *:80
default_backend webserver
backend webserver
server web1 192.168.0.12:80 check
server web2 192.168.0.13:80 check
haproxy配置文件解释
global :全局配置参数段,主要用来控制haproxy启动前的进程及系统相关设置
defaults:配置一些默认参数,如果frontend,backend,listen等段未设置则使用defaults段配置
listen:监听
frontend:用来匹配接收客户所请求的域名uri等,并针对不同的匹配,做不同的请求处理。
Backend;定义后端服务器集群,以及对后段服务器的一些权重、队列、连接数等选项的设置
配置完参数,重启
[root@hd1 haproxy]# systemctl start haproxy.service
#能查到说明已经启来了
[root@hd1 haproxy]# ss -ntl |grep -w 80
LISTEN 0 128 *:80 *:*
配置web1
[root@web1 html]# echo "this is 192.168.122.22" > index.html
[root@web1 html]# curl 192.168.122.22
this is 192.168.122.22
配置web2
[root@web2 html]# echo "this is 192.168.122.33" > index.html
[root@web2 html]# curl 192.168.122.33
this is 192.168.122.33
测试
查看状态
修改主配置文件添加内容如下:
[root@hd1 haproxy]# vi haproxy.cfg
defaults
stats enable
stats uri /haproxy
stats auth admin:123456
mode http
#重启haproxy
[root@hd1 haproxy]# systemctl restart haprox
通过浏览器访问状态页面
可以看到后台服务器的状态
将hd3.com的web停掉
[root@node3 html]# nginx -s stop
再次查看发现,web2的颜色变色了
再重新启动hd3.com的web服务,发现又恢复了
[root@node3 html]# nginx
Haproxy健康检查功能
1、基于tcp端口的健康检查
使用这种检测方式,haproxy 只会去检查后端sever 服务的对应端口,根据前面的经验我们知道这并不能保证节点服务的完全可用,但却可以作为辅助的检查手段,不是非常严格业务环境下也是可用的
修改主配置文件补全配置结果
[root@hd1 haproxy]# vi haproxy.cfg
backend webserver
server web1 192.168.0.12:80 check inter 5000 fall 5 rise 2
server web2 192.168.0.13:80 check inter 5000 fall 5 rise 2
[root@hd1 haproxy]# systemctl restart haproxy
解释说明:
(1)inter 5000 fall 5 表示每5秒检查一次,一共检查5次。如果有问题就会摘掉出问题的机器。
(2)如果结尾不加inter 5000 fall 5,则默认每2秒检查一次,一共检查3次。如果有问题就会摘掉出问题的机器。
(3)The default
values are the following ones :
- inter : 2000 意思是不加该参数,正常情况默认每两秒检查一次
- rise : 2 意思是不加该参数,在RealServer宕机后恢复前,检查2次OK,认为其复活,并加入到群组中
- fall : 3 意思是不加该参数,检查3此后,认为RS宕机,剔除集群组
2、基于URL的健康检查
设置基于URI健康检查配置
[root@hd1 haproxy]# vim haproxy.cfg
backend webserver
option httpchk HEAD /checkstatus.html HTTP/1.0
server web1 192.168.0.12:80 check inter 5000 fall 5 rise 2
server web2 192.168.0.13:80 check inter 5000 fall 5 rise 2
刷新状态页面,发现web1和web2都变色了
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d1f18131bea4aa49c2dcb73a01e0513.png)解决办法在web1和web2 网页根目录下创建checkstatus.html
```powershell
[root@node3 html]# touch checkstatus.html
[root@node2 html]# touch checkstatus.html
3、生产环境健康检查参数的设置
max_fails=2 最大尝试失败的次数,默认是1,0表示禁止失败尝试,企业场景中 京东1次,蓝汛10次
fail_timemout=20s
强调:本节内容适用于所有负载均衡软件的健康检查(lvs、nginx、squid、)
(1)常规业务可以使用基于tcp的方式做健康检查,我们在keepalived健康检查是就是这样做的,虽然,keepalived也支持url健康检查
(2)由于基于url的方式做健康检查相对来说也比较容易配置,推荐使用url的方式
(3)实际生产环境下,最重要的关键是,我们设置的check.html能否真正的代表rs上的业务状态,即 访问check.html正常,整个业务是否能正常,这个是需要我们运维及开发人员去分析的
(4)对于用户体验比较高的业务,可以请开发人员设置更加深入的健康检查文件,例如:check.jsp等,这个健康检查可以深入到数据库,存储以及各个接口,如果之一出现问题就摘除,实际工作中不是越高级越好,根据业务需求达到要求就可以
(5)健康检查的频率,次数都要做相应的调整,例如:1秒检查一次,不成功的话 立刻摘除
Haproxy 的高可用相关生产功能参数
backup 参数,表示只有其它主机全部down掉之后,backup所在的主机才会生效
高可用:一个web提供服务,另外一个处于备份等待状态
负载均衡:每个web 服务器都会提供服务
案例:修改主配置文件如下:
[root@hd1 haproxy]# vim haproxy.cfg
backend webserver
option httpchk HEAD /checkstatus.html HTTP/1.0
server web1 192.168.0.12:80 check inter 5000 fall 5 rise 2
server web2 192.168.0.13:80 check inter 5000 fall 5 rise 2 backup
[root@hd1 haproxy]# systemctl restart haproxy
测试发现,访问的是0.12,那0.13作为高可用不提供服务
停止web1的服务,再次测试,发现0.13提供web服务了。
[root@node2 html]# nginx -s stop
实现haproxy下的rs(web服务器)无法记录客户端ip地址的问题?
(1) 在haproxy配置文件里加入如下参数
[root@hd1 haproxy]# vim haproxy.cfg
backend webserver
option forwardfor
option httpchk HEAD /checkstatus.html HTTP/1.0
server web1 192.168.0.12:80 check inter 5000 fall 5 rise 2
server web2 192.168.0.13:80 check inter 5000 fall 5 rise 2 backup
(2)在web服务器里添加日志记录功能
[root@node2 conf]# nginx -s reload
(3)在windows上访问
在192.168.0.12上去查看日志(注意:基于url的健康检查会产生很多日志)
可以看到上图中,日志记录的不是haproxy服务器的ip地址而是192.168.1.11windows主机的ip地址
实现haproxy基于url地址目录做7层跳转实现动静分离配置,(nginx处理静态页面很快,apache处理动态页面很快)
根据目录进行过滤转发
1.修改后的内容如下
root@hd1 haproxy]# vi haproxy.cfg
frontend www
bind 192.168.1.11:80
acl wm_static path_beg /nginx/
acl wm_php path_beg /php/
acl wm_java path_beg /java/
use_backend nginxpools if wm_static
use_backend phppools if wm_php
default_backend nginxpools
backend nginxpools
balance leastconn
option httpclose
option forwardfor
server web01 192.168.1.13:80 check port 80 inter 1000 fall 1
backend phppools
balance leastconn
option httpclose
option forwardfor
server web02 192.168.1.14:80 check port 80 inter 1000 fall 1
2.重新启动haproxy这个服务
[root@hd1 haproxy]# systemctl restart haproxy
接下来配置 192.168.1.13、192.168.1.14为apache网站 (yum安装)
在192.168.1.13的网站根目录之下创建一个nginx目录和子首页
[root@hd3 ~]# cd /var/www/html
[root@hd3 html]# mkdir nginx
[root@hd3 html]# cd nginx/
[root@hd3 nginx]# echo "wo shi 1.13 de nginx" >index.htm
在192.168.1.14上同理
[root@hd4 ~]# cd /var/www/html
[root@hd4 html]# mkdir php
[root@hd4 html]# cd php
[root@hd4 php]# echo "wo shi 1.14 php" >index.html
测试php
测试nginx