HAProxy概述、搭建Web群集
- 一、HAProxy概述
- 1、HAProxy的主要特性
- 2、常见的Web集群调度器
- 3、Haproxy应用分析
- 4、Haproxy调度算法原理
- 二、LVS、Nginx、HAproxy的区别
- 三、LVS、Nginx、HAproxy的优缺点
- 1、Nginx的优点:
- 2、Nginx的缺点:
- 3、LVS的优点:
- 4、LVS的缺点:
- 5、HAProxy的优点:
- 6、HAProxy的缺点
- 四、Haproxy搭建 Web 群集
- 1、haproxy 服务器部署
- 2、节点服务器部署
- 3、测试 Web群集
- 五、日志定义
- 六、haproxy优化
一、HAProxy概述
- Haproxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTT的应用程序代理。
- HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
- Haproxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)实现所有这些任务,所以没有这些问题。
- 此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。
- 包括GitHub,Bitbucket,stack overflow,Reddit Tumblr,Twitter 和 Tuenti 在内的知名网站,及亚马逊网络服务系统都使用了Haproxy
1、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认证;
- 基于命令行的管理接口;
- 日志分析器,可对日志进行分析。
2、常见的Web集群调度器
- 目前常见的Web集群调度器分为软件和硬件
- 软件通常使用开源的LVS、Haproxy、Nginx
LVS性能最好,但是搭建相对复杂;Nginx的upstream模块支持集群功能,但是对集群节点健康检查功能不强,高并发没有Haproxy好
- 硬件一般使用的比较多的是F5,也有很多人使用梭子鱼、绿盟等国内产品
3、Haproxy应用分析
LVS在企业应用中抗负载能力很强,但存在不足
- LVS不支持正则处理,不能实现动静分离
- 对于大型网站,LVS的实施配置复杂,维护成功相对较高
Haproxy是一款可提供高可用性、负载均衡、及基于TCP(四层代理)和HTTP(七层代理)应用的代理的软件
- 适用于负载大的Web站点
- 运行在硬件上可支持数万计的并发连接的连接请求
4、Haproxy调度算法原理
- Haproxy支持多种调度算法,最常用的有三种
方法名 | 说明 |
RR (Round Robin) | RR算法是最简单常用的一种算法,即轮询调度 |
LC(Least Connections) | 最小连接数算法,根据后端的节点连接数大小动态分配前端请求。 |
SH(Source Hashing) | 基于来源访问调度算法,用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度 |
2、HAProxy负载均衡策略(8种)
HAProxy负载均衡策略 | 说明 |
roundrobin | 表示轮询 |
static-rr | 表示加权轮询 |
leastconn | 表示最小连接数 |
source | 表示根据源地址哈希 |
uri | 表示根据URL哈希 |
url_param | 表示根据URL参数哈希 |
har(name) | 表示根据HTTP请求头哈希 |
rdp-cookie(name) | 表示根据cookie(name)哈希 |
二、LVS、Nginx、HAproxy的区别
- LVS基于Linux操作系统实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
- LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
- LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAProxy在状监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式;
- HAProxy功能强大,但整体性能低于4层模式的LVS负载均衡。
- Nginx主要用于Web服务器或缓存服务器。
负载均衡性能:
- (硬件负载F5)> LVS 最好 > Haproxy 其次 > Nginx 弱于其他两种
支持的代理类型:
- LVS基于系统内核实现的负载均衡,只能支持四层代理的IP转发(不支持正则表达式)
- Haproxy 和 Nginx 基于应用程序实现的负载均衡,都能支持四层和七层代理转发(支持正则表达式)
支持的健康检查方式:
- LVS支持对端口和URL进行检查,Nginx 只支持对端口的检查,Haproxy支持端口、URL、脚本等多种检查方式
三、LVS、Nginx、HAproxy的优缺点
1、Nginx的优点:
- 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构。Nginx正则规则比HAProxy更为强大和灵活。
- Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,LVS对网络稳定性依赖比较大,稳定要求相对更高。
- Nginx安装和配置、测试比较简单、方便,有清晰的日志用于排查和管理,LVS的配置、测试就要花比较长的时间了。
- 可以承担高负载压力且稳定,一般能支撑几万次的并发量,负载度比LVS相对小些。
- Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等。
- Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。
- Nginx作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,很多场景下都将其作为反向代理加速器。
- Nginx作为静态网页和图片服务器,这方面的性能非常优秀,同时第三方模块也很多。
2、Nginx的缺点:
- Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些。
- 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
- 不支持Session的直接保持,需要通过ip_hash和cookie的引导来解决。
3、LVS的优点:
- 抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生。因此负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
- LVS工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案。
- 无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响。
- 应用范围较广,因为LVS工作在4层,所以它几乎可对所有应用做负载均衡,包括http、数据库等。
4、LVS的缺点:
- 软件本身不支持正则表达式处理,不能做动静分离。相对来说,Nginx/HAProxy+Keepalived则具有明显的优势。
- 如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了。相对来说,Nginx/HAProxy+Keepalived就简单多了。
5、HAProxy的优点:
- HAProxy也是支持虚拟主机的。
- HAProxy支持8种负载均衡策略。
- HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定的url来检测后端服务器的状态。
- HAProxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
- HAProxy支持TCP协议的负载均衡转发。
6、HAProxy的缺点
- 不支持动静分离
四、Haproxy搭建 Web 群集
环境准备 Haproxy服务器 192.168.80.10
Nginx 服务器1 192.168.80.100
Nginx 服务器2 192.168.80.101
客户端 192.168.80.200
1、haproxy 服务器部署
(1)关闭防火墙,将安装Haproxy所需软件包传到/opt目录下
systemctl stop firewalld
setenforce 0
haproxy-1.5.19.tar.gz
(2)安装 Haproxy
编译安装
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-1.5.19.tar.gz
cd haproxy-1.5.19/
make TARGET=linux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
————参数说明————
TARGET=linux26 #内核版本,
#使用uname -r查看内核,如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628
或
yum安装
yum insttall -y haproxy
cd /etc/haproxy
ls
vim haproxy.cfg
————HAProxy 的配置文件共有5个域————
●global: 用于配置全局参数
●default:用于配置所有frontend和backend的默认属性
●frontend: 用于配置前端服务(即HAProxy自身提供的服务)实例
●listen: frontend + backend的组合配置,可以理解成更简洁的配置方法,front end域和backend域中所有的配置都可以配置在listen域下
(3)Haproxy服务器配置
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
cd /etc/haproxy/
vim haproxy.cfg
global
--4~5行--修改,配置日志记录,local0为日志设备,默认存放到系统日志
log 127.0.0.1 local0 info
log 127.0.0.1 local1 warning
chroot /var/lib/haproxy #修改haproxy工作目录至指定目录,一般需将此行注释掉
pidfile /var/run/haproxy.pid
maxconn 4000 #最大连接数,HAProxy 要求系统的 ulimit -n 参数大于 maxconn*2+18
user haproxy #以指定的用户名身份运行haproxy进程
group haproxy #以指定的组名运行haproxy,以免因权限问题带来风险
daemon #守护进程模式
spread-checks 2 #在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;默认为0,官方建议设置为2到5之间。
defaults(此字段中配置信息一般不用更改,只需注意个别细节)
mode http #模式为http(7层代理http,4层代理tcp)
log global #定义日志为global配置中的日志定义
option httplog #开启httplog,在日志中记录http请求、session信息等。http模式时开启httplog,tcp模式时开启tcplog
option dontlognull #不在日志中记录空连接
option http-keep-alive
option forwardfor except 127.0.0.0/8 #记录客户端IP在X-Forwarded-For头域中,haproxy将在发往后端的请求中加上"X-Forwarded-For"首部字段
option redispatch #当某后端down掉使得haproxy无法转发携带cookie的请求到该后端时,将其转发到别的后端上
retries 3 #定义连接后端服务器的失败重连次数,连接失败次数超过此值后会将对应后端服务器标记为不可用
timeout http-request 10s #默认http请求超时时间,此为等待客户端发送完整请求的最大时长,用于避免类DoS攻击。haproxy总是要求一次请求或响应全部发送完成后才会处理、转发
timeout queue 1m #默认客户端请求在队列中的最大时长
timeout connect 10s #默认haproxy和服务端建立连接的最大时长,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为10秒以尽快释放连接,新版本中替代clitimeout
timeout server 1m #默认和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是高并发时,新版本中替代srvtimeout
timeout http-keep-alive 10s #默认和客户端保持长连接的最大时长。优先级高于timeout http-request 也高于timeout client
timeout check 10s #和后端服务器成功建立连接后到最终完成检查的最大时长(不包括建立连接的时间,只是读取到检查结果的时长)
maxconn 3000 #最大连接数
frontend http-in #定义前端域
bind *:80 #设置监听地址和端口,指定为*或0.0.0.0时,将监听当前系统的所有IPv4地址
acl url_static path_beg -i /static /images/javascript /stylesheets #定义ACL,当uri以定义的路径开头时,ACL[url_static]为true
acl url_static path_end -i -i .jpg .gif .png .css .js #定义ACL,当uri以定义的路径结尾时,ACL[url_static]为true
use_backend static_backend if url_static #当[url_static]为true时,定向到后端域static_backend中
default_backend dynamic_backend #其他情况时,定向到后端域dynamic_backend中
backend static_backend #定义后端域static_backend
balance roundrobin #使用轮询算法
option httpchk GET /test.html #表示基于http协议来做健康状况检查,只有返回状态码为2xx或3xx的才认为是健康的,其余所有状态码都认为不健康。不设置该选项时,默认采用tcp做健康检查,只要能建立tcp就表示健康。
server inst1 192.168.92.12:80 check inter 2000 rise 2 fall 3
server inst2 192.168.92.13:80 check inter 2000 rise 2 fall 3 #inter 2000 rise 2 fall 3是默认值,可以省略
backend dynamic_backend #定义后端域dynamic_backend
balance roundrobin
option http-server-close
cookie HA_STIKY_dy insert indirect nocache
server app1 192.168.92.12:8080 cookie appser1 check
server app2 192.168.92.13:8080 cookie appser2 check
listen stats #定义监控页面
bind *:1080 #绑定端口1080
stats enable #启用统计报告监控
stats refresh 30s #每30秒更新监控数据
stats uri /stats #访问监控页面的uri
stats realm HAProxy\ Stats #监控页面的认证提示
stats auth admin:admin #监控页面的用户名和密码
--删除下面所有listen项--,添加
listen webcluster 0.0.0.0:80 #定义一个名为webcluster的应用
option httpchk GET /test.html #检查服务器的test.html文件
balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
server inst1 192.168.80.100:80 check inter 2000 fall 3 #定义在线节点
server inst2 192.168.80.101:80 check inter 2000 fall 3
---------------------参数说明---------------------------------------------------------------------------
balance roundrobin #负载均衡调度算法
#轮询算法:roundrobin;最小连接数算法:leastconn;来源访问调度算法:source,类似于nginx的ip_hash
check inter 2000 #表示haproxy服务器和节点之间的一个心跳频率
fall 3 #表示连续三次检测不到心跳频率则认为该节点失效
若节点配置后带有“backup”表示该节点只是个备份节点,只有主节点失效该节点才会上。不携带“backup”,表示为主节点,和其它主节点共同提供服务。
(4)添加haproxy 系统服务
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
service haproxy start 或 /etc/init.d/haproxy start
2、节点服务器部署
systemctl stop firewalld
setenforce 0
yum install -y pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
make && make install
--192.168.80.100---
echo "this is kgc web" > /usr/local/nginx/html/test.html
--192.168.80.101---
echo "this is benet web" > /usr/local/nginx/html/test.html
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx #启动nginx 服务
3、测试 Web群集
- 在客户端使用浏览器打开 http://192.168.80.10/test.html ,不断刷新浏览器测试负载均衡效果
五、日志定义
- 默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
service haproxy restart
- 需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
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停止处理这个信息。
systemctl restart rsyslog.service
tail -f /var/log/haproxy/haproxy-info.log #查看haproxy的访问请求日志信息
六、haproxy优化
maxconn | 最大连接数,根据应用实际情况进行调整,推荐使用10 240 |
daemon | 守护进程模式,Haproxy可以使用非守护进程模式启动,建议使用守护进程模式启动 |
nbprod | 负载均衡的并发进程数,建议与当前服务器CPU核数相等或为其2倍 |
retries | 重试次数,主要用于对集群节点的检查,如果节点多,且并发量大,设置为2次或3次 |
option http-server-close | 主动关闭http请求选项,建议在生产环境中使用此选项 |
timeout http-keep-alive | 长连接超时时间,设置长连接超时时间,可以设置为10s |
timeout http-request | http请求超时时间,建议将此时间设置为5~10s,增加http连接释放速度 |
timeout client | 客户端超时时间,如果访问量过大,节点响应慢,可以将此时间设置短一些,建议设置为1min左右 |