文章目录
-
- haproxy
-
-
- haproxy 实战
-
- haproxy配置过程
- haproxy负载均衡和反向代理
- haproxy查看状态信息
- Haproxy健康检查功能
-
- haproxy的高可用--不需要keepalived
- 获取真实ip地址
- haproxy 动静分离
- keepalived+haproxy高可用集群
haproxy
haproxy概述
1.介绍
Haproxy是一个开源的、高性能的基于tcp和http应用代理的高可用的、负载均衡服务软件,
支持双机热备(heartbeat)
支持高可用(heartbeat、)
支持负载均衡(lvs、nginx、squid)
支持虚拟主机、基于tcp和http的应用代理、图形界面查看信息等功能。
配置简单、维护方便
拥有很好的对服务器节点的健康检查功能
当其代理的后端服务器出现问题的时候,haproxy会自动的将该故障服务器摘除,当故障的服务器恢复侯,haproxy还会自动将该服务器自动加入进来提供服务
2.haproxy适用场景
Haproxy特别适用于那些高负载,访问量很大,但又需要会话保持及七层应用代理的业务应用,haproxy运行在今天的普通的服务器硬件上,几乎不需要进行任何的优化就可以支持数亿万计的并发连接,并且它的运行模式使得它可以很简单、轻松、安全的整合到各种已有的网站架构中,同时,haproxy的代理模式,可以使得所有应用服务器不会暴露到公共网络上,即后面的节点服务器不需要公网ip地址
从1.3版本起,haproxy软件引入了frontend,backend的功能,
frontend(acl 规则匹配) 可以让运维管理人员根据任意http请求头内容做规则匹配,然后把请求定向到相关的backend(这个是事先定义好的多个server pools),等待前端把请求转过来的服务器组),
通过frontend和backend,我们可以很容易的实现haproxy的各种七层应用代理功能。
3.Haproxy支持两种主要代理模式
1)基于四层的tcp应用代理(例如:可用于邮件服务、内部协议通信服务器,mysql、https服务等)
2)基于7层的http代理,在4层tcp代理模式下,haproxy仅在客户端和服务器之间进行流量转发,但是在7层http代理模式下,haproxy会分析应用层协议,并且能通过允许、拒绝、交换、增加、删除、修改请求或者回应制定内容来控制协议
官方站点 https://www.haproxy.com/ https://www.haproxy.org/
LVS在企业应用中抗负载能力很强,但存在不足,LVS不支持正则处理,不能实现动静分离;
对于大型网站,LVS的实施配置复杂,维护成本相对较高;Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件,适用于负载大的Web站点;
运行在硬件上可支持数以万计的并发连接的连接请求;
4.Haproxy L4 负载均衡用用架构拓扑
Haproxy软件的四层tcp应用代理非常优秀,且配置非常方便,比lvs和nginx配置简单很多,首先,配置haproxy不需要再rs(real server)端做任何特殊配置(只要对应服务开启就ok)就可以实现应用代理,其次,haproxy的配置语法和增加虚拟主机功能等也比lvs/nginx简单
客户机-----》haproxy------》web服务器------》mysql数据库-----》web服务器------》haproxy----》客户机
说明:由于haproxy软件采用的是类nat模式(本质不同)的应用代理,数据包来去都会经过haproxy,因此,在流量特别大的情况下(门户级别的流量吧),其效率和性能不如lvs的dr模式负载均衡
5.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支持的调度算法
1.Round Robin(RR) 轮询调度
2.Least Connections(LC) 最少连接数
3.Source Hashing(SH) 基于来源访问调度算法
Haproxy配置文件详解
1、Haproxy配置文件通常分为三个部分
global:全局配置
defaults:默认配置
listen:应用组件配置
2、global配置参数
log127.0.0.1 lcal0:配置日志记录,local0为日志设备,默认存放到系统日志
log127.0.0.1 loca1 notice: notice为日志级别,通常有24个级别
maxconn4096:最大连接数
uid 99:用户 uid
gid 99:用户 gid
3、defaults配置项配置默认参数
log global:定义日志为global配置中的日志定义
mode http:模式为http option
httplog:采用http日志格式记录日志
retries 3:检查节点服务器失败连续达到三次则认为节点不可用
maxconn2000:最大连接数
haproxy 实战
haproxy配置过程
1.haproxy配置负载均衡和反向代理
1.两台web服务器,一台做负载均衡和反向代理
2.关闭防火墙,配置yum源
3.安装haproxy软件,配置/etc/haproxy/haproxy.cfg文件
4.重启haproxy
5.配置web服务器httpd或者nginx服务,可以显示出网页
2.查看状态信息的配置
1.修改主配置文件添加内容如下:
defaults
stats enable
stats uri /haproxy
stats auth admin:123456
mode http
2.重启haproxy服务
3.测试
3.haproxy健康检查功能
1.基于tcp端口的健康检查
1.修改主配置文件补全配置结果
backend webserver
server web1 192.168.0.12:80 check inter 5000 fall 5 2
server web2 192.168.0.13:80 check inter 5000 fall 5 rise 2
2.重启haproxy
2.基于URL的健康检查
1.设置基于URI健康检查配置
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
2.在两台web服务器下创建checkstatus.html文件
3.重启haproxy
4.haproxy高可用配置
backup 参数,表示只有其它主机全部down掉之后,backup所在的主机才会生效
高可用:一个web提供服务,另外一个处于备份等待状态
负载均衡:每个web 服务器都会提供服务
1.修改主配置文件,添加backup
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
2.重启haproxy
5.获取客户端ip地址
1.在haproxy配置文件里加入如下参数
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)在nginx web服务器里添加日志记录功能
#此配置在web服务器上的nginx配置文件
#可配置到http、server、location中
#配置需要识别的IP来源 负载均衡的IP
set_real_ip_from 192.168.0.11;
3.重启web服务器nginx服务
# nginx -s reload
========================httpd记录真实ip配置如下=======================
如果是web服务是httpd的话,在listen 80 这行下面添加
RemoteIPHeader X-Forwarded-For
将195行的日志中的%h替换成%{X-Forwarded-For}i
4)测试,在windows上访问
在192.168.0.12上去查看日志(注意:基于url的健康检查会产生很多日志)
可以看到上图中,日志记录的不是haproxy服务器的ip地址而是192.168.1.11windows主机的ip地址
6.动静分离实验(负载均衡+反向代理)
实现haproxy基于url地址目录做7层跳转实现动静分离配置
根据目录进行过滤转发
1.修改/etc/haproxy/haproxy.cfg文件
2.重启haproxy
3.配置两台web服务器
7.keepalived+haproxy 高可用集群
haproxy的高可用是对web服务器进行backup处理
keepalived的高可用是备份haproxy,解决了单点故障的问题
1.关闭防火墙,配置yum源
2.安装haproxy,安装keepalived
3.配置主用节点haproxy,配置备用节点haproxy
4.配置主用节点keepalived,配置备用节点keepalived
5.开启主keepalived,后开启备用keepalived
6.配置两台web服务器
haproxy负载均衡和反向代理
安装haproxy软件
[root@hd1 ~]# yum -y install haproxy
备份主目录
[root@hd1 ~]# cd /etc/haproxy/
[root@hd1 haproxy]# cp haproxy.cfg haproxy.cfg.bak
修改配置文件,将60行以后的配置删除后,添加如下内容:
[root@hd1 haproxy]# vi haproxy.cfg
frontend mywebs *:80
default_backend webserver
backend webserver
server web1 192.168.8.138:80 check
server web2 192.168.8.139: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 *:*
接着
在192.168.8.138上和192.168.8.139上安装nginx web服务
1.先安装nginx源
[root@hd3 yum.repos.d]# cat nginx.repo
[nginx]
baseurl = http://nginx.org/packages/centos/7/$basearch/
enabled = 1
gpgcheck = 0
name = nginx repo
[root@hd2 yum.repos.d]# cat nginx.repo
[nginx]
baseurl = http://nginx.org/packages/centos/7/$basearch/
enabled = 1
gpgcheck = 0
name = nginx repo
2.两台服务器上yum 安装nginx
yum -y install nginx
配置首页步骤略过
测试一下
haproxy查看状态信息
查看状态信息
修改主配置文件添加内容如下:
[root@hd1 haproxy]# vi haproxy.cfg
defaults
stats enable
stats uri /haproxy
stats auth admin:123456
mode http
重启haproxy
[root@hd1 haproxy]# systemctl restart haproxy
账号Admin
密码123456
通过浏览器访问状态页面
192.168.1.129/haproxy
Queue
Cur: current queued requests //当前的队列请求数量
Max:max queued requests //最大的队列请求数量
Limit: //队列限制数量
Session rate(每秒的连接回话)列表:
scur: current sessions //每秒的当前回话的限制数量
smax: max sessions //每秒的新的最大的回话量
slim: sessions limit //每秒的新回话的限制数量
Sessions
Total: //总共回话量
Cur: //当前的回话
Max: //最大回话
Limit: //回话限制
Lbtot: total number of times a server was selected //选中一台服务器所用的总时间
Bytes
In: //网络的字节数输入总量
Out: //网络的字节数输出总量
Denied
Req: denied requests//拒绝请求量
Resp:denied responses //拒绝回应
Errors
Req:request errors //错误请求
Conn:connection errors //错误的连接
Resp: response errors (among which srv_abrt) ///错误的回应
Warnings
Retr: retries (warning) //重新尝试
Redis:redispatches (warning) //再次发送
Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk: 持续检查后端服务器的时间
Wght: (weight) : 权重
Act: server is active (server), number of active servers (backend) //活动链接数量
Bck: server is backup (server), number of backup servers (backend) //backup:备份的服务器数量
Down: //后端服务器连接后都是down的数量
Downtime: downtime: total downtime (in seconds) //总的downtime 时间
Throttle: warm up status //设备变热状态
Haproxy健康检查功能
基于tcp端口的健康检查
基于tcp端口的健康检查
使用这种检测方式,haproxy 只会去检查后端sever 服务的对应端口,根据前面的经验我们知道这并不能保证节点服务的完全可用,但却可以作为辅助的检查手段,不是非常严格业务环境下也是可用的
修改主配置文件补全配置结果
[root@hd1 haproxy]# vi haproxy.cfg
backend webserver
server web1 192.168.0.12:80 check inter 5000 fall 5 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次。如果有问题就会摘掉出问题的机器。
4)The default
values are the following ones :
- inter : 2000 意思是不加该参数,正常情况默认每两秒检查一次
- rise : 2 意思是不加该参数,在RealServer宕机后恢复前,检查2次OK,认为其复活,并加入到群组中
- fall : 3 意思是不加该参数,检查3此后,认为RS宕机,剔除集群组
基于URL的健康检查
基于URL的健康检查
1)设置基于URI健康检查配置
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都变色了
解决办法在web1和web2 网页根目录下创建checkstatus.html
[root@node3 html]# touch checkstatus.html
[root@node2 html]# touch checkstatus.html
生产环境健康检查参数的设置
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的高可用–不需要keepalived
Haproxy 的高可用相关生产功能参数
backup 参数,表示只有其它主机全部down掉之后,backup所在的主机才会生效
高可用:一个web提供服务,另外一个处于备份等待状态
负载均衡:每个web 服务器都会提供服务
案例:修改主配置文件如下:
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
获取真实ip地址
实现haproxy下的rs(web服务器)无法记录客户端ip地址的问题?
1)在haproxy配置文件里加入如下参数
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)在nginx web服务器里添加日志记录功能
#此配置在web服务器上的nginx配置文件
#可配置到http、server、location中
#配置需要识别的IP来源 负载均衡的IP
set_real_ip_from 192.168.0.11;
[root@node2 conf]# nginx -s reload
========================httpd记录真实ip配置如下=======================
如果是web服务是httpd的话,在listen 80 这行下面添加
RemoteIPHeader X-Forwarded-For
将195行的日志中的%h替换成%{X-Forwarded-For}i
3)在windows上访问
在192.168.0.12上去查看日志(注意:基于url的健康检查会产生很多日志)
可以看到上图中,日志记录的不是haproxy服务器的ip地址而是192.168.1.11windows主机的ip地址
haproxy 动静分离
实现haproxy基于url地址目录做7层跳转实现动静分离配置
根据目录进行过滤转发
1.修改后的内容如下
root@hd1 haproxy]# vi haproxy.cfg
frontend www *: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.html
在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
更好的配置如下:
frontend www
bind *:80
maxconn 5000
mode http
log global
option httplog
option httpclose
option forwardfor
log global
default_backend default
acl url_static path_beg -i /static /img /javascript
acl url_static path_end -i .jpg .gif .png .css .js .html
acl host_static hdr_beg(host) -i img. video. download. ftp. imags. acl url_php path_end -i .php
acl url_jsp path_end -i .jsp .do
use_backend static_pool if url_static or host_static
use_backend php_pool if url_php
use_backend tomcat_pool if url_jsp
backend static_pool
option httpchk GET /index.html
server static1 192.168.1.12:80 cookie id1 check inter 2000 rise 2 fall 3
backend php_pool
option httpchk GET /info.php
server php1 192.168.1.13:80 cookie id1 check inter 2000 rise 2 fall 3
backend tomcat_pool
option httpchk GET /index.jsp
server tomcat1 192.168.1.14:8086 cookie id2 check inter 2000 rise 2 fall 3
keepalived+haproxy高可用集群
haproxy+keepalived实现高可用集群
1.可靠性和稳定性非常好,可以和硬件级的负载均衡设备F5相媲美。
2.最高可同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个。
3.支持8种负载均衡算法,支持会话保持;支持虚拟主机功能;支持连接拒绝,全透明代理并且有一个功能强大的服务器状态监控界面。
4.拥有功能强大的ACL支持。
5.用haproxy构建群集的时候,比如后方代理两个http,如果haproxy宕机,后方的http正常运行网站也是瘫痪状态,这就造成了单点故障。
这时keepalived就登场了,keepalived基于vrrp协议,两台主机之间生成一个虚拟的ip,我们称漂移ip,漂移ip由主服务器承担,一但主服务器宕机,备份服务器就会抢占漂移ip,继续工作,有效的解决了群集中的单点故障。两者相结合,可靠稳定。
1 在192.168.1.12上安装haproxy,停止httpd服务,删除httpd软件
[root@hd2 ~]# yum -y install haproxy
2 配置192.168.1.11和192.168.1.12为haproxy (配置相同)
frontend mywebs *:80
default_backend webserver
backend webserver
server web1 192.168.1.13:80 check
server web2 192.168.1.14:80 check
重启haproxy服务
[root@hd1 ~]# systemctl restart haproxy
[root@hd2 ~]# systemctl restart haproxy
配置192.168.1.11为主用keepalived,192.168.1.12为备用
[root@hd1 ~]# yum -y install keepalived
清空配置文件,重新设置如下
[root@hd1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.199
}
}
配置备用节点
[root@hd2 haproxy]# yum -y install keepalived
[root@hd2 haproxy]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.199
}
}
启动两台服务器的keeaplived
[root@hd1 ~]# systemctl restart keepalived
[root@hd2 ~]# systemctl restart keepalived
查看vip地址
[root@hd1 ~]# ip addr |grep 1.199
inet 192.168.1.199/32 scope global ens33
测试是否正常
[root@hd1 ~]# curl 192.168.1.199
停掉服务测试是否正常
[root@hd2 ~]# curl 192.168.1.199