HAProxy
1、HAProxy简介
HAProxy 是一款基于 TCP(第四层)和 HTTP(第七层)应用的代理软件,它也可作为负载均衡器,而且完全免费。 借助 HAProxy,可以快速并且可靠地提供基于 TCP 和 HTTP 应用的代理解决方案。 HAProxy 最主要的优点是性能突出,它特别适合那些负载特大的 Web 站点,这些站点通常需要具备会话保持或七层处理功能。 HAProxy 完全可以支持数以万计的并发连接,而且它的运行模式可以让你简单而安全地将它整合到当前的架构中,同时可以保护你的 Web 服务器不暴露到网络上(通过防火墙 80 端口映射的方法)。 作为一款优秀的负载均衡软件,HAProxy 优点如下所示:
1>免费且开源,稳定性也非常好,其稳定性可以与硬件级的 F5 Big-IP 相媲美。
2>根据官方文档可知,HAProxy 可以跑满 10Gbps,对于软件级负载均衡器而言,这个数字是相当惊人的。
3>支持连接拒绝,因为维护一个连接保持打开状态的开销是很低的,有时我们需要防止蠕虫攻击,也就是通过限制它们的连接打开来防止它们的危害。 这个功能已经拯救了很多被 DDoS 攻击的小型站点,这也是其他负载均衡器所不具备的。
4>支持全透明代理(已具备硬件防火墙的典型特点),可以用客户端 IP 地址或任何其他地址来连接后端服务器,这个特性仅在 Linux 2.4/2.6 内核打了 cttproxy 补丁后才可以使用。 这个特性使得为某特殊服务器处理部分流量的同时又不修改服务器的地址成为可能。
5>HAProxy 现在多用于线上的 MySQL 集群环境,常用它作为 MySQL(读)负载均衡。
6>自带强大的监控服务器状态的页面,在实际环境中我们可以结合 Nagios 来实现邮件或短信报警,这也是很多人非常喜欢它的原因之一。
7>支持虚拟主机。
2、四种常用算法
1>roundrobin:轮询,轮流分配到后端服务器;
2>static-rr:根据后端服务器性能分配;
3>leastconn:最小连接者优先处理;
4>source:根据请求源 IP,与 Nginx 的 IP_Hash 类似。
3、HAProxy L4 负载均衡应用架构拓扑
HAProxy 软件的四层 tcp 代理应用非常优秀,配置非常简单方便,比 LVS 和 Nginx 要方便很多,因为不需要在 RS 端执行脚本即可实现应用代理。和商业版的 NS(Netscaler)、F5 等负载均衡硬件的使用方法和在架构中的位置几乎一样。
说明:由于 haproxy 采用的 NAT 模式,数据包来去都会经过 haproxy,因此,在流量特别大的情况下,其性能不如 LVS。
4、HAProxy L7 负载均衡应用架构拓扑
Haproxy 的最大优点在于其 7 层的根据 URL 请求头应用过滤的功能,在门户网站的高并发生产架构中,haproxy 软件一般用在 LVS 软件的下一层,或者像官方推荐的可以挂在硬件负载均衡 althon、NS、F5 下使用,其表现非常好。2009 年起 taobao 网的 cdn 业务就大面积使用了 haproxy作为 7 层 CACHE 应用代理。
通过修改 HAProxy 的配置文件,指定哪一台 Heartbeat 服务器作为主服务器,则另一台将自动成为备份服务器。然后在备份服务器上配置 Heartbeat 守护程序来监听来自主服务器的心跳。如果备份服务器在指定时间内未监听来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断的提供服务,从而达到资源服务高可用性的目的。
5、HAProxy负载均衡搭建
1>环境规划:centos7
client:192.168.100.111/24
haproxy:192.168.100.101/24
web1:192.168.100.10/24
web2:192.168.100.20/24
2>前期配置:部署各节点ip,各个节点关闭防火墙,禁用selinux,时间同步,保证机器干净
3>web-server节点配置:
web-server1节点: [root@web-server1 ~]# yum install httpd -y [root@web-server1 ~]# echo web-server1 > /var/www/html/index.html [root@web-server1 ~]# systemctl start httpd web-server2节点: [root@web-server2 ~]# yum install httpd -y [root@web-server2 ~]# echo web-server2 > /var/www/html/index.html [root@web-server2 ~]# systemctl start httpd
4>haproxy节点配置:
[root@haproxy ~]# haproxy -~]# /etc/haproxy/haproxy.cfg /etc/haproxy/~]# vim /etc/haproxy/. local2 /var/run//-.:-i \.html$ # 访问控制列表:html 靠正则表达式的地址区分 --server --/-A 192.168.100.10: weight cookie check inter rise fall -B 192.168.100.20: weight cookie check inter rise fall
[root@haproxy ~]# systemctl start haproxy //启动haproxy
5>client访问测试
[root@client ~]# elinks -dump http://192.168.100.101 web-server1 [root@client ~]# elinks -dump http://192.168.100.101 web-server2 [root@client ~]# elinks -dump http://192.168.100.101 web-server1 [root@client ~]# elinks -dump http://192.168.100.101 web-server2
6>浏览器访问haproxy web状态页面
6、实现HAProxy动静分离
1>环境规划:centos7
192.168.100.111 client
192.168.100.101 haproxy
192.168.100.10 web-server1
192.168.100.20 web-server2
192.168.100.30 php-server1
192.168.100.40 php-server2
2>前期配置:部署各节点ip,各个节点关闭防火墙,禁用selinux,时间同步,保证机器干净
3>web-server节点配置:
web-server1节点: [root@web-server1 ~]# yum install httpd -y [root@web-server1 ~]# echo web-server1 > /var/www/html/index.html [root@web-server1 ~]# systemctl start httpd web-server2节点: [root@web-server2 ~]# yum install httpd -y [root@web-server2 ~]# echo web-server2 > /var/www/html/index.html [root@web-server2 ~]# systemctl start httpd
4>php-server节点配置:
php-server1节点: [root@php-server1 ~]# yum install httpd php -y [root@php-server1 ~]# vim /var/www/html/test.php<?phpecho "Here is php-server1";?>[root@php-server1 ~]# systemctl start httpd php-server2节点: [root@php-server2 ~]# yum install httpd php -y [root@php-server2 ~]# vim /var/www/html/test.php<?phpecho "Here is php-server2";?>[root@php-server1 ~]# systemctl start httpd
5>haproxy节点配置:
~]# -y pcre-devel -devel -c++ groupadd -r -g -r -s /sbin/nologin - xf haproxy-...gz -C /usr/local/src//usr/local/src/haproxy-./ TARGET=linux-glibc PREFIX=/usr/local/ PREFIX=/usr/local/ /usr/local/src/haproxy-./examples/haproxy.init /etc/init.d/ +x /etc/init.d/ -s /usr/local/haproxy/sbin/haproxy /usr/sbin/ /etc//etc/haproxy/. local2 /var/run//-.:-i \.html$ # 访问控制列表:html 靠正则表达式的地址区分 ---server html # 如果访问html,就使用后端服务器html--server --/-A .: weight cookie check inter rise fall -B .: weight cookie check inter rise fall ..XX:(也可以配置域名解析) weight权重 cookie -/-C .: weight cookie check inter rise fall -D .: weight cookie check inter rise fall -f /etc/haproxy/haproxy.cfg //启动haproxy服务,-f指定配置文件路径
6>client访问测试
[root@client ~]# elinks --dump http://192.168.100.101 web-server1 [root@client ~]# elinks --dump http://192.168.100.101 web-server2 [root@client ~]# elinks --dump http://192.168.100.101/test.php Here is php-server1 [root@client ~]# elinks --dump http://192.168.100.101/test.php Here is php-server2
7>浏览器访问haproxy web状态页面
8>模仿后端服务器挂掉,再进行访问测试
使php-server1挂掉: [root@php-server1 ~]# systemctl stop httpd client访问测试: [root@client ~]# elinks --dump http://192.168.100.101/test.php Here is php-server2 [root@client ~]# elinks --dump http://192.168.100.101/test.php Here is php-server2
浏览器刷新haproxy web状态页面:
haproxy状态页明显发现php-server1挂掉,重新启动php-server1,又发现恢复正常