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 的缺点
2. LVS
2.1 LVS 的优点
2.2 LVS 的缺点
软件本身不支持正则表达式处理,不能做动静分离。相对来说,Nginx/HAProxy+Keepalived则具有明显的优势;
如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了。相对来说,Nginx/HAProxy+Keepalived就简单多了。
3. Haproxy
3.1 Haproxy 的优点
3.2 Haproxy 的缺点
3. LVS、Nginx、Haproxy 的区别
二、 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 的会话保持有三种方式:
三、 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 关闭防火墙
systemctl stop firewalld
setenforce 0
3.1.2 内核配置(实验环境可有可无)
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
//编译安装
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服务器配置
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域下
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 管理工具中
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 节点服务器部署
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日志分别记录到不同的日志文件中
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启动时会自动加载此目录下的所有配置文件。
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停止处理这个信息
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
[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 | 调试 | 程序或系统调试信息等 |