Haproxy 负载均衡群集
一、Web 集群调度器
1. 常用的 Web 集群调度器
目前常见的 Web 集群调度器分为 软件 和 硬件
硬件调度器:
- 一般使用比较多的是 F5 、Array ,还有一些国内的产品,例如梭子鱼 、绿盟等
软件调度器:
- 软件调度器通常使用一些开源的LVS、Haproxy、Nginx
- LVS是其中性能最好的,但是搭建相对复杂
- Nginx 的 upstream 模块支持群集功能,但对群集节点的健康检查功能不强,高并发性能没有 HAporxy 好
总结:
负载均衡的性能排名:
硬件负载均衡器(F5等)
> LVS(软件最好)
> Haproxy (其次)
> Nginx(弱于其它两种)
2. 常用的集群调度器的优缺点
1. Nginx
1.1 nginx 的优点
-
工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构。Nginx正则规则比HAProxy更为强大和灵活;
-
Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,LVS对网络稳定性依赖比较大,稳定要求相对更高;
-
Nginx安装和配置、测试比较简单、方便,有清晰的日志用于排查和管理,LVS的配置、测试就要花比较长的时间了;
-
可以承担高负载压力且稳定,一般能支撑几万次的并发量,负载度比LVS相对小些;
-
Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等;
-
Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器;
-
Nginx作为Web正向加速缓存越来越成熟了,速度比传统的Squid服务器更快,很多场景下都将其作反向代理加速器;
-
Nginx作为静态网页和图片服务器,这方面的性能非常优秀,同时第三方模块也很多
1.2 nginx 的缺点
- Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些;
- 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测;
- 不支持Session的直接保持,需要通过 ip_hash 和 cookie 的引导来解决。
2. LVS
2.1 LVS 的优点
- 抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生。因此负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低;
- LVS工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案;
- 无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响;
- 应用范围较广,因为LVS工作在4层,所以它几乎可对所有应用做负载均衡,包括http、数据库等。
2.2 LVS 的缺点
-
软件本身不支持正则表达式处理,不能做动静分离。相对来说,Nginx/HAProxy+Keepalived则具有明显的优势;
-
如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了。相对来说,Nginx/HAProxy+Keepalived就简单多了。
3. Haproxy
3.1 Haproxy 的优点
- Haproxy也是支持虚拟主机的;
- Haproxy支持8种负载均衡策略;
- Haproxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定的url来检测后端服务器的状态;
- Haproxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
- Haproxy支持TCP协议的负载均衡转发。
3.2 Haproxy 的缺点
- 单点故障:由于 Haproxy 是一个中心化的负载均衡器,如果它发生故障,所有的流量将中断。为了避免这种情况,可以使用多个 Haproxy 实例进行冗余和故障转移。
- 功能有限:相比其他负载均衡软件,Haproxy 的功能相对有限。它专注于提供负载均衡和代理功能,而其他软件可能提供更多的高级功能,如缓存、SSL 加速等。
- 配置复杂:配置 Haproxy 需要一定的技术知识和经验。它的配置文件需要以文本方式进行定义,其中包含许多参数和选项。对于不熟悉 Haproxy 的人来说,配置可能会变得复杂和容易出错。
- 性能限制:虽然 Haproxy 是高效的负载均衡器,但在处理高并发和大流量时,可能会受到性能上的限制。为了提高性能,可以考虑使用多个 Haproxy 实例,并进行适当的调优。
3. LVS、Nginx、Haproxy 的区别
- LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
- LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
- LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式;
- HAProxy功能强大,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。但整体性能低于4层模式的LVS负载均衡;
- Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是性能没有LVS和Haproxy好,对群集节点健康检查功能不强,只支持通过端口来检测,不支持通过URL来检测。
二、 Haproxy
1. Haproxy 的概念
HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。
HAProxy非常适用于并发大(并发达1w以上)web站点 ,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
2. Haproxy 的主要特性
● 可靠性和稳定性非常好,可以与硬件级F5负载均衡设备相媲美;
● 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数位20000个,最大处理能力可达10Git/s;
● 支持多大8种负载均衡算法,同时也支持会话保持;
● 支持虚拟主机功能,从而实现web负载均衡更加灵活;
● 支持连接拒绝、全透明代理等独特的功能;
● 拥有强大的ACL支持,用于访问控制;
● 其独特的弹性二叉树数据结构,使数据结构得到复杂性上升到了0(1),即数据的查寻速度不会随着数据条目的增加而速度有所下降;
● 支持客户端的keepalive功能,减少客户端与Haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成;
● 支持TCP急速,零复制功能,类似于MMAP机制;
● 支持响应池(response buffering);
● 支持RDP协议
● 基于源的粘性,类似Nginx的ip_bash功能,把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器;
● 更好统计数据接口,其web接口显示后端集群中各个服务器的接收、发送、拒绝、错误等数据的统计信息;
● 详细的健康状态监测,web接口中有关于对上游服务器的健康监测状态,并提供了一定的管理功能;
● 基于流量的健康评估机制;
● 基于HTTP认证;
● 基于命令行的管理接口;
● 日志分析器,可对日志进行分析
3. Haproxy 应用分析
LVS在企业应用中抗负载能力很强,但存在不足:
● LVS不支持正则处理,不能实现动静分离
● 对于大型网站,LVS的实施配置复杂,维护成本相对较高
Haproxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上:
● 适用于负载大的Web站点
● 运行在硬件上可支持数以万计的并发连接请求
4. Haproxy 的调度算法(负载均衡策略)
Haproxy常用的调度算法 | 调度依据 |
---|---|
roundrobin | 轮询,表示简单的轮询 |
static-rr | 加权轮询,表示根据权重轮询 |
leastconn | 最小连接,表示最少连接者先处理 |
source | 源地址哈希,表示根据请求源ip |
uri | URI哈希,表示根据请求的URI,做cdn需使用 |
url_param | URL参数哈希,表示根据请求的URL参数'balance url_param' requires an URL parameter name |
hdr(name) | 请求头哈希 |
rdp-cookie(name) | cookie的key哈希,表示根据cookie(name)来锁定并哈希每一次TCP请求 |
5. Haproxy 的会话保持
haproxy 的会话保持有三种方式:
- 源地址 hash
- 设置 cookie
- 会话粘性表 是tick-table
三、 Haproxy 部署实例
Haproxy服务器:192.168.30.105
Nginx 服务器1:192.168.30.107
Nginx 服务器2:192.168.30.109
客户端:192.168.30.115
3.1 haproxy 服务器部署
3.1.1 关闭防火墙
bash
systemctl stop firewalld
setenforce 0
3.1.2 内核配置(实验环境可有可无)
bash
vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
#启用端口重用,允许一个服务器进程在进行完一个连接后立即再次使用相同的连接端口。
net.ipv4.ip_local_port_range = 1024 65023
#本地端口范围。指定可用于本地TCP/UDP端口的端口号范围。
net.ipv4.tcp_max_syn_backlog = 10240
#TCP半连接请求的最大长度,如果超过这个值,对方就会收到RST响应。
net.ipv4.tcp_max_tw_buckets = 400000
#系统中同时保持TIME_WAIT状态的最大数量,一般设置为TCP建立连接次数的2倍。
net.ipv4.tcp_max_orphans = 60000
#系统中允许存在的最大orphan连接数(没有对应的socket文件),这个数字越大,系统支持的TCP连接数也越多。
net.ipv4.tcp_synack_retries = 3
#尝试发送SYN+ACK应答报文的最大次数。
net.core.somaxconn = 10000
#服务器套接字排队长度的最大值
3.1.3 安装 Haproxy
bash
//编译安装
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-2.2.11.tar.gz
cd haproxy-2.2.11/
make TARGET=linux31 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
安装依赖环境
编译安装HAproxy
3.1.4 Haproxy服务器配置
bash
useradd -M -s /sbin/nologin haproxy
mkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf
HAProxy 的配置文件共有 5 个域:
●global:用于配置全局参数 ●default:用于配置所有frontend和backend的默认属性 ●frontend:用于配置前端服务(即HAProxy自身提供的服务)实例 ●backend:用于配置后端服务(即HAProxy后面接的服务)实例组
●listen:frontend + backend的组合配置,可以理解成更简洁的配置方法,frontend域和backend域中所有的配置都可以配置在listen域下
bash
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
log 127.0.0.1 local1 warning
daemon #让haproxy以守护进程的方式工作于后台
option dontlognull #不在日志中记录空连接
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 20000 #最大连接数,"defaults"中的值不能超过"global"段中的定义
timeout queue 3s #默认客户端请求在队列中的最大时长
timeout connect 1s #默认haproxy和服务端建立连接的最大时长,新版本中替代contimeout,该参数向后兼容
frontend http-in
bind *:80
acl url_jsp path_end -i .jsp
use_backend tomcat_server if url_jsp
default_backend nginx_server
backend nginx_server
balance roundrobin
option httpchk GET /test.html
server ngx01 192.168.30.107:80 check inter 2000 fall 3 rise 2
server ngx02 192.168.30.109:80 check inter 2000 fall 3 rise 2
backend tomcat_server
balance roundrobin
option http-server-close
cookie HA_STICKY_dy insert indirect nocache
server tomcat01 192.168.30.107:8080 cookie tomcat01 check inter 2000 fall 3 rise 2
server tomcat02 192.168.30.109:8080 cookie tomcat02 check inter 2000 fall 3 rise 2
listen stats
bind *:1080
stats enable
stats refresh 30s
stats uri /stats
stats realm HAProxy\ Stats
stats auth admin:admin
3.1.5 添加为系统服务
添加执行的权限
chmod +x /etc/init.d/haproxy
将 /etc/init.d/haproxy 脚本添加到 chkconfig 管理工具中
bash
chkconfig --add /etc/init.d/haproxy
chkconfig --level 35 haproxy on
chkconfig --level 35 haproxy on
service haproxy start
开启haproxy服务
!!!注意!!!
HAProxy默认使用端口80来监听HTTP流量
3.2 节点服务器部署
bash
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 服务
---Nginx 服务器1:192.168.30.107---
---Nginx 服务器1:192.168.30.109---
3.3 测试 Web群集
在客户端使用浏览器打开 http://192.168.30.105 ,不断刷新浏览器测试负载均衡效果
四、日志定义优化
4.1 定义日志文件
默认haproxy的日志是输出到系统syslog中,查看起来不是非常方便。
为了更好的管理haproxy的日志,需要将haproxy的info及notice日志分别记录到不同的日志文件中
bash
vim /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log /dev/log local0 info
log /dev/log local0 notice
service haproxy restart
4.2 rsyslog 配置
需要修改rsyslog配置,为了便于管理。
将haproxy相关的配置独立定义到haproxy.conf
,并放到/etc/rsyslog.d/
下,rsyslog启动时会自动加载此目录下的所有配置文件。
bash
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停止处理这个信息
bash
mkdir /var/log/haproxy
systemctl restart rsyslog
tail -f /var/log/haproxy/haproxy-info.log
service haproxy restart
4.3 访问测试
客户端浏览器访问 http://192.168.30.105
bash
[root@localhost haproxy]#tail -f /var/log/haproxy/haproxy-info.log
Aug 25 03:42:13 haproxy haproxy: /etc/rc.d/init.d/haproxy: 第 26 行:[: =: 期待一元表达式
Aug 25 03:42:13 haproxy haproxy: Shutting down haproxy: [ 确定 ]
Aug 25 03:42:13 haproxy haproxy: /etc/rc.d/init.d/haproxy: 第 26 行:[: =: 期待一元表达式
Aug 25 03:42:13 haproxy haproxy: Starting haproxy: [WARNING] 236/034213 (6151) : parsing [/etc/haproxy/haproxy.cfg:22]: keyword 'redispatch' is deprecated in favor of 'option redispatch', and will not be supported by future versions.
Aug 25 03:42:13 haproxy haproxy: [ 确定 ]
Aug 25 03:47:30 haproxy haproxy[6152]: 192.168.30.105:63528 [25/Aug/2021:03:47:30.274] webcluster webcluster/inst1 0/0/0/1/1 304 179 - - ---- 2/2/0/1/0 0/0 "GET / HTTP/1.1"
Aug 25 03:47:30 haproxy haproxy[6152]: 192.168.30.105:63528 [25/Aug/2021:03:47:30.275] webcluster webcluster/inst2 173/0/1/0/174 304 179 - - ---- 2/2/0/1/0 0/0 "GET / HTTP/1.1"
Aug 25 03:47:30 haproxy haproxy[6152]: 192.168.30.105:63528 [25/Aug/2021:03:47:30.449] webcluster webcluster/inst1 165/0/1/0/166 304 179 - - ---- 2/2/0/1/0 0/0 "GET / HTTP/1.1"
Aug 25 03:47:30 haproxy haproxy[6152]: 192.168.30.105:63528 [25/Aug/2021:03:47:30.616] webcluster webcluster/inst2 158/0/0/0/158 304 179 - - ---- 2/2/0/1/0 0/0 "GET / HTTP/1.1"
总结
1、对比集群调度工具Haproxy、LVS和Nginx的区别
区别:
-
LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
-
LVS是可实现4层的IP负载均衡技术,但不支持正则处理,无法实现基于目录、URL的转发。而HAProxy 和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
-
LVS性能最好,但搭建相对复杂,成本较高。一般在100台左右web主机的集群中使用。
-
nginx做负载均衡调度器,配置简单,管理方便,但并发量不高,且没有主动健康检查。性能没有Haproxy好。可用于并发量不高的场景。
2、HTTP请求的两种方式
方式: GET、POST方式
区别: GET把参数包含在URL中,POST通过request body传递参数
- GET: 产生一个TCP数据包
- POST: 产生两个TCP数据包
3、haproxy配置文件重要参数说明:
全局配置: global 作用: 用于设定义全局参数,属于进程级的配置,通常与操作系统配置有关。
- maxconn 4096 #进程最大连接数,需考虑"ulimit -n"的限制,推荐使用10240
- daemon #守护进程模式。可以使用非守护进程模式,在生产环境中建议使用守护进程模式
- nbproc 1 #并发进程数,建议与当前服务器CPU核数相等或为其2倍
默认配置: defaults 作用: 配置默认参数,一般会被应用组件继承。
- retries 3 #检查节点服务器失败次数,连续3次失败,则认为节点不可用
- redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
- maxconn 2000 #最大连接数,"defaults"中 的值不能超过"global"段中的定义
- timeout http-request 10s #默认http请求超时时间。建议设置时间为5~10s,增加http连接释放的速度
- timeout http-keep-alive 10s #默认长连接超时时间
- timeout check 10s #设置心跳检查超时时间
应用组件配置: listen 作用: 一般配置应用模块参数
- option httpchk GET /index. html #检查服务器的index.html文件。发送http的GET请求检查index.html文件,返回2xx、3xx表示正常;返回4xx/5xx表示异常,则隔离该节点。
- balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
- server inst1 192.168.30.107:80 check inter 2000 rise 2 fall 3 #定义在线节点
- server inst2 192.168.30.109:80 check inter 2000 rise 2 fall 3 #定义在线节点
- #server inst2 192.168.30.110:80 check inter 2000 rise 2 fall 3 backup #定义备份节点
haproxy支持的最大并发量=并发进程数×每个进程最大连接数,即"nbproc的值 × maxconn的值"
4、日志消息的级别:
级号 | 消息 | 级别 | 说明 |
---|---|---|---|
0 | EMERG | 紧急 | 会导致主机系统不可用的情况 |
1 | ALERT | 警告 | 必须马上采取措施解决的问题 |
2 | CRIT | 严重 | 比较严重的情况 |
3 | ERR | 错误 | 运行出现错误 |
4 | WARNING | 提醒 | 可能会影响系统功能的事件 |
5 | NOTICE | 注意 | 不会影响系统但值得注意 |
6 | INFO | 信息 | 一般信息 |
7 | DEBUG | 调试 | 程序或系统调试信息等 |