Haproxy搭建http负载均衡
文章目录
- Haproxy搭建http负载均衡
- 一.haproxy简介:
- 二,haproxy的优点:
- 三、ha-proxy的特点
- 四、haproxy算法
- 五、haproxy配置文件
- Haproxy搭建http负载均衡
一.haproxy简介:
1、HAProxy是法国人Willy Tarreau开发的一款可应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器。由于其丰富强大的功能在国内备受推崇,是目
前主流的负载均衡器。Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备、虚拟主机、基于TCP和HTTP应用代理等功能。
其配置简单,而且拥有很好的对服务器节点的健康检查功能(相当于keepalived 健康检查),当其代理的后端服务器出现故障时,Haproxy会自动的将该故障服务
器摘除,当服务器的故障恢复后haproxy还会自动重新添加回服务器主机。
2、Haproxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能
处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,
这些程序通常扩展性较差。这就是为什么必须对其进行优化以使每个CPU时间片(Cycle)做更多的工作。
3、HAProxy提供高可用、负载均衡以及基于TCP(第四层)和HTTP(第七层)的应用的代理,支持虚拟主机,他是免费、快速并且可靠的一种解决方案。Haproxy特别
适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得
它可以很简单安全的整合进当前架构中,同时可以保护web服务器不被暴露到网络上。
4、Haproxy软件引入了frontend,backend的功能,frontend(acl规则匹配)可以根据任意HTTP请求头做规则匹配,然后把请求定向到相关的backend
(server pools等待前端把请求转过来的服务器组)。通过frontend和backend,可以很容易的实现Haproxy的7层负载均衡代理功能。
5、HAProxy是一种高效、可靠、免费的高可用及负载均衡解决方案,非常适合于高负载站点的七层数据请求。客户端通过HAProxy代理服务器获得站点页面,而代理
服务器收到客户请求后根据负载均衡的规则将请求数据转发给后端真实服务器。
同一客户端访问服务器,HAProxy保持会话的三种方案:
(1)HAProxy将客户端IP进行Hash计算并保存,由此确保相同IP来访问时被转发到同一台真实服务器上。
(2)HAProxy依靠真实服务器发送给客户端的cookie信息进行会话保持。
(3)HAProxy保存真实服务器的session及服务器标识,实现会话保持功能。
二,haproxy的优点:
1、免费开源,稳定性也是非常好。单HAProxy也跑的不错,稳定性可以与硬件级的F5相媲美。
2、根据官方文档,HAProxy可以跑满10Gbps,这个数值作为软件级负载均衡器也是相当惊人的。
3、HAProxy支持连接拒绝:因为维护一个连接的打开的开销是很低的,有时我们需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。
这个已经为一个陷于小型DDoS攻击的网站开发了,而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
4、HAProxy支持全透明代理(已具备硬件防火墙的典型特点),可以用客户端IP地址或者任何其它地址来连接后端服务器。这个特性仅在Linux 2.4/2.6内核打了tcp proxy
补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量的同时又不修改服务器的地址成为可能。
5、HAProxy现在多用于线上的MySQL集群环境,常用它作为MySQL(读)负载均衡。
6、自带强大的监控服务器状态的页面,实际环境中可以结合Nagios进行邮件或短报警。
三、ha-proxy的特点
ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。
支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
拥有一个功能出色的监控页面,实时了解系统的当前状况。
功能强大的ACL支持,给用户极大的方便。
四、haproxy算法
1、roundrobin
轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.
2、static-rr
基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
3、leastconn
新的连接请求被派发至具有最少连接数目的后端服务器.
4、source
将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器
五、haproxy配置文件
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
–4~5行–修改,定义haproxy日志输出设置和日志级别,local0为日志设备,默认存放到系统日志
log /dev/log local0 info #修改
log /dev/log local1 notice #修改
#log loghost local0 info
maxconn 4096 #最大连接数,需考虑ulimit -n限制,推荐使用10240
–8行–注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
#chroot /usr/share/haproxy
uid 99 #用户UID
gid 99 #用户GID
daemon #守护进程模式
nbproc 1 #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
defaults #配置默认参数,这些参数可以被用到Listen,frontend,backend组件
log global #引入global定义的日志格式
mode http #模式为http(7层代理http,4层代理tcp)
option httplog #日志类别为http日志格式
option dontlognull #不记录健康检查日志信息
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
#contimeout 5000 #设置连接超时时间,默认单位是毫秒
#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒
#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒
timeout http-request 10s #默认http请求超时时间
timeout queue 1m #默认队列超时时间
timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
timeout http-keep-alive 10s #默认持久连接超时时间
timeout check 10s #设置心跳检查超时时
–删除下面所有listen项–,添加
listen webcluster 0.0.0.0:80 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用
option httpchk GET /index.html #检查服务器的index.html文件
balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
server inst1 192.168.132.111:80 check inter 2000 fall 3 #定义在线节点
server inst2 192.168.132.100:80 check inter 2000 fall 3
Haproxy搭建http负载均衡
//环境
主机名称 | IP****地址 | 需要安装的应用 | 系统版本 |
client | 192.168.132.135 | 无 | redhat 8.2 |
LB | 192.168.132.138 | haproxy | redhat 8.2 |
RS1 | 192.168.132.111 | httpd | redhat 8.2 |
RS2 | 192.168.132.100 | httpd | redhat 8.2 |
//LB、RS1、RS2都关闭防火墙和selinux
[root@LB ~]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@LB ~] sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config //演示一遍关闭防火墙
//RS1和RS2部署httpd
[root@RS1 ~]# yum -y install httpd
[root@RS1 ~]# echo RS1 > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd
[root@RS2 ~]# yum -y install httpd
[root@RS2 ~]# echo RS2 > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now httpd
//修改LB的内核参数
[root@LB ~]# yum -y install haproxy
[root@LB ~]# vim /etc/sysctl.conf
[root@LB ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
//修改haproxy配置文件
[root@LB ~]# vim /etc/haproxy/haproxy.cfg
[root@LB ~]# cat /etc/haproxy/haproxy.cfg
//配置文件全部删掉改为如下
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend servers
backend servers
server web01 192.168.132.111:80
server web02 192.168.132.100:80
[root@LB ~]# systemctl restart haproxy
//客户端验证
[root@client ~]# curl http://192.168.132.135
RS1
[root@client ~]# curl http://192.168.132.135
[root@client ~]# curl http://192.168.132.135
RS1
[root@client ~]# curl http://192.168.132.135
RS2
使用WEB网页访问测式
把之前的也全部删掉
[root@LB ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 info
\#log loghost local0 info
maxconn 20480
\#chroot /usr/local/haproxy
pidfile /var/run/haproxy.pid
\#maxconn 4000
user haproxy
group haproxy
daemon
\#---------------------------------------------------------------------
\#common defaults that all the 'listen' and 'backend' sections will
\#use if not designated in their block
\#---------------------------------------------------------------------
defaults
mode http
log global
option dontlognull
option httpclose
option httplog
\#option forwardfor
option redispatch
balance roundrobin
timeout connect 10s
timeout client 10s
timeout server 10s
timeout check 10s
maxconn 60000
retries 3
\#--------------统计页面配置------------------
listen admin_stats
bind 0.0.0.0:8189
stats enable
mode http
log global
stats uri /haproxy_stats //访问网页后缀URL
stats realm Haproxy\ Statistics
stats auth admin:admin //用户名和密码
\#stats hide-version
stats admin if TRUE
stats refresh 30s
\#---------------web设置-----------------------
listen webcluster
bind 0.0.0.0:80
mode http
\#option httpchk GET /index.html
log global
maxconn 3000
balance roundrobin
cookie SESSION_COOKIE insert indirect nocache
server web01 192.168.132.111:80 check inter 2000 fall 5
server web02 192.168.132.100:80 check inter 2000 fall 5
//重启服务
[root@LB ~]# systemctl restart haproxy.service
[root@LB ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
//网页访问测试
http://192.168.132.138:8189/haproxy_stats
用户名和密码都为admin
128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]😗
//网页访问测试
http://192.168.132.138:8189/haproxy_stats
用户名和密码都为admin