haproxy负载均衡
一、HAProxy简介
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy优缺点
优点:
1.支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2.支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。能够补充Nginx的一些缺点。
3.HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
4.HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
5.HAProxy负载均衡策略非常多,比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)
6.免费开源,稳定性也是非常好,可以与LVS相媲美;
7.自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警;
缺点:
1.不支持POP/SMTP协议 SPDY协议;
2.不能做Web服务器,即不支持HTTP cache功能;
3.重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好;
4.多进程模式支持不够好;
4层负载均衡
将网络流量负载平衡到多个服务器的最简单方法是使用第4层(传输层)负载平衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量。用户访问负载均衡器,负载均衡器将用户的请求转发给后端服务器的Web后端组。无论选择哪个后端服务器,都将直接响应用户的请求。通常,Web后端中的所有服务器应该提供相同的内容 - 否则用户可能会收到不一致的内容。
7层负载均衡
7层负载均衡是更复杂的负载均衡。网络流量使用第7层(应用层)负载均衡,允许负载均衡器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许在同一域和端口下运行多个Web应用程序服务器。
Nginx和Haproxy对比
Haproxy特点
支持TCP与Http协议,工作在网络4层和7层
支持Session共享、Cookies引导
支持通过URL健康检测
支持8种负载均衡策略
支持心跳检测
Nginx特点
支持Http协议,工作在网络7层
支持通过端口健康检测
支持强大的正则匹配规则
支持WebSocket协议
支持Http Cache
说明:对于Http协议,Haproxy处理效率比Nginx高。所以,没有特殊要求的时候或者一般场景,建议使用Haproxy来做Http协议负载!但如果是Web,那么建议使用Nginx!
二、HAProxy工作原理
HAProxy有前端(frontend)和后端(backend),前端和后端都可以有多个,也可以只有一个listen块来同时实现前端和后端。
前端(frontend)区域可以根据HTTP请求的header信息来定义一些规则,然后将符合某规则的请求转发到相应后端(backend)进行处理。因此HAProxy可以实现动静分离(动静分离简单来说就是指将静态请求转发到对应的静态资源服务器,将动态请求转发到动态资源服务器),我们上篇说过的LVS就没有此功能。
三、实现HAProxy负载均衡
1.配置部署haproxy
在server1上安装haproxy
编辑haproxy的配置文件
yum install -y haproxy
vim /etc/haproxy/haproxy.cfg
\\\
stats uri /status #设置统计页面的uri为/status
frontend main *:80 #监听地址为80
default_backend app #默认的请求转发地址,名为app
backend app #定义一个名为app的后端部分,需要与frontend的配置项default_backend 值相一致,算法为轮询,将动态请求转到以下两台服务器的任意一台
server app1 172.25.33.2:80 check #定义的多个后端
server app2 172.25.33.3:80 check #定义的多个后端
\\\
server1启动haproxy服务,看到端口处于监听状态
systemctl restart haproxy.service
netstat -antlp
server2和server3安装http,在网页发布文件分别写入server2/server3,然后启动httpd服务
#server2
echo server2 > /var/www/html/index.html
systemctl restart httpd
#server3
echo server3 > /var/www/html/index.html
systemctl restart httpd
真机访问172.25.7.1进行测试,看到轮询请求