目录
一、Haproxy调度算法
1.1 HAproxy 概念
- HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案
- HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理
- HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上
- 缺点是当在多核系统上,这些程序通常扩展性较差。所以他们需先进行优化以使每个CPU时间片(Cycle)做更多的工作
官网:https://www.haproxy.org/
1.2 主要特性HAproxy
HAProxy的主要特性有:
- 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美
- 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s
- 支持多达8种负载均衡算法,同时也支持会话保持
- 支持虚机主机功能,从而实现web负载均衡更加灵活
- 支持连接拒绝、全透明代理等独特的功能; 连接拒绝 全透明代理
- 拥有强大的ACL支持,用于访问控制
- 其独特的弹性二叉树数据结构,使数据结构的复杂性上升到了0(1),即数据的查寻速度不会随着数据条目的增加而速度有所下降
- 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成
- 支持TCP加速,零复制功能,类似于mmap机制
- 支持响应池(response buffering)
- 支持RDP协议
- 基于源的粘性,类似nginx的ip_hash功能,把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器
- 更好统计数据接口,其web接口显示后端集群中各个服务器的接收、发送、拒绝、错误等数据的统计信息
- 详细的健康状态检测,web接口中有关于对上游服务器的健康检测状态,并提供了一定的管理功能
- 基于流量的健康评估机制
- 基于http认证
- 基于命令行的管理接口
- 日志分析器,可对日志进行分析
1.3 HAProxy 负载均衡的策略
HAProxy负载均衡策略非常多,常见的有如下8种:
(1)roundrobin:表示简单的轮询
(2)static-rr:表示根据权重
(3)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)rdp-cookie(name):表示根据cookie(name)来锁定并哈希每一次TCP请求。
1.4 HAproxy LVS Nginx的区别
- LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡
- LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案
- LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式
- HAProxy功能强大,但整体性能低于4层模式的LVS负载均衡
- Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好
nginx
① 支持正则
② 只支持基于端口的健康检查
③ 不支持session直接保持、但能通过ip_hash来解决
④ 对网络稳定性要求不高
⑤ 反向代理能力强
LVS
① 只能基于四层端口转发
② 尽在四层做分发作用 抗负载能力强
③ 应用范围广
haproxy
① 支持8种负载均衡策略
② 仅作负载均衡软件使用,在高并发情况下性能优于nginx
③ 支持URL检测 支持session保持④支持url检测后端服务器的状态
⑤Haproxy支持虚拟主机,可以工作在4、7层
1.5 常见的Web集群调度器
目前常见的Web集群调度器分为软件和硬件
软件通常使用开源的LVS、Haproxy、Nginx
- LVS性能最好,但是搭建相对复杂
- Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能也没有Haproxy好
硬件一般使用比较多的事F5,也有很多人使用国内的一些产品,比如梭子鱼、绿盟等
1.6 四层与七层负载均衡的区别(补充)
四层
四层负载均衡器是通过分析IP层及TCP/UDP层的流量实现的基于“IP+端口”的负载均衡。主要通过报文的目标地址和端口配合负载均衡算法选择后端真实服务器,确定是否需要对报文进行修改(根据需求可能会修改目标地址、源地址、MAC地址等)并将数据转发至选出的后端真实服务器
七层
七层负载均衡器是基于应用层信息(如URL、Cookies等)的负载均衡。主要依据报文的内容配合负载均衡算法选择后端真实服务器,然后再分发请求到真实服务器进行处理,也称“内容交换器”
客户端与负载均衡器、负载均衡器与后端真实服务器之间会分别建立TCP连接
二、Haproxy群集配置
准备阶段:
- Haproxy服务器:192.168.10.23
- Nginx 服务器1:192.168.10.16
- Nginx 服务器2:192.168.10.17
- 客户端:192.168.10.2
- 关闭防火墙和增强功能
部署阶段:
1、编译安装
[root@localhost ~]# uname -r
3.10.0-693.el7.x86_64
[root@localhost ~]# yum -y install pcre-devel bzip2-devel gcc gcc-c++ make
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /opt/
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# tar zxvf haproxy-1.5.19.tar.gz
[root@localhost opt]# cd haproxy-1.5.19/
[root@localhost haproxy-1.5.19]# uname -r
3.10.0-693.el7.x86_64
【查看内核,如果大于2.6.28则用TARGET=linux2628。小于则用TARGET=linux26】
[root@localhost haproxy-1.5.19]# make TARGET=linux2628 arch=x86_64
【arch=x86_64:系统位数】
2、修改haproxy.cfg配置文件
[root@localhost haproxy-1.5.19]# mkdir /etc/haproxy
[root@localhost haproxy-1.5.19]# make install
[root@localhost haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
[root@localhost haproxy-1.5.19]# cd /etc/haproxy/
[root@localhost haproxy]# vim haproxy.cfg
[root@localhost haproxy]# vim haproxy.cfg
1 # this config needs haproxy-1.1.28 or haproxy-1.2.1
2
3 global 【全局配置参数】
4 log 127.0.0.1 local0 【配置日志记录,local0为日志设备,默认存放到系统日志】
5 log 127.0.0.1 local1 notice
6 #log loghost local0 info
7 maxconn 4096 【最大连接数,修改时需考虑ulimit -n限制】
8 # chroot /usr/share/haproxy 【chroot运行路径,为该服务自设的根目录,一般需将此行注释】
9 uid 99 【用户UID】
10 gid 99 【用户GID】
11 daemon 【守护进程模式】
12 #debug
13 #quiet
14
15 defaults
16 log global 【定义日志为global配置中的日志定义】
17 mode http 【模式为http】
18 option httplog 【采用http日志格式记录日志】
19 option dontlognull 【不记录健康检查日志信息】
20 retries 3 【检查节点服务器失败次数,连续达到三次失败则认为节点不可用】
21 redispatch 【当服务器负载很高时,自动结束当前队列处理比较久的连接】
22 maxconn 2000 【最大连接数】
23 contimeout 5000 【连接超时时间】
24 clitimeout 50000 【客户端超时时间】
25 srvtimeout 50000 【服务器超时时间】
【将下面所有的listen项删除并添加】
26 listen webcluster 0.0.0.0:80 【定义一个名为webcluster的应用】
27 option httpchk GET /test.html 【检查服务器的test.html文件(POST和GET都是向服务器提交数据/请求的方式)】
28 balance roundrobin
【负载均衡调度算法使用轮询算法】
【roundrobin:轮询算法】
【leastconn: 最小连接数算法】
【source: 来源访问调度算法,类似于nginx的ip_hash轮询 加权】
【定义在线节点】
29 server inst1 192.168.131.11:80 check inter 2000 fall 3
30 server inst1 192.168.131.12:80 check inter 2000 fall 3
【check inter 2000:表示haproxy服务器和节点之间的一个心跳频率】
【fall 3: 表示连续三次检测不到心跳频率则认为该节点失效】
【若节点配置后带有“backup”表示该节点只是个备份节点,只有主节点失效该节点才会用】
【不携带“backup”则表示为主节点,和其他主节点共同提供服务】
3、Haproxy配置文件解析
haproxy配置中分成五部分内容
- global:设置全局配置参数,属于进程的配置,通常是和操作系统相关
- defaults:配置默认参数,属于公共配置,这些参数可以被引用到frontend,backend,listen组件
- frontend:接收客户端请求的虚拟节点(配置实体frontend),frontend可以添加规则直接指定需要使用的后端服务器backend;
- backend:用于配置后端服务器集群,是一组真实服务器,用来处理前段传来的请求,一个Backend对应一个或者多个实体服务器
- listen:frontend和backend的组合体。在frontend和backend部分能使用的所有选项参数,该部分都可以支持(option stop-check除外)
3.1 global部分
参数 | 说明 |
log | 日志配置,可设置rsyslog服务地址、日志设备、日志级别等 |
chroot | Haproxy的工作目录 |
pidfile | PID文件路径 |
maxconn | 每个进程可接受的最大并发连接数 |
user | 运行Haproxy的用户,可设置用户名或uid |
group | 运行Haproxy的组,可设置组名或gid |
nbproc | 启动Haproxy时创建的进程数,默认只启动一个进程 |
deamon | 以后台形式运行Haproxy,默认启用 |
3.2 defaults部分
选项 | 说明 |
mode | 设置实例的运行模式:tcp、http、health,默认是http |
log | 设置启用的日志配置,默认是global |
maxconn | 最大并发连接数 |
retries | 设置连接后端服务器时失败重试的次数,默认是3次 |
timeout | 超时时间,单位毫秒,可以重复出现,定义时以“timeout”关键字开始且另起一行 timeout的常用选项如下7行 |
http-request | http请求的超时时间 |
queue | 队列的超时时间 |
connect | 成功连接后端服务器的超时时间 |
client | 客户端发送数据的超时时间 |
server | 后端服务器响应数据的超时时间 |
http-keep-alive | 持久连接的超时时间 |
check | 心跳检测的超时时间 |
option | 定义选项,可以出现多次,每配置一个选项值,则需要另起一行,以“option”开始 option的常用选项如下5行 |
httplog | 启用日志记录http请求 |
dontlognull | 不记录健康检查的日志信息 |
http-server-close | 收到后端响应后,关闭连接,但是不会关闭客户端与haproxy的连接 |
forwardfor | 启动X-Forwarded-For,将客户端的真实IP写入其中 |
redispatch | 在连接失败的情况下启用或禁用会话重新分发,默认值是1 |
3.3 frontend部分
选项 | 说明 |
---|---|
acl | 定义acl规则 |
use_backend | 指定直接使用的后端(需要先在backend部分定义),一般与ACL配合使用 |
default_backend | 指定默认后端(需要先在backend部分定义),在use_backend规则不匹配时使用 |
3.4 backend部分
选项 | 说明 |
balance | 指定调度算法 可以是roundrobin、static-rr、leastconn、first、source、uri、url_param、hdr()、random、rdp_cookie、rdp_cookie() |
server | 定义后端真实服务器,可以重复出现,定义时需要以“server”关键字开始且另起一行 |
4、添加haproxy系统服务
[root@localhost haproxy-1.5.19]# cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@localhost haproxy-1.5.19]# cd /etc/init.d/
[root@localhost init.d]# ls
functions haproxy netconsole network README
[root@localhost init.d]# chmod +x haproxy
[root@localhost init.d]# chkconfig --add /etc/init.d/haproxy
[root@localhost init.d]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@localhost init.d]# service haproxy start
5、配置节点服务器
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
nginx-1.12.0.tar.gz rh
[root@localhost opt]# yum install -y pcre-devel.x86_64 zlib-devel.x86_64 gcc gcc-c++ make
[root@localhost opt]# tar zxvf nginx-1.12.0.tar.gz
[root@localhost opt]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx
[root@localhost nginx-1.12.0]# make -j2 install
[root@localhost nginx-1.12.0]# echo "192.168.131.11" > /usr/local/nginx/html/test.html
[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.12.0]# nginx 【启动nginx服务】
6、测试
在192.168.10.2的客户端上访问haproxy测试轮询
三、Haproxy日志管理
- 默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,所以为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来
- 需要将haproxy的info及notice日志分别记录到不同的日志文件中
[root@localhost init.d]# vim /etc/haproxy/haproxy.cfg
global
log /var/log local0
log /var/log local1 notice
[root@localhost init.d]# service haproxy restart
需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog(系统日志管理工具)启动时会自动加载此目录下的所有配置文件
[root@localhost init.d]# vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&̲~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
【这部分是将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下】
【&~:表示当日志写入到日志文件后,rsyslog停止处理这个信息】
[root@localhost init.d]# mkdir /var/log/haproxy
[root@localhost init.d]# systemctl restart rsyslog.service
[root@localhost init.d]# tail -f /var/log/haproxy/haproxy-info.log 【查看haproxy的访问请求日志信息】
四、Haproxy参数优化
4.1 优化
参数 | 说明 | 优化建议 |
timeout http-server-close | 长连接超时时间 | 此选项设置长时间连接超时时间,具体可参考应用自身特点设置,可以设置为 10s |
timeout http-request | http 请求超时时间 | 建议将此事件设置为 5~10s,增加 http 连接释放速度 |
timeout client | 客户端超时时间 | 如果访问量过大,节点响应慢,可以将此事件设置短一些,建议设置为 1min 左右即可 |
maxconn | 最大连接数 | 此参数根据应用的实际使用情况进行调整,推荐使用 10 240 |
daemon | 守护进程模式 | Haproxy 可以使用非守护进程模式启动,生产环境建议使用守护进程模式启动 |
nbproc | 负载均衡的并发进程数 | 建议与当前服务器 CPU 核数相等或为其 2 倍 |
retries | 重试次数 | 此参数主要用于对群集节点的检查,如果节点多且并发量大,设置为 2 次或 3 次;而在服务器节点不多的情况下,可以设置为 5 次或 6 次 |
option http-server-close | 主动关闭 http 请求选项 | 建议在生产环境中使用此选项,避免由于 timeout 时间设置过长导致 http 连接堆积 |
4.2 总结
- Haproxy特别适用于负载大的Web站点,支持虚拟主机,可以工作在4、7层
- 支持很多均衡算法。例如:Round-robin(轮询)、Weight-round-robin(加权轮询)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
- haproxy日志是输出到系统的syslog中,查看起来不是非常方便,所以为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来